|
學者貴于行之,而不貴于知之。 |
弄懂了 stm32f407 clock tree 之後, 就可以精準的設定 timer, 上一篇是
systick 這次的是 timer3。
一樣得知道 timer3 接在哪個 bus 上, 參閱 fig 1, 在 APB1 上。
|
fig 1 |
也和上一篇一樣, 再呼叫 timer3.c L674 SystemInit() 之後:
sysclk (cpu 時脈): 168 MHz
AHB: 168 MHz
APB1: 42MHz
APB2: 84MHz
main PLL: 168 MHz
不一樣的是:
APB1 的除頻係數是 4, 所以 apb1 是 168/4=42, 然後到了 timer3 時, 會 X2, 所以 timer3 餵進來的時脈是 42*2=84 Mhz, 參考 ref 2 圈圈 8 的那個地方, 如果 APB1 的除頻係數是 1, timer3 的時脈就不會乘以 2, 也就是餵進來的時脈是 42 Mhz。
餵進來的時脈是 84Mhz, 也就是說 1/84000000 會計數一次, 數到 84000 之後就代表了 1 ms。觀念和 systick 一樣, 但是細節不一樣。
|
fig 2 |
要設定的相關暫存器:
CR1:CKD 設定為 00 的話, 表示 CK_INT 進來的頻率是多少就是多少, CK_INT 就是上文提到的 84 Mhz。
CR1:DIR uncounter, downcounter 的設定, 往上遞增計數或往下遞減計數。
ARR: 假如設定 100, 就是在一個 clock 往上數到 100 或是從 100 往下數到 0。
PSC: 假如設定 84, 表示 84/84000000 會把 ARR 往上或是往下數一次。
DIER:UIE 1: update interrupt enabled, 計數的時間到了, 將中斷 bit on 起來。
SR:UIF 1: update interrupt pending, 中斷 bit on 起來, 用來檢查時間是不是到了。
PSC: 8400
ARR: 10
就是 8400/84000000 把 ARR 往上或是往下數一次, 以往上來舉例, 數到 10 就把中斷 bit on 起來, 剛好是 1ms。
PSC: 0
ARR: 84000
這組設定也是同樣效果, 騙你的, 雖然看起來也是 1/84000000 數 84000 次, 但是 ARR 是 16 bit, 無法接受 84000 這麼大的值, 16 bit 最大值是 65536。
timer3 還有很多暫存器可以設定, 相當複雜。
程式一樣很簡單, 算到 1ms 亮燈, 在 1ms 後, 暗燈, 一樣不使用 isr, 而是檢查 SR:UIF, 不使用 isr 是為了讓程式簡單一點, 文章雖然很短, 但把這些搞懂著實花了我不少時間, 希望有興趣的開發人員可以因為我的文章而減少學習時間, 把時間花在要完成的項目。
fig3 是 1ms 的 LA 波形圖, fig4 是 2ms LA 波形圖。
這個實驗是從《精通STM32F4(库函数版)》修改而來。
|
fig 3 1ms timer3 |
|
fig 4 2ms timer3 |
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。