文章目录
a.定时器和delay函数
delay函数和定时器可以实现一样的效果,但是这种方式,相当于让CPU一直在做无用功,还不能做别的事情。通过定时器的方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务
1.STM32CUBEMX_定时器控制LED闪烁
1.1 选择芯片,新建项目
1.2配置RCC(打开外部时钟),SYS(选择调试接口)
1.3配置GPIO
1.4配置时钟
1.5配置定时器
这里我们使用定时器2来实现定时的功能。分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断
1.6配置中断
开启定时器2的中断
1.7保存项目,生成工程文件
1.8修改工程
在main.c文件中添加如下代码
代码1:
HAL_TIM_Base_Start_IT(&htim2);
该函数表示启动相应的定时器,“h”表示HAL库,“tim2”表示定时器2。所以这行代码的意思就是启动定时器2
代码2:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
if(htim->Instance == TIM2)
{
if(++time_cnt >= 400)
{
time_cnt =0;
HAL_GPIO_TogglePin(D1_GPIO_Port,D1_Pin);
}
}
}
该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。在函数内部定义了一个静态变量:time_cnt。当它大于等于400的时候,才会执行if里面的代码。也就是说需要发生400次中断,才会让LED的状态翻转。前面已经算过了,一次定时中断的时间是0.005秒,所以100次中断的时间是0.005*400=2秒。也就是说每隔2秒,LED的状态翻转一次。
1.9编译后烧录测试
效果展示:
2.M32CUBEMX_定时器控制串口发送
2.1 选择芯片,新建项目
2.2配置RCC(打开外部时钟),SYS(选择调试接口)
步骤同上1.2处
2.3配置串口
2.4配置时钟
步骤同上1.4处
2.5配置定时器
步骤同上1.5处
2.6配置中断
步骤同上1.6处
2.7保存项目,生成工程文件
2.8修改工程
在main.c文件中添加如下代码
代码1:
HAL_TIM_Base_Start_IT(&htim2);
该函数表示启动相应的定时器,“h”表示HAL库,“tim2”表示定时器2。所以这行代码的意思就是启动定时器2
代码2:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
if(htim->Instance == TIM2)
{
if(++time_cnt >= 1000)
{
time_cnt =0;
HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);
}
}
}
该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。在函数内部定义了一个静态变量:time_cnt。当它大于等于1000的时候,才会执行if里面的代码。也就是说需要发生400次中断,才会让LED的状态翻转。前面已经算过了,一次定时中断的时间是0.005秒,所以100次中断的时间是0.005*1000=5秒。也就是说每隔5秒,串口发送一次"hello windows!"
2.9编译后烧录测试
效果展示:
3.总结
相对于延迟函数而言 ,掌握了定时器这种更为高效和精确的延时控制方式,可以让写得代码更有实际意义
4.参考
http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/