使用定时器编写led闪烁

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
使用定时器编写led闪烁# # 配置RCC(系统时钟)# #b配置GPIO口# #c配置时钟# # d导出keil5文件 总结
准备工作
使用软件:keil5、
定时器:TIM2
硬件:野火f407开发板
硬件IO:PF8(喜欢蓝色就选择了蓝灯)
一、实现功能
主要使用TIM2定时500ms,然后在定时器中断里写GPIO电平翻转从而达到闪烁的效果(函数)
蓝灯每隔1s亮
本章博客将主要讲述上的定时器配置
二、使用步骤 1.生成初始化代码 # # 配置RCC(系统时钟)
先进去RCC配置界面,然后在时钟源那里选择晶振陶瓷谐振器 。
HCLK那个地方的值可以自己填写,我填32MHZ,则挂载TIM2的总线APB1的时钟在上面时钟树上显示32MHZ,这个频率将与定时器的配置有关 。
# #b配置GPIO口

使用定时器编写led闪烁

文章插图
在准备工作里知道使用的是PF8
当芯片引脚比较多查找引脚不方便时,可以使用右下角的搜索窗口快速定位到引脚
然后在PF8引脚上右键单击 。选择,将引脚设置为输出
先点击GPIO进入GPIO配置页面(多种方法,点击右侧列表的GPIO也能进)
观察准备工作中贴出啦的原理图,可以看到只有当PF8输出低电平时,二极管正向导通,灯亮 。故将GPIO的初始状态设置为高,则初始状态下灯是灭的 。
GPIO模式设置为推挽输出 。推挽输出指不管是低电平还是高电平都有很强的驱动能力,而开漏输出无法输出真正的高电平,需借助上下拉电阻 。总的来说,一般情况下,都是推挽输出 。而在需要使用开漏输出的线与功能时,才会把GPIO配置成开漏输出,比如I2C在从应答主的场景中用到了线与特性 。在这种情况下,GPIO配置成开漏输出 。(如果这篇文章一不小心被你看到了,我提前谢谢你能帮我补充开漏输出的场所,新人小白感激不尽!)
上拉即初始状态输出为高,下拉即初始位置为低,既不上拉也不下拉,此时输出状态不确定 。
至于输出速度,我平常接触到的项目没什么要求就设置为low
# #c配置时钟
进入时钟配置页面 。将时钟来源设置为内部时钟
进入参数设置界面 。我要设置一个500ms的定时器 。有计算公式
t = (+1)( +1)/CLK
其中是预分频器的值; 是定时器周期;CLK是定时器时钟频率 。公式里的加一是因为、 都是从0开始 。值得注意的是,、 都是16位,设值范围是0~65535,若超过65535会出问题 。
举个栗子 。我设置500m可以设置(31999+1)(499+1)/32MHZ=0.5s
当然也可以设置为(3999+1)(3999+1)/32MHZ
使用定时器编写led闪烁

文章插图
组合的方法太多了!
# # d导出keil5文件
设置文件名称、位置(全英文,谢谢!!)、我使用的是keil5,选择导出keil5
按图片中①②勾选,然后点击③处生成代码
大功告成
2.keil5中操作
/* USER CODE BEGIN 2 /与 / USER CODE END 2 */间写T(&htim2);跳转进入该函数可以看到,语句的作用是开启定时器中断使能
第二个需要干的就是写回调函数,这个回调函数名字是已经定义好了的,用户只需写函数内容 。
我这里写的是先判断是不是定时器2,这个判断主要是针对多个定时器中断的情况下判断,我这里只有定时器2,可以不要if判断 。判断完成后翻转GPIO的电平达到灯闪烁的效果 。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim->Instance == TIM2){HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_8);}}