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 帳號。