Timer
想让程序定时运行,比如led 1s闪烁一次。如何做到?
第一种方法是愚蠢的delay延时,我自己估算一下:嗯,delay(2000)差不多1s。然后在程序中delay,点亮,delay,熄灭……
太浪费资源了。
第二种方法,32是有定时器中断的。
定时器中断大概原理是,32上有时钟晶振按固定频率周期输出0101010……定时器里有一个cnt,收到一个时钟晶振就++。
我们可以设置定时器溢出值,比如溢出值是1000,cnt加到1000会自动触发定时器中断。然后归0,继续++。
执行周期数量:1+1+1+1+(0xFFFFFFFF一直-1-1-1直到变为0x00FFFFFF的循环次数)+(r0+1的执行次数,1次)
定时器也有一些扩展方法,比如我们可以设定++还是–;可以设定信号源是时钟或者外部输入的方波信号;可以读取计数值……
我们课件常用方法好像是–到0触发中断,然后恢复初值。
PWM
PWM这个东西是什么?
PWM(Pulse Width Modulation)脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域。
就好比说,你骑自行车速度只能是100和0,模拟电信号只能输出高低。
但是呢,你骑自行车是有惯性的,以100速度蹬一脚,以0速度蹬1脚,100速度蹬一脚……
整体来看你的自行车平均速度是50(我们假设加速度不需要时间哈)
这个应用场景有很多,比如设定led闪烁频率:高低高低高低……,因为频率极高,我们肉眼看不出来在闪,给我们呈现的视觉效果就是以一半的亮度在亮。高低低高低低就是1/3亮度。
比如电机通过这个方式调速度。
那么他有什么应用场景。第一,输入捕获 Input capture。
对于一个这种有惯性的系统,我们也可以反过来读取其波形来判断其速度。比如电机放一个转速检测传感器,把输入波形作为定时器的时钟源信号,定时器一直++:检测上升下降沿时记录cnt值,通过差值比较计算时间间隔。
第二,输出比较 output compare。
定时器一直++,与预先设定好的阈值比较,如果相等触发中断输出。
这就是PWM。占空比相当好算。
Low Power Timer
我们目前假设的是CPU一直运作的,只是在后台和前台之间切换。有一种低功耗定时器使得没有发生定时器中断的时候CPU被置为低功耗状态,只有发生定时器中断的时候才启动。(使用 __WFI() wait for instruction 指令)
SysTick
M系列自带的一个系统时钟,使用处理器时钟或者参考时钟作为时钟源。
有四位寄存器:
每次赋值是load,一直–到0时重新load赋值。ctrl是控制启用系统时钟。这个是CMSIS有提供的数据结构和相关操作函数的时钟处理部分。
init 参数是中断间隔的毫秒数。timer_set_callback() 里跟一个可以是自己定义的函数,使得触发定时器中断时该函数被执行。以上代码意思是每隔100ms LED灯翻转一次,且 CPU 常态下处于低功耗状态。