本帖最后由 lygo 于 2017-9-5 23:44 编辑
前面那一篇帖子学习了按键点灯,那么接下来这篇帖子咱们就玩高大上一点行不行(其实是nucleo外设没多少,还在点灯),由于第一篇帖子是延时来点灯,那么本帖子就来一下定时器计数来实现点灯吧。
首先先介绍下定时器吧,我相信学过STM32的人肯定都会知道定时器吧,而定时器本质就是计数器,计数器对内部计数也就构成了定时器。其原理如下:
假设为向上计数模式:比如设定一个计数上限,但是不能超过65535(最大值),然后让计数器开始计数,当计数值到达上限了,它再从头开始计数。只不过,当这一轮计数完毕时,会产生一个更新中断,
我们可以让 MCU
为我们做点事,比如打开或关闭一个 LED 灯。这里还需要介绍个概念预分频器:起到一个时钟分频作用,比如设定计数器的工作频率(
比如时钟频率为48M,48分频后就变为了1M,即就是1us)。当
计数值到达上或下限时,你让定时器产生一个事件,还是让定时器产生一个中断,你得告诉定时器。然后设计一个事件处理函数或中断处理函数,在里面完成要 MCU 完成的操作。配置定时器的步骤如下:
1.
选一个定时器来操作,有高级也有通用定时器,这里我们选 TIM2,这是个通用定时器。
2. 设置定时器的计数频率,也就是定时器的预分频器
3. 指定计数上限
4. 当计数器到达上或下限时,定时器产生事件还是中断
5. 打开定时器
实现的效果:LED灯一会灭,一会亮,话不多说,直接上吧。
第一步:选择定时器,如下:
即就是选择定时器时钟源,内部时钟。(2)
配置定时器参数上面第一个参数是预分频系数,我选择的时钟是48M的,所以经过47999+1分频后就变为了时钟频率为1M,即时间为1us.
第二个参数是计数模式,这里选择的是向上计数模式。第三个参数是:计数上限为999,0-999就是1000,所以溢出时间为1s。
由于会用到更新中断标志位,所以开启定时器中断,即NVIC:
把上面的勾打上即可。(3)
编写代码首先要说明一个约定,STM32CubeMX
使用的是新的 HAL 库,HAL 库对中断及事件的处理采用的是
所谓回调机制。也就是说中断程序的框架已做好,且不能修改。那么如何加入用户代码呢,就是通过所谓的回调函数来实现的。
如下图: 下载进开发板没效果,检查了发现定时器都没打开,加上下面这句就行了: 最后实验完成,谢谢大家!!!
本帖最后由 lygo 于 2017-9-5 23:44 编辑
前面那一篇帖子学习了按键点灯,那么接下来这篇帖子咱们就玩高大上一点行不行(其实是nucleo外设没多少,还在点灯),由于第一篇帖子是延时来点灯,那么本帖子就来一下定时器计数来实现点灯吧。
首先先介绍下定时器吧,我相信学过STM32的人肯定都会知道定时器吧,而定时器本质就是计数器,计数器对内部计数也就构成了定时器。其原理如下:
假设为向上计数模式:比如设定一个计数上限,但是不能超过65535(最大值),然后让计数器开始计数,当计数值到达上限了,它再从头开始计数。只不过,当这一轮计数完毕时,会产生一个更新中断,
我们可以让 MCU
为我们做点事,比如打开或关闭一个 LED 灯。这里还需要介绍个概念预分频器:起到一个时钟分频作用,比如设定计数器的工作频率(
比如时钟频率为48M,48分频后就变为了1M,即就是1us)。当
计数值到达上或下限时,你让定时器产生一个事件,还是让定时器产生一个中断,你得告诉定时器。然后设计一个事件处理函数或中断处理函数,在里面完成要 MCU 完成的操作。配置定时器的步骤如下:
1.
选一个定时器来操作,有高级也有通用定时器,这里我们选 TIM2,这是个通用定时器。
2. 设置定时器的计数频率,也就是定时器的预分频器
3. 指定计数上限
4. 当计数器到达上或下限时,定时器产生事件还是中断
5. 打开定时器
实现的效果:LED灯一会灭,一会亮,话不多说,直接上吧。
第一步:选择定时器,如下:
即就是选择定时器时钟源,内部时钟。(2)
配置定时器参数上面第一个参数是预分频系数,我选择的时钟是48M的,所以经过47999+1分频后就变为了时钟频率为1M,即时间为1us.
第二个参数是计数模式,这里选择的是向上计数模式。第三个参数是:计数上限为999,0-999就是1000,所以溢出时间为1s。
由于会用到更新中断标志位,所以开启定时器中断,即NVIC:
把上面的勾打上即可。(3)
编写代码首先要说明一个约定,STM32CubeMX
使用的是新的 HAL 库,HAL 库对中断及事件的处理采用的是
所谓回调机制。也就是说中断程序的框架已做好,且不能修改。那么如何加入用户代码呢,就是通过所谓的回调函数来实现的。
如下图: 下载进开发板没效果,检查了发现定时器都没打开,加上下面这句就行了: 最后实验完成,谢谢大家!!!