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