前言
代码中想用个延时,有两种方式:一种是用软件延时,即在代码中加一个延时函数,但同时有一个缺点:不精确且占用CPU资源。还有一种就是使用定时器,它使用的是精准的时基,通过硬件的方式,实现定时功能。此次介绍的就是如何使用STM32的定时器功能实现延时。话不多说,加快上车吧。
定时器的分类
在STM32中定时器分三类:
- 基本定时器(TIM6~TIM7)
- 通用定时器(TIM2~TIM5)
- 高级定时器(TIM1和TIM8)
主要功能分类如下图:
以STM32F103C8T6单片机为例,它的定时器资源包括如下:
通过对照上面分类可以发现:它有1个高级定时器和3个通用定时器。因为接下来将使用通用定时器,所以作一下通用定时器的介绍,加深理论上的理解:
定时器的工作原理
定时器核心就是计数器(如下图所示)。
定时器的计数模式
定时器的时钟源
关于这部分感兴趣可以自己对着图去理解,笔者在此不做解释。剪不断,理还乱的感觉。(附图)
定时器溢出时间计算公式:
对于我们去配定时器的使用,这一步才是关键。因为我们配好相关参数值,其他交给硬件去实现就行了。
例如,要定时500ms,则:PSC=7199,ARR=4999,Tclk=72M。
工程配置
功能实现:使用定时器TIM2中断方法,每500ms翻转一次LED1灯状态。
- RCC配置
- LED1灯配置
查看电路原理图,如图:
在STM32CubeMX配置如下:
- 时钟数配置
- TIM2配置
代码实现
在STM32CubeMX中完成配置,生成代码后,进入keil5中。在main.c中重写更新中断回调函数。代码如下:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8); //调用翻转函数
}
在主函数中启动定时器:
在main.c中,定时器初始化命令之后加入下列代码:
HAL_TIM_Base_Start_IT(&htim2);
编译、下载进入开发板。观察现象。