s3c6410---外部中断---key (基于OK6410)
时间:11-09
来源:互联网
点击:
- *(unsignedlongvolatile*)0x71200014)
- //externinterrupt
- #defineEINT0CON0(*(unsignedlongvolatile*)0x7F008900)
- #defineEINT0MASK(*(unsignedlongvolatile*)0x7F008920)
- #defineEINT0PEND(*(unsignedlongvolatile*)0x7F008924)
- #defineEINT0FLTCON0(*(unsignedlongvolatile*)0x7F008910)
- //GPN
- #defineGPNCON(*(unsignedlongvolatile*)0x7F008830)
- #defineGPNDAT(*(unsignedlongvolatile*)0x7F008834)
- #defineGPNPUD(*(unsignedlongvolatile*)0x7F008838)
- intcount=0;
- void(*show)(char*,...)=(void*)0xc7e11650;
- externunsignedlongprint;
- intmain()
- {
- /*enableVE(VICENABLE)*/
- __asm____volatile__(
- "mrcp15,0,r0,c1,c0,0/n"
- "orrr0,r0,#(1<24)/n"
- "mcrp15,0,r0,c1,c0,0/n"
- :
- :
- :"r0"
- );
- /*GPIOstuff*/
- GPNCON&=1<2;
- GPNCON|=0x2;//setGPNCON(0-1)toexterninterrupt.
- GPNPUD&=~(1<2);//disablepulldown/up.
- EINT0CON0&=1<3;
- EINT0CON0|=0x3;//setsignalbothedgetrigger.
- //EINT0FLTCON0|=(0x1<7);
- EINT0MASK&=~(0x1);//cleartheinterruptmask.
- /*VICstuff*/
- VIC0VECTADDR=&print;
- VIC0INTSELECT&=~(1<0);
- VIC0INTENABLE|=1<0;
- return0;
- }
- void__do_irq(void)
- {
- show("helloexterninterrupt./n");
- VIC0IRQSTATUS&=~(1<1);
- EINT0PEND=1;
- VIC0ADDRESS=0;
- VIC1ADDRESS=0;//justincase.
- }
这里解释一下,我为什么要把滤波设置去掉呢,因为我设置延时滤波,效果不大,数字滤波也没仔细找合适的宽度,这里就是让大家理解一下外部中断
到底怎么一步步的执行的。更细节的东西,你可以在ARM1176的datasheet和向量中断控制器PL192的datasheet里找。
好了,就写到这里了,我想可以大家应该可以明白,如果明白了就在下面顶一下,如果不明白的或者错误的就在下面说下。谢谢!
另外感谢↘`莫、離的提醒。
汇编跳转的代码
- .globalprint
- .extern__do_irq
- print:
- movsp,#0x52000000
- sublr,lr,#4
- stmfdsp!,{r0-r14}
- bl__do_irq;
- ldmfdsp,{r0-r13,pc}^
这是两个文件,汇编的主要用于模式跳转,设置irq模式下的栈地址。
s3c6410外部中断keyOK641 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)