相比於stm32,dsp28335的定時器好像真的簡單了好多,從定時器個數來講只有3個,時鐘源只能是系統時鐘,而且計數方向也只有向下計數。
單純且善良的定時器,好不讓人心生喜愛。
tms320f28335 的 cpu time 有三個,分別為 timer0,timer1,timer2,其中 timer1和timer2 是為作業系統 dsp/bios 保留的,當未移植作業系統時,可用來做普通的定時器。這三個定時器的中斷訊號分別為 tint0, tint1, tint2,分別對應於中斷向量 int1,int13,int14。
定時器的功能如下圖所示:
由圖可以看出,tcr為0時定時器才可以開始工作;
tddr(低位)和tddrh(高位)組成16位暫存器,對系統時鐘進行分頻;
prd(低位)和prdh(高位)組成32位暫存器,儲存每次重裝載的值,相當於定時週期;
tim(低位)和timh(高位)組成32位暫存器,用作定時器的當前計時的記錄值。
對比stm32的時鐘,dsp28335的定時器真的更單純,dsp28335的定時器只能向下計數,而且不和pwm和cap功能混在一起讓人心煩。
中斷方面,定時器0的中斷訊號通過pie模組進入核心,定時器1、定時器2的中斷訊號則直接進入核心。
三個定時器的基本設定是相同,具體了解其中一組即可
大部分暫存器都是寫入乙個數值,只需要注意tcr暫存器各個位的功能:
tcr暫存器功能介紹
首先完成主函式框架:
void
main()
}
今天主要內容是定時器的使用,下面只貼出tim0_init()功能函式的實現**
void
tim0_init
(float freq,
float period)
interrupt void
tim0_irq
(void
)
在tim0_init(float freq, float period) 中,第三步的**是複製ti公司的**(file: dsp2833x_cputimers.c)也可以簡化成下面的樣子。
void
tim0_init
(float freq,
float period)
ps: 可能有些朋友不太清楚 configcputimer(&cputimer0,freq,period);的三個引數。這裡簡單注釋一下,函式原型為
void
configcputimer
(struct cputimer_vars *timer,
float freq,
float period)
其中timer的可選引數有三個,就是分別對應的三個定時器
&cputimer0 、 &cputimer1 、 &cputimer2 ;
freq 為系統時鐘單位mhz,我用的系統時鐘為150mhz,所以我在這裡填 150;
period 為期望的定時週期,單位為us 。我的目標是1s,所以我這裡填1000000 ;
可能有朋友會像我一樣疑惑為什麼沒有涉及到預分頻的設定。通過閱讀原始檔,我發現ti公司直接是對系統時鐘不分頻cputimer0.regsaddr->tpr.all = 0; cputimer0.regsaddr->tprh.all = 0;
憑藉著自己是個32位的計數器,通過肆意改變定時週期的自動裝載值來實現不同時間的定時,超霸氣,超簡便,超讚。 STM32筆記 Systick系統定時器
關於systick的具體概念不多記錄,systick是儲存乙個數值然後倒計數,每記到0會進行一次中斷,下面我們用 記錄 其中systemfrequency的值為72000000,可去查巨集定義,除去100000代表的是每這麼長時間週期就中斷一次,這個設定就是每720個週期進一次中斷,執行中斷的函式,...
stm32筆記6 定時器和定時中斷
以通用定時器 tim2 tim5 為例子 注 除非apb1的分頻係數是1,否則通用定時器的時鐘等於apb1時鐘的2倍。預設呼叫systeminit函式情況下 sysclk 168m ahb時鐘 168m apb1時鐘 42m 所以apb1的分頻係數 ahb apb1時鐘 4 所以,通用定時器時鐘ck...
DSP 之定時器設定 TIMER
dsp 之定時器設定 timer include include include include global data definition define timer ctrl timer tcr rmk timer tcr idleen default,idleen 0 timer tcr fu...