TIM定时器例程
为了精准的定时,有时候我们需要用到硬件定时器,这一节我们讲一下如何初步的使用定时器,更加高级的功能,大家可以在网上自行查阅学习~
1. 工程创建
这一节为了简单入门,我们将使用功能简单的TIM11进行学习。这里就不重复在说工程创建了,仓库已经给好模板了,拿去参考就行。
- 我们设定了TIM11的分频为100, 所以Prescaler为100-1=99.
- 设定计数为UP向上计数, 计数1000, 即counter period为1000-1=999.
- 所以最终的一次计数频率为100Mhz/100=1Mhz, 然后需要计数1000次才发生中断,即一次中断为1000KHz/1000=1KHz, 即1ms一次中断.
2. 改代码
我们想要实现TIM11定时,然后定时翻转LED灯,如何实现呢?
首先在初始化时,启用tim11.
//Start the tim base HAL_TIM_Base_Start_IT(&htim11);
在中断中, 即在文件
stm32f4xx_it.c
中TIM11的中断回调函数中加入一个变量计数.uint16_t timecount=0; void TIM1_TRG_COM_TIM11_IRQHandler(void) { /* USER CODE BEGIN TIM1_TRG_COM_TIM11_IRQn 0 */ timecount += 1; /* USER CODE END TIM1_TRG_COM_TIM11_IRQn 0 */ HAL_TIM_IRQHandler(&htim11); /* USER CODE BEGIN TIM1_TRG_COM_TIM11_IRQn 1 */ /* USER CODE END TIM1_TRG_COM_TIM11_IRQn 1 */ }
在main中, while(1)中查询timecount, 然后进行LED的翻转, 即可实现LED的定时翻转啦~
if(timecount >= 500) { timecount = 0; printf("500ms time up\r\n"); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); }
3. 课后作业
- 完成教学的内容;
- 如何实现呼吸灯?即亮度一直在变化.