嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)

定时器TIM3的使用

1.TIM3是一种定时器,可以通过在cube中直接初始化配置
2.打开demo.ioc工程文件
3.在左侧工具栏位置找到TIM3
嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)
4.选择clock source修改为internal clock
嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)
5.进入到功能外设配置界面,设置TIM3的参数
嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)
6.我们希望达到的目标是每秒钟计时两次,因此将对应的参数进行设置,我们使用的晶振分频后是72MHz,因此做如图设置
嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)
这里讲一下这两个参数是什么意思。上面的Prescaler代表的是预分频系数,而counter里面是溢出系数,由于计算机是从0开始计数的,所以都要-1
prescaler的意思是要将原始的时钟频率分成多少份,即原始时钟响应了多少次之后,定时器的虚拟时钟走一次。比方说这里我设置的是7200,代表的是将原本72Mhz的时钟分频为了10000hz,即虚拟时钟为10000hz。
counter的意思是虚拟时钟走多少次后定时器产生一次中断,比方说我这里设置的是1000,也就是说虚拟时钟走1000次之后引发一次中断,则频率为10hz,也就是每0.1s触发一次定时器中断。
7.保存设置后返回到外设配置界面,修改NVIC的设置
嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)
8.选中TIM3使其生效
嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)
9.关于TIM3的设置完成,重新生成代码

定时器代码的实现

1.打开更新后的工程代码进行修改,将原先使用延时的部分改为使用定时器
2.首先对增加使用的变量进行定义,其中flag标志位不但要在main.c中声明也要在main.h中做扩展声明,这样该变量也能在定时器中直接使用
嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)
3.修改main中的主函数,给每一个LED灯编一个序号select,每次选定一个LED灯点亮
嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)
4.注意加上开启定时器
嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)
5.在stm32_f1xx_it.c文件中对于TIM3的代码进行完善,每到达一个定时就会点亮一个LED灯,select会加一,使下一个点亮的LED灯在其左边;当移动到最左端后将select重置为0,使LED灯再从最右端点亮,当定时到达后要重新将标志位清零,以等待下一次定时的到达。
嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本)
6.下面是仿真结果:
记住,首先将定时器时钟从72修改为12,否则仿真结果是不对的。
然后,仿真的时候会先进入一次中断,这里并不清楚他的原因,考虑可能是初始化函数造成的。
第1次进入中断嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本),中断结束后点亮1
第2次进入中断嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本),中断结束后灭1亮2
第3次进入中断嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本),中断结束后灭2亮3
第4次进入中断嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本),中断结束后灭3亮4
第5次进入中断嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本),中断结束后灭4亮5
第6次进入中断嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本),中断结束后灭5亮6
第7次进入中断嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本),中断结束后灭6亮7
第8次进入中断嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本),中断结束后灭7亮8
第9次进入中断嵌入式(十二):STM32在搭建好环境的情况下点亮流水灯(定时器版本),中断结束后灭8
后进入循环。
可以看到,中断的时间间隔为0.1s(精确),即10hz,与我们设定的参数一致。