微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > s3c6410---外部中断---key (基于OK6410)

s3c6410---外部中断---key (基于OK6410)

时间:11-09 来源:互联网 点击:

  1. *(unsignedlongvolatile*)0x71200014)
  2. //externinterrupt
  3. #defineEINT0CON0(*(unsignedlongvolatile*)0x7F008900)
  4. #defineEINT0MASK(*(unsignedlongvolatile*)0x7F008920)
  5. #defineEINT0PEND(*(unsignedlongvolatile*)0x7F008924)
  6. #defineEINT0FLTCON0(*(unsignedlongvolatile*)0x7F008910)
  7. //GPN
  8. #defineGPNCON(*(unsignedlongvolatile*)0x7F008830)
  9. #defineGPNDAT(*(unsignedlongvolatile*)0x7F008834)
  10. #defineGPNPUD(*(unsignedlongvolatile*)0x7F008838)
  11. intcount=0;
  12. void(*show)(char*,...)=(void*)0xc7e11650;
  13. externunsignedlongprint;
  14. intmain()
  15. {
  16. /*enableVE(VICENABLE)*/
  17. __asm____volatile__(
  18. "mrcp15,0,r0,c1,c0,0/n"
  19. "orrr0,r0,#(1<24)/n"
  20. "mcrp15,0,r0,c1,c0,0/n"
  21. :
  22. :
  23. :"r0"
  24. );
  25. /*GPIOstuff*/
  26. GPNCON&=1<2;
  27. GPNCON|=0x2;//setGPNCON(0-1)toexterninterrupt.
  28. GPNPUD&=~(1<2);//disablepulldown/up.
  29. EINT0CON0&=1<3;
  30. EINT0CON0|=0x3;//setsignalbothedgetrigger.
  31. //EINT0FLTCON0|=(0x1<7);
  32. EINT0MASK&=~(0x1);//cleartheinterruptmask.
  33. /*VICstuff*/
  34. VIC0VECTADDR=&print;
  35. VIC0INTSELECT&=~(1<0);
  36. VIC0INTENABLE|=1<0;
  37. return0;
  38. }
  39. void__do_irq(void)
  40. {
  41. show("helloexterninterrupt./n");
  42. VIC0IRQSTATUS&=~(1<1);
  43. EINT0PEND=1;
  44. VIC0ADDRESS=0;
  45. VIC1ADDRESS=0;//justincase.
  46. }

这里解释一下,我为什么要把滤波设置去掉呢,因为我设置延时滤波,效果不大,数字滤波也没仔细找合适的宽度,这里就是让大家理解一下外部中断

到底怎么一步步的执行的。更细节的东西,你可以在ARM1176的datasheet和向量中断控制器PL192的datasheet里找。

好了,就写到这里了,我想可以大家应该可以明白,如果明白了就在下面顶一下,如果不明白的或者错误的就在下面说下。谢谢!

另外感谢↘`莫、離的提醒。

汇编跳转的代码

  1. .globalprint
  2. .extern__do_irq
  3. print:
  4. movsp,#0x52000000
  5. sublr,lr,#4
  6. stmfdsp!,{r0-r14}
  7. bl__do_irq;
  8. ldmfdsp,{r0-r13,pc}^

这是两个文件,汇编的主要用于模式跳转,设置irq模式下的栈地址。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top