一、CubeMX的设置
1、新建工程,进行基本配置
2、配置定时器TIM2
1)定时器计算公式:(以下两条公式相同)
Tout = ((ARR+1) * PSC+1)) / Tclk
TimeOut = ((Prescaler + 1) * (Period + 1)) / TimeClockFren
Tout = TimeOut:定时器溢出时间(单位为us),多少触发(进入)一次TIM中断。
PSC = Prescaler:预分频系数(预分频器值)。
ARR = Period:自动重装载值,TIM计数当超过这个值,则清0重新计数。
Tclk = TimeClockFren:定时器的输入时钟频率(单位MHZ),当前使用的TIM2系统时钟频率。
eg:
Tout = (71+1)*(999+1)/72 = 1000us
= 1 ms = 0.001 s
因此,定时器则0.001s触发一次中断。
2)配置分频系数为72-1,向上计数模式,计数周期为1000-1,使能自动重载模式。
3)开启定时器TIM2的中断
二、代码调试
在CubeMX中生成工程后,打开main.c添加中断响应之后所需的一些代码
main.c
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2); //以中断方式开启定时器2
/* USER CODE END 2 */
上述添加的函数表示启动相应的定时器,“h”表示HAL库,“tim2”表示定时器2。
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//定时器回调函数
//当到达指定定时值时进入中断执行中断任务
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static int i = 0; //定义一个静态变量i
if(htim == &htim2)
{
//执行对应代码
if(++i == 1000) //1s
{
i = 0;
//对led灯或者其他外设进行操作
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0);//对GPIO口的电平进行反转(低-高,高—低)
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_2);
}
}
}
/* USER CODE END 0 */
上述以3个LED灯闪烁作为例子,可自行在CubeMX中设置
该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。
在函数内部定义了一个静态变量:i ,当它等于1000的时候,才会执行if里面的代码。也就是说需要发生1000次中断,才会让LED的状态翻转。
前面根据公式计算出,一次定时中断的时间是0.001秒,所以1000次中断的时间是0.001*1000=1秒。也就是说每隔1秒,LED的状态翻转一次。
三、烧录结果
修改后,保存,编译、下载,重新上电。可以看到LED灯差不多每隔1秒翻转一次