Ports/CortexM3/GCC/OS_Target_asm.S
.weak __init_system_timer __init_system_timer: LDR R1, =NVIC_SYSPRI15 // Set the SysTick exception priority (lowest) LDR R2, =NVIC_ST_PRI STRB R2, [R1] LDR R1, =NVIC_ST_RELOAD // Setup SysTick LDR R2, =(SYSTICKFREQ/SYSTICKINTRATE-1) STR R2, [R1] LDR R1, =NVIC_ST_CTRL // Enable and run SysTick LDR R2, =(NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_INTEN | NVIC_ST_CTRL_ENABLE) STR R2, [R1] BX LR
Ports/CortexM4F/GCC/OS_Target_cpp.cpp
#pragma weak __init_system_timer extern "C" void __init_system_timer() { SysTickPriority = 0xFF; SysTick->LOAD = SYSTICKFREQ/SYSTICKINTRATE-1; SysTick->CTRL = NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_INTEN | NVIC_ST_CTRL_ENABLE; }
Ports/CortexM4F/GCC/OS_Target_cpp.cpp
// SysTick stuff struct systick_t { uint32_t CTRL; uint32_t LOAD; uint32_t VAL; uint32_t const CALIB; }; enum { NVIC_ST_CTRL_CLK_SRC = 0x00000004, // Clock Source. NVIC_ST_CTRL_INTEN = 0x00000002, // Interrupt enable. NVIC_ST_CTRL_ENABLE = 0x00000001 // Counter mode. }; systick_t volatile * const SysTick = (systick_t volatile * const)0xE000E010UL;
基本上只要參考這 3 個 register (0xe000e010, 0xe000e014, 0xe000e018), 設定完成後, systick isr 就可以工作了。以下是我自己的測試程式。
ref: L36 ~ L43, 這個程式應該不需要多做說明, 翻開這本書 arm cortex-m3: 嵌入式系統設計入門 p8-12, 對照一下就知道了。或是 Cortex™-M3 Technical Reference Manual p 8-8 (file name: DDI0337E_cortex_m3_r1p1_trm.pdf)
x/1xw 0xe000e018 可以看到這個值會倒數, 變成 0 時就會呼叫 systick_isr。使用 gdb break point 會暫停倒數。
快了, 終於接近我要做的東西了。
arm cortex-m3: 嵌入式系統設計入門第 14 章 systick 計時器有更進階的說明, bit[31] 可以檢查是否有外部時脈來源可以當然 systick 時脈。8-13 表 8-12 校正暫存器 (0xe000e01c)
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。