/************************************/<br /><br /><br />NoInt EQU 0x80<br /><br />USR32Mode EQU 0x10<br />SVC32Mode EQU 0x13<br />SYS32Mode EQU 0x1f<br />IRQ32Mode EQU 0x12<br />FIQ32Mode EQU 0x11<br /><br /> CODE32<br /><br /> AREA IRQ,CODE,READONLY<br /><br /> MACRO<br />$IRQ_Label HANDLER $IRQ_Exception_Function<br /><br /> EXPORT $IRQ_Label ; The label for exports 输出的标号<br /> IMPORT $IRQ_Exception_Function ; The imported labels 引用的外部标号<br /><br />$IRQ_Label<br /> SUB LR, LR, #4 ; Calculate the returning address 计算返回地址<br /> STMFD SP!, {R0-R3, R12, LR} ; Protects the task environments 保存任务环境<br /> MRS R3, SPSR ; Protects the status variable 保存状态<br /> STMFD SP, {R3,LR}^ ; Protects SPSR and SP in user status, Notice: DO NOT write back.保存SPSR和用户状态的SP,注意不能回写<br /> ; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP<br /> NOP<br /> SUB SP, SP, #4*2<br /><br /> MSR CPSR_c, #(NoInt | SYS32Mode) ; Switch to the System Mode 切换到系统模式 <br /> <br /> BL $IRQ_Exception_Function ; call the C interrupt handler funtion 调用c语言的中断处理程序<br /><br /> MSR CPSR_c, #(NoInt | IRQ32Mode) ; Switch bak to IRQ mode 切换回irq模式<br /> LDMFD SP, {R3,LR}^ ; Recover SPSR and SP in user status, Notic: DO NOT write back. 恢复SPSR和用户状态的SP,注意不能回写<br /> ; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP<br /> MSR SPSR_cxsf, R3<br /> ADD SP, SP, #4*2 ; <br /><br /> LDMFD SP!, {R0-R3, R12, PC}^ ;<br /> MEND<br /><br />;/* 以下添加中断句柄,用户根据实际情况改变 */<br />;/* Add interrupt handler here,user could change it as needed */<br /><br />;Timer0_Handler HANDLER Timer0<br />Timer1_Handler HANDLER Timer1<br />I2C_Handler HANDLER I2C<br /> END<br />/************************************/<br />其中<br />Timer1_Handler HANDLER Timer1<br />I2C_Handler HANDLER I2C<br />是我自己加的,<br />写中断函数,Timer1,I2C都没有加关键字“_irq”<br />初始化IRQ中断时,是初始化Timer1_Handler,I2C_Handler,<br />编译的时候出现错误,说是undefined。<br />这个应该怎么解决呢?<br />还有,中断嵌套还有什么要注意的<br /> |
|