1.背景
最近研究的LPC804里只有一个ctimer,很多时候用的捉襟见肘的,官方给了一份双匹配的参考例程,不过实际用处不大。不过我花了一晚上的时间,终于研究出来将一个定时器拆成四个定时器用的办法了。这个方法适用于用回调函数的LPC系列单片机,比如LPC55S69
2.理论
在stm32里面,每个定时器只有一个重装值,当定时器的计数值达到设定值时就会开启中断,就像下图这样(绘画能力有限,还请见谅)
但是,LPC系列不一样,他每个定时器最少能设置四个匹配值,那么我们可不可以整点花活呢?在单个增加的周期内搞上多个匹配值, 这样输出频率就能增加了!
那么说干就干
3.初始化
我这里以LPC804介绍,其他芯片应该是类似的,首先是程序顺序,核心在这一块。
先看第一段,这里设置enableCounterReset开启时,当定时器的值达到这个匹配值时,就会重置定时器,这也就是我们理论那张图里的黑线,所以我们这里也就需要设置这个为长度最长的定时器,比如你需要一个1s和100ms的定时器,那么这里设置的匹配值就应该是1s的定时器。
接下来我们设置匹配2,首先就是关闭enableCounterReset,我们这里设置的是速度更快的定时器,如果这里将这个打开,定时器的速度就不再是上面的慢速而是这里的快速了。接下来我要将匹配值初始化时设置为0。
有些同学按捺不住性子了,问那我们不就最开始翻转一次吗?这和预期差别很大啊,没错这里只是初始值,我们实际值是要在中断里更新的,下面我就来说说中断里怎么写
4.中断
先说高频的中断
我们实际中断的时间其实参照的是这里的时间,当我们高频满足翻转第一次时间后,就会将下一次的时间给更新,因此我们这里的时间才是实际输出的时间。
然后是低频或是说基频
这里的核心是重置高频的匹配值,因为每一次完成低频的输出后定时器的值是由芯片内部重装,但是我们的匹配值增加后没有被重置,那么这里就必须手动归零了。
最后给大家放一张图来帮助大家理解
5.实际效果
这里我用的是LPC804单片机,只有一个定时器,实现了不同频率的输出一个10ms一个1ms,10倍关系。
6.结语
总的来说,NXP的这种用法与其他芯片的区别还是很大的,大家也可以慢慢探索新的用法,这里建议大家的高频与基频最好是倍数关系,否则输出的波形是非对称的,不是标准的方波。 不过老实说如果需要的定时器不用高级的用法,只是基础的定时,NXP的这种搞法完全可以将一个定时器拆成4个用,速率还可以不一样。好了,大家有问题欢迎在评论区交流,我会尽力为大家解答。