通过定时器中断实现开发板上的LED闪烁:亮一秒灭一秒。
开发板有14个定时器,定时器的拓扑图如下:
定时器分布在APB1和APB2上,定时器的作用有所不同。选择TIM2作为本文的使用定时器。在CubeMx中配置器时钟为21Mhz。
APB1 peripheral clocks主要服务于低速外设,如一些基本的I/O接口和某些传感器等。这些外设通常需要较低的时钟频率和功耗,以满足其工作需求。因此,APB1的时钟频率和性能相对较低。
另一方面,APB2 timer clocks则服务于高速外设,如某些需要高速数据传输或高精度计时的设备。这些外设通常需要更高的时钟频率和性能,以满足其高速、高精度的要求。因此,APB2的时钟频率和性能通常会比APB1更高。
配置定时器TIM2,控制灯1秒闪烁,在CubeMx中配置:
TIM的时钟为21Mhz,以上配置可得到定时器溢出的时间为1秒,配置启用中断使能:
生成代码后可在工程的代码结构中生成tim.c文件,tim.c文件中有初始化函数,在STM32F4XX.it.c文件中有中断函数。
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
/* USER CODE END TIM2_IRQn 1 */
}
在HAL_TIM_IRQHandler函数中可以找到HAL_TIM_PeriodElapsedCallback(htim); 该函数提示未定义,类似虚函数,用户代码中可以实现该函数,实现LED的IO口翻转。代码如下“
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
LED0_TOGGLE();
}
}
PS:LED0_TOGGLE();在上一篇博文中有定义。
下载程序到板子后,看LED的闪烁,并用示波器查看LED的IO的波形,经验证输出的波形符合预期。