我把源程序贴出来给大家看一下,目的就是要用定时器0产生中断,让led灯以1s为间隔亮灭,用ADS和AXD来调试。实际调试中没办法进irq_exception。还请高手指点。谢谢了。我对中断程序的跳转过程还是有点模糊。 init.s IOPMOD EQU 0x3FF5000 ;I/O口模式寄存器 IOPDATA EQU 0x3FF5008 ;I/O口数据寄存器 TMOD EQU 0x3FF6000 ;定时器模式寄存器 TDATA0 EQU 0x3FF6004 ;定时器数据寄存器 INTMOD EQU 0x3FF4000 ;中断模式寄存器 INTPND EQU 0x3FF4004 ;中断悬挂寄存器 INTMSK EQU 0x3FF4008 ;中断屏蔽寄存器 IMPORT irq_exception AREA Init,CODE,READONLY ENTRY LDR PC, Reset_Addr LDR PC, Undefined_Addr LDR PC, SWI_Addr LDR PC, Prefetch_Addr LDR PC, DataAbort_Addr NOP LDR PC, IRQ_Addr LDR PC, FIQ_Addr
Reset_Addr DCD Reset_Handler Undefined_Addr DCD 0 SWI_Addr DCD 0 Prefetch_Addr DCD 0 DataAbort_Addr DCD 0 DCD IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD 0
Reset_Handler ;********************************* ;LED Display ;*********************************
LDR R1,=IOPMOD LDR R0,=&ff STR R0,[R1] LDR R1,=IOPDATA LDR R0,=&00 STR R0,[R1] EOR R0,R0,R0
;*************************************** ;User Stack ;*************************************** LDR R0, =0x3FF0000 LDR R1, =0xE7FF0000 ;配置SYSCFG,片内4K Cache,4K SRAM STR R1,[R0] LDR SP, =0x3FE1000 ;SP指向4K SRAM的尾地址,堆栈向下生成 ;*************************************** ;Interrupt Special Registers ;*************************************** LDR R1,=INTMOD ;设置中断模式寄存器 LDR R0,=&00000000 STR R0,[R1] LDR R1,=INTMSK ;设置中断屏蔽寄存器,只允许定时器0中断 LDR R0,=&1FFbFF STR R0,[R1] ;************************************** ;Timer0 Special Registers ;************************************** LDR R1,=TDATA0 ;定时器0的数据寄存器装入初始化值 LDR R0,=&1FFBFF ;1s中断一次 STR R0,[R1] LDR R1,=TMOD ;使能定时器0 LDR R0,=&01 STR R0,[R1] B . ;循环等待中断发生 ;************************************************* ;Timer0 Interrupt Service Routine ;************************************************* IRQ_Handler STMFD SP!,{R0-R6,LR} LDR R1,=INTPND BL irq_exception LDMFD SP!,{R0-R6,LR} SUBS PC,LR,#4 END
irq_exception.c
#define IOPDATA (*(volatile unsigned *)0x3FF5008)
void irq_exception() { if(IOPDATA==0x0) IOPDATA=0xf; else IOPDATA=0x0; } |