资源描述:
《中断硬件驱动代码分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、中断硬件驱动代码分析ARM-Week-1Learn-lumit-Step-15.中断按钮实验1,int0_driver.cintint0_open(void){初始化IO端口专用寄存器//setgpio'sdirection:setIOPMODregistermodebitto0=inputIOPMOD=IOPMOD&(~0x00000100);即把IOPMOD的第8位(9端口)清零,也就是设置为输入模式。//unmasktheswitchinterrupt...........INTMSK&=~((1<<21)
2、(1<<0));~((1<<21)
3、(1<<0))=~(100000000
4、0000000000000
5、1)=0111111111111111111110也就是要把INTMSK的22位和0位清零(开启中断控制器,开启外部中断控制0)。return0;}intint0_ioctl(unsignedintcmd,unsignedlongarg){switch(cmd)INT0_IO_ENABLE宏定义值为(1<<4)INT0_IO_ACTIVE_HIGH宏定义值为(1<<3)INT0_IO_RISING_EDGE宏定义值为(0x01)INT0_IO_FALLING_EDGE宏定义值为(0x02)INT0_IO_BOTH_EDGE宏定义值为(0x03){//Enable
6、interruptrequestandUnmaskPIO8interruptcaseINT0_ENABLE_INTERRUPT:IOPCON
7、=INT0_IO_ENABLE;INT0_IO_ENABLE为10000。把IO端口控制寄存器第4位置1,即开启XIRQ0。break;//clearint0pendinginterruptscaseINT0_CLEAR_INTERRUPT:INTPND
8、=INT0_MASK;INTO_MASK宏定义值为1,把INTPND第0位值1,即把外部中断0清0。break;//setrisingedgeinterruptcaseINT0_RISING_EDG
9、E_INTERRUPT:IOPCON
10、=INT0_IO_RISING_EDGE;设置中断为上升沿触发;break;//setfallingedgeinterruptcaseINT0_FALLING_EDGE_INTERRUPT:IOPCON
11、=INT0_IO_FALLING_EDGE;设置中断为下降沿触发;break;//setbothedgeinterruptcaseINT0_BOTH_EDGE_INTERRUPT:IOPCON
12、=INT0_IO_BOTH_EDGE;设置中断为下降/上升沿都触发;break;//setasactivehighcaseINT0_ACTIVE_HIGH:IO
13、PCON
14、=INT0_IO_ACTIVE_HIGH;设置中断为电平触发;break;default:break;}return0;}2,startup.smovr0,#0xd2;makeirqmodewithallirqsdisabledmsrcpsr_cxsf,r0MOVsp,#0x70000设置IRQ模式的栈指针。movr0,#0xd3;makesvcmodewithallirqsdisabledmsrcpsr_cxsf,r0MOVsp,#0x80000设置SVC模式的栈指针。*******************************************************
15、***************;*GettheaddressoftheCentrypoint.;**********************************************************************LDRlr,=__main保存__main的入口地址**********************************************************************;*Enabletheinterruptwhilestayinginthesupervisormode;********************************
16、**************************************MOVr0,#Mode_Svc:OR:F_BitMSRcpsr_c,r0MOVpc,lrIMPORTdo_irqEXPORTirq_handlerirq_handlerSUBlr,lr,#4STMFDsp!,{r0-r12,lr};pushr0-r12registerfileandlr(pcreturnaddress)MRSr4,spsrSTMF