在 CodeWarrior 建立 MCF52259 專案後,系統會生成 exceptions.c,其中包含**中斷向量表**(共 256 條目)。前 64 個保留給處理器復位與異常,64~255 供用戶配置。中斷分 7 級優先級(7 最高,1 最低)。
Timeout = 2^PRE * (PMR + 1) / (fsys / 2)
PRE:預分頻器(PCSR[PRE])PMR:模數計數器值fsys:系統頻率/***********************************************
* 配置 1ms 中斷 系統頻率 128MHz
* ((2^2) * 16000) / (128000000/2) = 0.001s
***********************************************/
void PIT_Init(void) {
// 1. 設定 PIT0 控制/狀態暨模數寄存器
MCF_PIT_PCSR(0) = MCF_PIT_PCSR_PRE(2) // PRE = 2 (分頻 4)
| MCF_PIT_PCSR_PIE // 啟用中斷
| MCF_PIT_PCSR_RLD // 重新載入模式
| MCF_PIT_PCSR_OVW // 允許覆寫
| MCF_PIT_PCSR_PIF; // 清除中斷旗標
MCF_PIT_PMR(0) = (uint16)(16000 - 1); // 模數值
// 2. 向量表索引 = 中斷源號 + 64
// PIT0 中斷源號 = 55 → 向量表位置 119
// 修改 exceptions.c 中的向量表:
// asm_exception_handler, /* 117 */
// asm_exception_handler, /* 118 */
// PIT0_handler, /* 119 PIT0 ISR */
// asm_exception_handler, /* 120 */
// asm_exception_handler, /* 121 */
// 3. 使能中斷控制器
MCF_INTC0_IMRL &= ~MCF_INTC_IMRL_MASKALL; // 先全關
MCF_INTC0_IMRH &= ~MCF_INTC_IMRH_INT_MASK55; // 使能源 55
// 4. 設定優先級 6、級別 2
MCF_INTC0_ICR55 = MCF_INTC_ICR_IP(6) + MCF_INTC_ICR_IL(2);
// 5. 啟動 PIT0
MCF_PIT_PCSR(0) |= MCF_PIT_PCSR_EN;
}
| 步驟 | 說明 |
|---|---|
| 向量表位置 | 用戶中斷源號 + 64。PIT0 源號 55 → 索引 119。 |
| IMR 暫存器 | IMRL 控制 0~63,IMRH 控制 64~127。寫 0 使能,寫 1 屏蔽。 |
| ICR 暫存器 | 每個中斷源一個 ICRn,設定 IP(優先級 1~7)與 IL(級別 0~7)。 |
| ISR 命名 | 須與向量表中的函數名一致(如 PIT0_handler)。 |
exceptions.c 修改向量表,導致 ISR 不被呼叫。PRE、PMR 計算錯誤,中斷頻率不準。PIF 旗標,進入 ISR 後立即再次觸發。MCF52259 中斷配置核心在於:**算對時序參數、改對向量表索引、設對 ICR 優先級、開對 IMR 使能位**。按步驟操作,配合 datasheet 查閱暫存器定義,即可穩定實現精確定時中斷。