本帖最后由 stm1024 于 2025-6-21 16:54 编辑
好了,又到了周末,有时间将CH585开发板的计时器做个简单评测。
废话少说,直接进入正题。先看datasheet,关于定时器方面的信息如下:
所以关于计时器/计数器或者PWM都是支持的,这次我先测试简单的定时器。通常,定时器使用中断方式控制,对于一个经典的前后台程序,定时器中断中一般只做简单的操作,或者只是设置状态位等,然后在主程序main中根据状态位决定对应的响应。不过作为演示程序,这里就做一个简单的翻转GPIO即可。
定时器的配置很简单,和串口配置类似,只需要几行代码就可以搞定:
这三行代码,第一行配置了定时器的周期,我们将系统频率作为参数,则定时周期就是1秒,如果我们想定时为100ms,就使用FREQ_SYS/10。第二行则是中断配置,第三行是使能中断。
说到了中断,自然要有对应的中断处理函数,在中断处理函数中,一般是触发一个标志位,然后清除中断标志:
上述代码中,没有使用什么标志位,而是直接使用的翻转GPIO口PA0和PA4,两个分别用作LED0的控制和提供给逻辑分析仪抓数据。
完整代码如下:
编译下载以后,可以看到LED灯亮1秒灭1秒,逻辑分析仪数据如下:
如果我们把定时器周期配置为FREQ_SYS/10,逻辑分析仪抓取数据:
可以看到基本上是100ms的频率在翻转,看上去都很不错。
那么,如果我们要定时2秒,直接将定时器周期配置为FREQ_SYS*2可以吗?抓个数据看看:
what!?不对劲!怎么定时器时间拉长了,周期反而缩短了?看源代码:
可见最大的值不能超过67108864,因此,FREQ_SYS=62400000,乘以2必然超过了这个上限。这种情况下必须引入一个额外的变量辅助定时。
修改如下:
再抓取数据,如下:
这回就对了。
OK,今日测评就是这样。
|