本节是介绍如何使用CubeMX配置STM32的定时器TIM,并通过定时器实现一个固定时间闪烁的LED灯。
开发环境:CubeMX+MDK5.27
芯片型号:STM32F103ZET6
时间:2020/07/13
简介:在STM32F1系列单片机中,除了互联型的产品,其余的都有8个定时器。本文中使用的F103ZET6也是如此
而这八个定时器又根据功能的区别,分为基本定时器、通用定时器、高级定时器三大类。
TIM6、TIM7——基本定时器 功能:定时。
TIM2、TIM3、TIM4、TIM5、TIM6——通用定时器 功能:定时、输出比较、输入捕获
TIM1、TIM8——高级定时器 功能:定时、输出比较、输入捕获、互补输出
本节我们将利用定时器TIM6来实现一个闪烁的LED,闪烁间隔为1S
实现步骤
第一步,在CubeMX中配置TIM6,具体配置如图

这里简单说明一下如何计算定时器的定时时间是多长,首先基本定时器TIM6内部是一个16位的向上计数器,最大可以记到2的16次方也就是65536,而计数器是从0开始计数因此最大可以记到65536-1即65535,这也是图中Counter Period参数能够填写的最大值。了解了这个之后,我们先整理一下已知条件,目前已知TIM6的时钟频率是72MHZ(如果不知道可以看CubeMX的Clock Configuration界面,APB1 Timer clocks的值就是TIM6的时钟频率),另外两个已知条件就是上图Counter Settings下的两个参数Prescaler和Counter Period,翻译成中文就是预分频系数和计数周期。那么已知上述三个条件,如何计算定时时间呢。首先我们用TIM6的时钟频率除以预分频系数+1就得到了计数器的时钟频率72M/((720-1)+1)=100000HZ,取其倒数就可以得到计数器的时钟周期为1/100000秒,再用计数周期+1去乘以计数器的时钟周期就得到了定时器计时的时长为((1000-1)+1)*1/100000=1/100秒=10毫秒。
简单总结一下就是,首先计算计数器的时钟频率 72M/prescaler,然后取倒数得到计数器的时钟周期 prescaler/72M,再乘以计数周期就得到了计时的时长T = (Prescaler + 1) * (Counter Period + 1)/ 72M。
总结成通用公式就是T = (Prescaler + 1) * (Counter Period + 1)/ TIM_Clock
第二步、代码编写,在USER CODE BEGIN 2下添加如下代码**
__HAL_TIM_CLEAR_IT(&htim6,TIM_IT_UPDATE);HAL_TIM_Base_Start_IT(&htim6);
首先我们调用__HAL_TIM_CLEAR_IT函数清除定时器更新中断标志,避免定时器刚启动就产生中断,接着调用HAL_TIM_Base_Start_IT函数使能定时器更新中断并启动定时器。接下来我们编写定时器中断回调函数,当定时器计时完成,将会产生更新中断,我们在中断回调函数中改变LED灯的状态实现LED定时闪烁。
在USER CODE BEGIN 4下编写中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}
}
在中断回调函数我们调用HAL_GPIO_TogglePin改变LED的状态,实现闪烁,这样每一次产生定时中断,LED就会改变一次状态,而产生定时中断的时间间隔是固定值10ms,LED灯就会以固定时间间隔闪烁了。
