在上文我们使用到了HAL库的自带的延时函数,HAL_Delay();我们来看一下函数的原型
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while ((HAL_GetTick() - tickstart) < wait)
{
}
}
我们可以看到实际上就是通过软件去延时,导致cpu死等,很浪费cpu的资源。这里我们介绍新知识定时器通过人为的去设置时间,来执行相关程序。比如每五秒翻转LED的电平
目录
一定时器
1.1概述
1.2 分类
二基本定时器
2.1 基本定时器:
2.2 主要特性
2.3定时器的计算模式及溢出条件
2.4 定时器溢出时间计算方式
三stm32cubemx配置
四代码分析
一定时器
1.1概述
:通过使用精准的时基,通过硬件的方式,实现定时功能
1.2 分类
这里我们介绍的是常规定时器,那这些又有什么区别呢?
我们可以看到 基本定时器只有一些最基本的定时功能,而通用定时器则比基本定时器高级,可用于输入捕获(捕获红外信号等)、输出比较,也具有基本定时器的功能。
而高级定时器则在通用定时器的基础上还具备其他的功能。
二基本定时器
2.1 基本定时器:
TIM6/TIM7
2.2 主要特性
:16位递增计数器(计数值:0~65535)
16位预分频器(分频系数:1~65536)
可用于触发DAC
在更新事件(计数器溢出)时,会产生中断/DMA请求
这里我们看到中断联想到我们上文说的,中断会有一个触发条件,这里触发条件就是计数器溢出(就是计数器的值到了我们设定的阈值即定时的时间到了),然后在中断相关函数里面去编写触发中断时,需要执行的代码。
2.3定时器的计算模式及溢出条件
这里就是定时器的不同计数模式,这里简单了解就好
2.4 定时器溢出时间计算方式
这里我们详细介绍一下
Ft是定时器的时钟源频率:是来自未分频的时钟源
这里我们先打开stm32参考手册
可以看到TIM6/TIM7是在APB2总线上的。这里我们打开STM32CUBEMX,以上节串口的复制,重新命名,打开配置时钟的地方
可以看到时钟源是72mHZ
PSC:设置预分频系数,将预分频时钟(CK_PSC)进行1~65536之间任意值分频,得到计数时钟
ARR:为计数器设置计数边界或重载值。比如计数器递增计数时,记到多少发生溢出;递减计数时,从多少开始往下计数
这里我们再看一下公式
我们这里使用定时器6,实现每1s翻转LED0的电平
即每1s定时器更新中断,再中断处理函数里面去翻转LED0的电平
即Tout=1s 这里我们一般先设置PSC为7200-1 得到arr得值
这里设置PSC为7199 即(PSC+1 )=Ft 所以ARR+1为多少 Tout就是多少毫秒
1=(ARR+1)*(7199+1)/72000000
所以我们这里设置ARR为9999
三stm32cubemx配置
然后点击生成就好
四代码分析
这里需要注意,在cubemx配置好后,我们要打开定时器得中断即
HAL_TIM_Base_Start_IT(&htim6);/* 使能定时器x及其更新中断 */
然后我们写中断处理函数
同样中断处理函数原型是弱定义,这里我们重新定义,并在函数里面先判断是否是TIM6 如果是则翻转电平
逻辑就是每过1s进入定时器6的中断处理函数,翻转LED0的电平