《二》canfestival系列教程之軟件定時(shí)器分析(2)
以stm32單片機(jī)為例,精講一下代碼:
上文說到,軟件定時(shí)器對(duì)canfestival很重要.canfestival中大部分時(shí)間都是靠軟件定時(shí)器觸發(fā)的.
這里的所有軟件定時(shí)器,都是依靠一個(gè)硬件定時(shí)器模擬出來的.
就以stm32單片機(jī)的timer14定時(shí)器為例,
首先要配置timer14定時(shí)器,配置成向上計(jì)數(shù),每1us計(jì)數(shù)一次,并且開啟中斷.

對(duì)于硬件定時(shí)器的配置,最主要的是弄明白計(jì)數(shù)1次,消耗多少時(shí)間.也就是分配參數(shù).
上面的例子是每1us,計(jì)數(shù)一次,它就是canfestival的最小時(shí)間單位了.
定時(shí)器的中斷優(yōu)先級(jí)nvic配置

中斷發(fā)生后的處理函數(shù):
在里面會(huì)調(diào)用TimeDispatch( )這里是canfestival的接口函數(shù)

把TimeDispatch(?)放入到中斷函數(shù)里面后,它就會(huì)不斷改變timer14定時(shí)器的周期,來模擬出多個(gè)軟件定時(shí).也就是每個(gè)軟件定時(shí)器溢出,都會(huì)觸發(fā)timer14定時(shí)器的中斷.
(可以把圖片保存下來看,或者全屏看:-)

TimeDispatch(?)函數(shù)中,調(diào)用的兩個(gè)函數(shù)是需要我們根據(jù)開發(fā)環(huán)境編寫的.
這里用的是stm32的開發(fā)環(huán)境.setTimer( )和getElapsedTime()


canfestival中有兩個(gè)時(shí)間單位一個(gè)是us,另一個(gè)是ms.
在timerscfg.h中需要配置三個(gè)參數(shù):
TIMEVAL_MAX? 是硬件定時(shí)器最大的周期,因?yàn)槲覀僼imer14設(shè)置的是5000,所以這個(gè)參數(shù)不要超過5000.
MS_TO_TIMEVAL?是ms的計(jì)數(shù).timer14中配置的是每1us計(jì)數(shù)一次.所以這個(gè)ms要配置成1000.系數(shù)要配置成1000.
US_TO_TIMEVAL?是us,硬件定時(shí)器timer14本身就是1us計(jì)數(shù)一次,所以這里系數(shù)是1.


TimeDispatch(?)會(huì)遍歷timers中的所有軟件定時(shí)器,這里面timers實(shí)質(zhì)上是一個(gè)數(shù)組,這個(gè)數(shù)組的上限個(gè)數(shù)為MAX_NB_TIMER.
