一、实验目的
本次实验所涉及并要求掌握的知识点。
1. 配置STM32时钟树
学习如何配置和管理STM32微控制器的时钟系统,掌握不同时钟源的选择和配置,理解时钟树的工作原理,以及如何优化时钟系统以满足不同应用的需求。
2. 使用STM32F407ZG6的基本定时器
掌握STM32微控制器的定时器基本功能,理解定时器的工作原理,学会如何配置和使用定时器,掌握基本定时器的应用,特别是在嵌入式系统中的实时控制和时间管理应用中如何有效利用定时器。
二、实验内容
1. 使用STM32CubeMX配置时钟树
根据图 1所示配置,使用STM32CubeMX配置STM32F407ZGT6的时钟树,并生成工程代码。
2. 使用STM32F407ZG6的基本定时器
TIM6设置为连续定时模式,定时周期500ms,以中断方式启动TIM6,在UEV事件中断回调函数里使里使LED1输出翻转。
TIM7设置为单次定时模式,定时周期2000ms,按下KeyRight键之后使LED2点亮,并以中断方式启动TIM7,在UEV事件中断回调函数里使里使LED2输出翻转。
三、主要实验步骤
- 使用STM32CubeMX配置时钟树
在时钟树上设置HSE为8MHz,为便于计算定时器的时钟频率和预分频系数,将HCLK设置为100MHz,将APB1和APB2定时器时钟信号频率都设置为50MHz
![]() |
2. 使用STM32F407ZG6的基本定时器
(1)程序设计思路
TIM6配置:设置TIM6为连续定时模式,定时周期为500ms,开启中断,定时器溢出时触发中断回调函数
TIM7配置:设置TIM7为单次定时模式,定时周期为2000ms,KeyRigth按下时触发中断,定时器溢出时触发中断回调函数
中断处理:在TIM6中断回调函数中,翻转LED1;在TIM7中断回调函数中,翻转LED2,并关闭TIM7(单次模式)
(2)程序流程图
![]() |
- 关键步骤与代码分析
- MX项目配置
- 从CubeMX模版文件M4_LCD_KeyLED.ioc创建项目,导入按键、LED与MCU连接的GPIO引脚的设置
- 在SYS组件中,设置Debug为Serial Wire
- 在RCC组件中,设置HSE为Crystal/Ceramic Resonator
- 配置时钟树,HSE设置为8MHz,将HCLK设置为100MHz,将APB1和APB2定时器时钟信号频率设置为50MHz
![]() |
- 定时器TIM6的设置
- 在模式设置部分,勾选Activated复选框,以启用TIM6,启用后,会出现One Pulse Mode复选框,这是用于设置单脉冲模式,对于基础定时器就是单次定时模式。TIM6工作于连续定时模式,不勾选此项
- 设置Prescaler为49999
- 设置Counter Mode(计数模式)为Up
- 设置Counter Period,计数周期,也就是自重载寄存器的值,设为500
![]() |
- 定时器TIM7的设置
TIM7采用单次定时模式,定时周期为2000ms,其他参数与TIM6一样。TIM7工作于单次定时模式,参数Counter Period设置为2000
![]() |
- 定时器的中断设置
在NVIC组件的配置界面,两个定时器的抢占优先级都设置为1,
![]() |
- 关键代码分析及实现
- 主程序main.c
在main.c中,初始化GPIO,FSMC,TIM6,TIM7
![]() |
在main.c中,在while(1)中检测KEY_RIGHT的按下,若按下,点亮LED2,并开启TIMI7。利用TFT LCD输出提示TIM6和TIM7的功能。
![]() |
- 定时器初始化tim.h和tim.c
![]() |
- 定时器中断处理stm32f4xx_it.c
在stm32f4xx_it.c生成的TIM6和TIM7的硬件中断ISR的代码都调用了定时器中断通用处理函数HAL_TIM_IRQHandler(),在这个通用处理函数里,会判断产生定时器硬件中断的事件源,然后调用对应的回调函数进行处理。
基础定时器的中断事件源只有一个,就是计数器溢出时产生的UEV事件,对应的回调函数是HAL_TIM_PeriodElapsedCallback()。
在tim.c中实现回调函数:
![]() |
- 实验结果分析
LED1周期性闪烁,每0.5秒翻转一次。LED2初始状态是熄灭,按下KeyRight键之后LED2翻转,保持翻转后状态2秒后熄灭,LED2不会闪烁。