首页 > 其他分享 >STM32F407如何点亮一个呼吸灯(库函数)

STM32F407如何点亮一个呼吸灯(库函数)

时间:2024-07-03 20:20:36浏览次数:1  
标签:定时器 TIM14 点亮 TIM InitStructure GPIO STM32F407 GPIOF 库函数

/**
   ******************************************************************************
   * @file    main.c 
   * @author  
   * @version 
   * @date    2024/07/03
   * @brief   实现利用基本定时器TIM14实现定时10ms,每隔10ms从灭到亮逐渐变亮,再隔10ms从
   			  亮到灭逐渐变暗,实现控制LED的呼吸灯设置

   ******************************************************************************
**/

#include "stm32f4xx.h"  //必须包含

//LED的初始化
void  LED_Config()
{
	//1.定义GPIO外设的结构体变量
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	//2.打开GPIOF端口的时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	
	//3.配置PF9引脚为输出模式
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
	
	//4.对GPIOF端口进行初始化
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOF,GPIO_Pin_9);//LED不亮
}

//BEEP的初始化
void  BEEP_Config()
{
	//1.定义GPIO外设的结构体变量
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	//2.打开GPIOF端口的时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	
	//3.配置PF9引脚为输出模式
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
	
	//4.对GPIOF端口进行初始化
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOF,GPIO_Pin_8);//BEEP默认不响
}

//延时微秒 注意:Systick是24bit的递减计数器  约等于798915us,所以参数不可以超过这个值
void delay_us(u32 nus)
{
	SysTick->CTRL = 0; 						 // 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器
	SysTick->LOAD = (nus * 21) - 1;// 指的是计数次数,定时时间 = 计数次数 * 计数周期
	SysTick->VAL  = 0; 						 // 清除当前数值寄存器的值
	SysTick->CTRL = 1; 						 // 开启了定时器,并且定时器的时钟源选择了21MHZ--> 计数周期 = 1/21us
	while ((SysTick->CTRL & 0x00010000)==0);//等待延时时间到达
	SysTick->CTRL = 0; 						 // 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器

}

//延时毫秒 注意:Systick是24bit的递减计数器  约等于798ms,所以参数不可以超过这个值
void delay_ms(u32 nms)
{
	SysTick->CTRL = 0; 						 			// 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器
	SysTick->LOAD = (nms * 21*1000) - 1;// 指的是计数次数,定时时间 = 计数次数 * 计数周期
	SysTick->VAL  = 0; 						 			// 清除当前数值寄存器的值
	SysTick->CTRL = 1; 						 			// 开启了定时器,并且定时器的时钟源选择了21MHZ--> 计数周期 = 1/21us
	while ((SysTick->CTRL & 0x00010000)==0);//等待延时时间到达
	SysTick->CTRL = 0; 						 			// 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器
}

//延时秒
void delay_s(u32 ns)
{
	while(ns--)
	{
		delay_ms(500);
		delay_ms(500);
	}
}

//TIM14的初始化
void  TIM14_Config()
{
	//1.定义GPIO、TIM时基、TIM输出结构体变量
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	//2.打开TIM14+GPIOF的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,  ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,  ENABLE);
	
	//3.对GPIO结构体变量的引脚PF9进行赋值(LED灯)
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
	
	//4.对GPIOF端口进行初始化
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	//5.设置GPIOF为中断源
	GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);
	
	//6.定义结构体变量并对结构体变量的成员进行赋值,1s可以生成100个脉冲
	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;				//预分频值,TIM14的时钟是84MHZ,所以可以降低频率 100us计数一次
	TIM_TimeBaseStructure.TIM_Period = 100-1;	 				//计数次数,这个值会写入自动重载寄存器 100us * 100 = 10ms    
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数模式,基本定时器TIM6和TIM7只允许递增计数

	//7.对定时器结构体变量进行赋值
	TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;				//PWM模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//输出状态使能
	TIM_OCInitStructure.TIM_Pulse = 95;								//占空比
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;		//低电平有效
	
	//7.对定时器进行初始化
	TIM_OC1Init(TIM14, &TIM_OCInitStructure);//设置利用通道1输出,复用功能PF9綁定通道一
	
	//8.对TIM4定时器设置使能预装载寄存器
	TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
	
	//9.对TIM4定时器设置允许自动重装载寄存器
	TIM_ARRPreloadConfig(TIM14, ENABLE);

	//10.打开定时器TIM14
	TIM_Cmd(TIM14, ENABLE);
}

int main()
{
	
	//1.硬件的初始化
	TIM14_Config();
	
	while(1)
	{
		//LED越来越亮
		for(int i = 0; i<100;i++)
		{
			TIM14->CCR1 = i;
			delay_ms(15);
		}
		
		//LED越来越暗
		for(int i = 100; i>=0;i--)
		{
			TIM14->CCR1 = i;
			delay_ms(15);
		}
		
	}
}

标签:定时器,TIM14,点亮,TIM,InitStructure,GPIO,STM32F407,GPIOF,库函数
From: https://www.cnblogs.com/wh217/p/18282447

相关文章

  • ESP32-点亮TFT2.4电阻触摸屏 学习笔记
    1、下载好arduinoIDE开发软件IDE(IntegratedDevelopmentEnvironment),译为集成开发环境,相当于编辑器编译器加连接器+其他。ArduinoIDE就是Arduino团队提供的一款专门为Arduino设计的编程软件,使用它,我们便能将程序从代码上传至Arduino主板。去官网下载:Software|Arduino,也......
  • 7月1日 STM32F407VET6对Flash的入门学习(记录)
    1、Flash的使用之前必须对Flash进行擦除,不能直接写入进行覆盖。其原因是Flash的工作原理存储二进制的0和1,且只能实现从1到0的变化。这就意味着但Flash中已经烧入由0和1组成的文件后,无法直接再次烧入其他二进制文件。必须使用特定的函数将Flash中已存在的0和1全部转换成1,这个就......
  • TMS320F28377D学习日志:day2点亮LED
    文章目录一、28377开发板的led电路分析二、28377的GPIO相关寄存器介绍2.1前言2.2GPySET寄存器介绍2.3GPyCLEAR寄存器介绍三、程序介绍3.1引入库3.2配置GPIO引脚功能3.2.1GPIO_SetupPinMux函数3.2.1GPIO_SetupPinOptions函数3.3系统初始化3.4循环程序参考文......
  • 【代码】--库函数学习 ftp通信 相关
    1. FTP介绍 (1)主动模式(PORT): 服务器主动去连接客户端的数据端口 (2)被动模式(PASV): 客户端主动去连接服务器的数据端口ftp客户端通信流程(编程流程)如下:1.客户端用账号、密码进行登录。2.提交主动模式还是被动模式。3.如果是被动模式,需要去连接服务器开放的数据......
  • #C:比如有如下两个字符串:“hello“、“helhehe“不能使用库函数完成字符串的比较
    #include<stdio.h>#include<string.h>voidtest00()//比如有如下两个字符串:"hello"、"helhehe"不能使用库函数完成字符串的比较{ //时刻需要注意变量i的值  charbuf1[128]="";   printf("请输入第一个字符串buf1:");   //scanf("%s",buf1);......
  • 好用的库函数,qsort函数大详解(干货满满!)(进阶)
    前言:  小编在上一篇文章说了这一篇将要写qsort函数的模拟实现,那么废话不多说,现在开始进入今天的代码之旅喽!目录:1.qsort函数的模拟实现的逻辑和思路2.qsort函数模拟实现的代码实现3.代码展示1.qsort函数的模拟实现的逻辑和思路  读者朋友们是否还记得小编之前说过......
  • 好用的库函数,qsort函数大详解(干货满满!)(初阶)
    前言;  我一直在思考今天要写什么类型的文章,看到之前写的冒泡排序的写法,不过冒牌排序的算法只能针对于整型,我们如果想要排序浮点型,字符型的数据呢?这个时候我突然想到了比冒泡排序还好用的一个库函数,就是我们今天的主角——qsort函数,下面不多废话,直接进入正文: 目录:1.qsor......
  • 一篇文章教你如何解决vs编译器中,库函数scanf的正常使用!!!
    前言:这将是我写的第二篇博文了,以后我将会坚持每天花固定时间来写博客,希望我当我写了一定数量的文章之后,我自己简单的就能够写出质量优秀文章来,加油!!!一、scanf函数无法正常使用的原因1.错误实例在vs中如果想直接实现并使用scanf函数,很抱歉直接使用,用不了,因为编译器压根就......
  • QT210开发板学习(2): 通过DNW点亮LED灯
    查找开发板原理图,可知可用的LED有4个,引脚为EINT0/1/2/3,对应的IO口则是GPH0_0/1/2/3,寄存器有GPH0CON,GPH0DAT,GPH0PUD,GPH0DRVGPH0CON用来设置IO模式(地址为0xE0200C00),GPH0DAT是电平状态(地址为0xE0200C04)我们需要设置为Output模式,并且将状态设置为高电平新......
  • MDK5.14仿真STM32F407时无法查看外设寄存器的问题
    这几天用keilmdk5.14新建工程进行仿真时,进入Debug环境发现SystemViewer菜单显示空白,Peripherals菜单没有外设寄存器。如图1和图2所示。网上查了一下资料发现大多都是解释的STM32F103系列在MDK内的修改方式,但是我用的是STM32F407ZET6,就依葫芦画瓢,照着出一个修改的说明。  ......