STM32中断&定时器-STM32电控学习笔记07
day7:2022/9/25
【中断回调函数实现LED闪烁】
上一篇帖子我们大致学习了中断和定时器的概念,这一篇就来尝试一下利用中断回调函数来实现LED灯的闪烁。
首先我们按照手册47-53页指示配置好STM32CubeMx(可以之间打开先前点灯时的配置文件然后直接修改,就不用重复前面一大堆配置了)通过配置 TIM1 的分频值和重载值,++使得 TIM1的中断以 500ms 的周期被触发,因此中断回调函数也是以500ms为周期被调用++。
从流程图上看,我们使用STM32CubeMx生成的配置文件已经把前面几步搞定了,是不是很tnd方便(CubeMx yyds),我们前面配置的500ms,即定时器计算每过500ms就执行一次中断函数里的内容,执行完后就继续计时。
接下来打开我们的main.c文件,为了使定时器开始工作,需要调用 HAL 库提供的函数。在int main()函数内输入代码:HAL_TIM_Base_Start_IT(&htim1);
接着,我们要开始写中断回调函数,但是这个函数我们不在int main()函数里写,而是写在其前面
void LED_toggle(void);
/*
此次我们定义一个函数,该函数的作用是将LED灯引脚的电平翻转
*/
void LED_toggle(void)
{
//然后在定义的函数下写上需要的翻转电平代码
HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_10);
HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_11);
HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_12);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/*
htim:定时器指针
*/
if(htim == &htim1)
{
/*即每过我们设置的500ms时间,系统自动执行一次中断函数,调用LED翻转电平函数,如果你想在中断期间做任何其他事也可以在这个函数里写。
*/
LED_toggle();
}
}
将代码烧录进入单片机可以发现,LED灯以500ms为半周期闪烁,这样我们就实现中断回调函数闪烁LED灯的功能了,中断在我们平时调试机器人时会用到,但是并不会用的很深,只有到后期对电机要求精准把控时才需要多一些操作,因此我们会用就行,够用就行。
【定时器配置】
通过手册我们可以很容易的配置一个500ms为周期的定时器,那么如果我们想要改变定时器时间,例如需要100ms、5000ms、2333ms该怎么配置呢,那么就要在CubeMx中修改分频值和重载值(这俩玩意要搞懂还是有点磨人的,有兴趣的可以去研究研究,但是我没兴趣doge,会用就行)只要利用接下来这个公式:
Tout = ((arr + 1)*(psc + 1))/ Tclk ;
即:定时器溢出时间 = ((重装载值 + 1)*(分频系数 + 1))/ 频率
高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线
通用定时器timer2timer5,通用定时器timer12、timer14以及基本定时器timer6,timer7的时钟来源是APB1总线
由于我们配置的是TIM1的定时器,而TIM1是挂载在 APB2 总线上的,因此我们的芯片配置时钟工作频率Tclk = 168Mhz;
对于APB2的总线,我们知道其时钟频率是168MHZ,因此我们的预分频值一般设置为16799,然后套公式计算出重装载值即可,例如我们要配置一个1000ms 的定时器,那么频率就应该为1HZ,那么就有公式
168000000 / (16799 + 1) * (arr + 1) = 1;
计算出重装载值为:9999
借此公式我们即可配置我们需要的定时器。