有人可以向我展示如何在没有 RTOS 或 Linux OS 的裸机环境中使用 C 或内联汇编设置 ARM9 中断向量表的示例吗?
具体来说,如何使用内联汇编或 C 将分支设置为用 C 编码的 IRQ 中断处理程序 ISR?
/// timer1 64-bit mode interrupt handler connected to TINT2 interrupt=#34
/// \todo I think I need to ACK it once I get working
interrupt void interruptHandlerTimer1(void) {
printf("\n [* ISR *] \n");
// ACK TINT2 interrupt #34
AINTC ->IRQ1 = 1 << (34 - 32);
}
void main(void) {
TIMER1 ->TCR = 0x00000000;
// TGCR: TIMMODE=0 64-bit GP, TIM34RS=TIM12RS=1
TIM0ER1 ->TGCR = 0x00000003;
TIMER1 ->TIM34 = 0x00000000;
TIMER1 ->TIM12 = 0x00000000;
TIMER1 ->PRD34 = 0x00000000;
TIMER1 ->PRD12 = 0x0000ffff;
// TCR: inc until period match, then reset
TIMER1 ->TCR = (2 << 6);
// This is wrong.
// I think I need to insert opcode or assembly to branch to interruptHandlerTimer1 ?
// AINTC ->EABASE located @ 0x00000000
uint32_t** ptrEabase = (uint32_t**) (AINTC ->EABASE);
ptrEabase[34] = (uint32_t*) (interruptHandlerTimer1);
// Set INT34 TINT2 to IRQ priority 2
AINTC ->INTPRI4 = 0x00000200;
// Enable INT34
AINTC ->EINT1 = (1 << (34 - 32));
// Enable IRQ in CPSR
// "TMS32DM644x ARM Subsystem", 3.3 Processor Status registers
asm(" ;Enable IRQ in CPSR");
asm(" mrs r0, cpsr");
asm(" bic r0, r0, #0x80");
asm(" msr cpsr_c, r0");
// I expected to see " [* ISR *] " print
// when TIMER1->TIM12 reaches 0x0000ffff
while (1) {
printf("%08x %08x\r\n", TIMER1 ->TIM34, TIMER1 ->TIM12);
}
}
提前感谢任何提示或方向。
ARM9 的裸机开发示例很难找到。
埃德
- 德州仪器 TMS320DM6466
- Code Composer Studio v5.5