LPC系列一个定时器不同频率

1.背景

最近研究的LPC804里只有一个ctimer,很多时候用的捉襟见肘的,官方给了一份双匹配的参考例程,不过实际用处不大。不过我花了一晚上的时间,终于研究出来将一个定时器拆成四个定时器用的办法了。这个方法适用于用回调函数的LPC系列单片机,比如LPC55S69

2.理论

在stm32里面,每个定时器只有一个重装值,当定时器的计数值达到设定值时就会开启中断,就像下图这样(绘画能力有限,还请见谅)

3419fa5f427447529b72cd8c2d1f85d0.png

但是,LPC系列不一样,他每个定时器最少能设置四个匹配值,那么我们可不可以整点花活呢?在单个增加的周期内搞上多个匹配值, 这样输出频率就能增加了!

59a050e10aa3460cb3c491d6be9b5980.png

那么说干就干

3.初始化

我这里以LPC804介绍,其他芯片应该是类似的,首先是程序顺序,核心在这一块。

61a295e24a024b6daacdb907b055b0a8.png

先看第一段,这里设置enableCounterReset开启时,当定时器的值达到这个匹配值时,就会重置定时器,这也就是我们理论那张图里的黑线,所以我们这里也就需要设置这个为长度最长的定时器,比如你需要一个1s和100ms的定时器,那么这里设置的匹配值就应该是1s的定时器。

3534d7222fbd4d1e8383cef648d9fab6.png 接下来我们设置匹配2,首先就是关闭enableCounterReset,我们这里设置的是速度更快的定时器,如果这里将这个打开,定时器的速度就不再是上面的慢速而是这里的快速了。接下来我要将匹配值初始化时设置为0。

8fc2d84bb1fa40b39fb04f425b0c7236.png

有些同学按捺不住性子了,问那我们不就最开始翻转一次吗?这和预期差别很大啊,没错这里只是初始值,我们实际值是要在中断里更新的,下面我就来说说中断里怎么写

4.中断

先说高频的中断

6956ad12000e439c9503fc8d06feb327.png 我们实际中断的时间其实参照的是这里的时间,当我们高频满足翻转第一次时间后,就会将下一次的时间给更新,因此我们这里的时间才是实际输出的时间。

然后是低频或是说基频

f70891c9c3a64d5c933dbe49df7f77a3.png

这里的核心是重置高频的匹配值,因为每一次完成低频的输出后定时器的值是由芯片内部重装,但是我们的匹配值增加后没有被重置,那么这里就必须手动归零了。 

最后给大家放一张图来帮助大家理解

06568088848e4a67a8c54a59260e1113.jpeg

5.实际效果

9b4fea7bd48d459cafbc6c2e283fe3d9.jpeg

1bd1075d1bad4c45993cacee9116af9e.png

 这里我用的是LPC804单片机,只有一个定时器,实现了不同频率的输出一个10ms一个1ms,10倍关系。

6.结语

总的来说,NXP的这种用法与其他芯片的区别还是很大的,大家也可以慢慢探索新的用法,这里建议大家的高频与基频最好是倍数关系,否则输出的波形是非对称的,不是标准的方波。 不过老实说如果需要的定时器不用高级的用法,只是基础的定时,NXP的这种搞法完全可以将一个定时器拆成4个用,速率还可以不一样。好了,大家有问题欢迎在评论区交流,我会尽力为大家解答。

 

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值