赞
踩
生活中很多应用都有用到定时器功能、计时功能等。
定时器中断可以大大降低CPU的执行负担,和前面学习的中断类似,当定时器计数触发了中断才会执行。
实验目的:
学习使用定时器中断功能,实现定时控制LED翻转的功能。
本实验以KEY按键实验的工程作为模板,在上面添加定时器相关配置即可。
第一步:前面的LED、BEEP、KEY、RCC和SWD的相关配置都不用修改,保持默认的配置即可。
第二步:配置定时器相关功能。
按照下图标号步骤进行设置就可以。
主要是设置⑥处的相关参数,这些参数是需要通过公式计算出来最终确定的。本实验需要用到定时器中断功能,定时时间是500ms,PSC就定为7199,代入公式计算出ARR的值是4999。计数模式选择向上计数发方式,其它的参数没有用到,保持默认即可。
定时器溢出时间计算公式如下:
第三步:配置NVIC。
勾选使能中断即可。
第四步:设置优先级分组及优先级。
设置分组为2,本实验没有用到其它的中断,所以优先级可以随便设置,这里抢占优先级为2,响应优先级是2。
定时器相关功能配置完成后,点击生成代码按钮就可以生成工程代码了。
可以看到代码工程生成多了一个tim.c文件和TIM3初始化函数,如下图所示:
进去tim.c文件可以看到里面主要存放定时器的初始化相关代码,如下图所示:
在stm32f1xx_it.h文件里面多了一个定时器中断服务程序,当触发定时器中断后,就会调用HAL库提供的HAL_TIM_IRQHandler公共中断处理函数。如下图所示:
进去该函数可以看到是定时器的中断处理,比如捕获通道、捕获事件、更新事件等,如下图所示:
如果工程无法跳转到该函数的定义处,可以按键盘快捷键ctrl+h进行搜索函数名。
本实验主要用到定时更新中断功能,定时时间到就触发中断,所以前面的那些和通道相关的就可以忽略不用管。
需要用到的回调函数是HAL_TIM_PeriodElapsedCallback函数,其它不用关心。
到此,就可以在工程里面添加相关代码实现功能了。
进去HAL_TIM_PeriodElapsedCallback该函数可以发现该函数是弱定义的,如下图所示:
说明需要用户重新定义才行。
那么就可以将它拷贝到stm32f1xx_it.h文件里面进行功能代码的编写,如下图所示:
代码片示例如下:
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3)
{
HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PIN);
}
}
/* USER CODE END 1 */
若时间到了设置的500ms后触发中断,让LED翻转。
这里用到了LED相关的代码,则需要把LED的头文件引入到该文件中才行。如下图所示:
mian函数里面已经有了定时器初始化函数,while循环里面不用添加任何代码,如下图所示:
编译下载代码后,可以看到开发板的LED灯每隔500ms间隔闪烁一次。
定时器中断还是相对比较简单理解的,主要是应用到了定时计时器,计数到ARR的值就溢出。触发中断后就可以让LED灯翻转。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。