《二》canfestival系列教程之软件定时器分析(2)
以stm32单片机为例,精讲一下代码:
上文说到,软件定时器对canfestival很重要.canfestival中大部分时间都是靠软件定时器触发的.
这里的所有软件定时器,都是依靠一个硬件定时器模拟出来的.
就以stm32单片机的timer14定时器为例,
首先要配置timer14定时器,配置成向上计数,每1us计数一次,并且开启中断.

对于硬件定时器的配置,最主要的是弄明白计数1次,消耗多少时间.也就是分配参数.
上面的例子是每1us,计数一次,它就是canfestival的最小时间单位了.
定时器的中断优先级nvic配置

中断发生后的处理函数:
在里面会调用TimeDispatch( )这里是canfestival的接口函数

把TimeDispatch( )放入到中断函数里面后,它就会不断改变timer14定时器的周期,来模拟出多个软件定时.也就是每个软件定时器溢出,都会触发timer14定时器的中断.
(可以把图片保存下来看,或者全屏看:-)

TimeDispatch( )函数中,调用的两个函数是需要我们根据开发环境编写的.
这里用的是stm32的开发环境.setTimer( )和getElapsedTime()


canfestival中有两个时间单位一个是us,另一个是ms.
在timerscfg.h中需要配置三个参数:
TIMEVAL_MAX 是硬件定时器最大的周期,因为我们timer14设置的是5000,所以这个参数不要超过5000.
MS_TO_TIMEVAL 是ms的计数.timer14中配置的是每1us计数一次.所以这个ms要配置成1000.系数要配置成1000.
US_TO_TIMEVAL 是us,硬件定时器timer14本身就是1us计数一次,所以这里系数是1.


TimeDispatch( )会遍历timers中的所有软件定时器,这里面timers实质上是一个数组,这个数组的上限个数为MAX_NB_TIMER.
