1、开发环境
(1)Keil MDK: V5.38.0.0
(2)STM32CubeMX: V6.8.1
(3)MCU: STM32F407ZGT6
2、定时器简介
(1)定时器可以通过输入的时钟源进行计数,从而达到定时的功能。
3、实验目的&原理图
3.1、实验目的
(1)通过定时器设置定时,实现LED灯以500毫秒间隔闪烁。
3.2、原理图
(1)选择LED1,接PF9引脚。
4、STM32CubeMX创建工程及简介
4.1、创建工程
(1)打开STM32CubeMX软件。
(2)点击File→NewProject。
(3)Commercial Part Number(商用部件号)处输入MCU型号,然后选择正确的单片机型号,点击Start Project(开始项目)。
(4)配置工程名、工程存放文件等。
点击Project Manager(项目经理)进行如下配置。
点击Code Generator(代码生成器)进行如下配置。
(5)点击GENERATE CODE生成KeilMDK工程。
4.2、配置时钟及GPIO
(1)HSE、LSE时钟源选择
- HSE:高速外部时钟源
- LSE:低速外部时钟源
- Disable:禁用
- BYPASS Clock Source:旁路时钟源
- Crystal/Ceramic Resonator :水晶/陶瓷共振器
- 一般选择水晶陶瓷共振器
- 旁路时钟源就是由外部给定一个时钟信号,一般用于作为同步时钟。
- 水晶/陶瓷共振器:指外接晶振,经过内部振荡电路产生时钟。
(2)LED1 GPIO配置
(3)时钟树配置
4.3、配置定时器
4.3.1、确定定时器挂载总线
(1)这里选择TIM2,确定TIM2挂载到哪根总线。
(2)查看STM32F407ZGT6芯片对应的数据手册。
(3)打开对应KeilMDK工程,点击Books。
(4)双击打开数据手册。
(5)查看芯片框图。TIM1挂载再APB1总线上,APB1 timer clocks时钟为72MHz,所以定时器1初始时钟为72MHz。
4.3.2、CubeMx中的TIM1配置
(1)定时器的配置项有很多,用不到的可以不用考虑,保持默认即可。
(2)时钟源的选择,选择内部时钟。也就是APB1 timer clocks。某些定时器只能选择内部时钟。
(3)定时器Parameter Settings(参数设置)计算。
- 定时时长500毫秒。
- Prescler(PSC -16 bits value): 分频系数,选择72-1,进行72分频,即定时时钟变为1MHz。
- Counter Mode: 计数器模式,选择Up,向上计数。
- Counter Period (AutoReload Register-32 bits value): 计数器周期,32位自动加载值。
- 时钟频率1MHz表示1秒钟时钟振荡1000000次。
- Counter Period = 500mS/(1/1Mhz) = 500mS/(1/1000000S) = 500000。
(4)打开定时器中断,定时器定时时间到,进入中断处理函数。
(5)点击GENERATE CODE更新KeilMDK工程。
5、KeilMDK软件编写
5.1、程序编写
HAL_TIM_Base_Start_IT(&htim2); /*启动定时器2,LED闪烁定时*/
/*功能:定时器中断回调函数
*参数:定时器x
*返回值:无
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);/*LED状态翻转*/
}
}
5.2、完整工程下载地址
(1)完整工程存储再码云。
(2)STM32_CSDN: CSDN中STM32专栏的所有示例代码
6、定时器计数模式
(1)Up,向上计数模式。计数器从 0 计数到自动装入的值,然后重新从0开始计数并且产生一个计数器溢出事件。
(2)Down,向下计数模式。计数器从自动装入的值 开始向下计数到 0 ,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
7、分频系数和计数周期为什么要减1
7.1、STM32CubeMX中TIM分频系数
(1)假设STM32CubeMX中Tim2要进行72分频,分频系数设置为72-1。
(2)因为没有0分频,分频系数设置为0时表示不分频。
(3)查看对应芯片参考手册。
(4)ck_psc是指定时器时钟源。
7.2、STM32CubeMXTIM计数周期
(1)应为计数值到了后,需要往下再计数一个值,也就是溢出才产生中断。
(2)溢出的同时计数值重新加载。