您的位置 首页 培训

s3c6410—外部中止—key (根据OK6410)

今天来说一下s3c6410的外部中断:首先说一下外部中断:顾名思义,由s3c6410外部触发的中断就是外部中断,由s3c6410内部触发的是内部中…

今日来说一下s3c6410外部中止

首先说一下外部中止:望文生义,由s3c6410外部触发的中止便是外部中止,由s3c6410内部触发的是内部中止。

可是详细到咱们的板子上,究竟哪些是外部中止,哪些是内部中止呢?能够这样归纳,除了INT_EINT0—INT_EINT4之

外的都是内部中止。像watch dog便是内部中止,像key,wm9717触发的便是外部中止。

先说下外部中止从外设到cpu的详细流程:对了解中止很中重要!

外设——>GPIO——>VIC——>ARM1176

咱们编写关于中止的程序也是这个进程:

装备外设——>装备GPIO——>装备VIC——>装备ARM协处理器等

总归一句话:

你要打造一个通路能够让中止的电平改变能顺顺畅利的传送到ARM里!

下面就按照这个次序讲一下:

(一)、GPIO及其装备

为什么会有GPIO呢?由于外设都是连到GPIO上嘀!s3c6410具有187个多功能I/O端口,其实有127个用于外部中

断。这127个引角呢,能够分为这么10个分组:

这儿给咱们分一下:

EINT0 GPN0—>GPN15 GPL8—>GPL14 GPM0—>GPM4

EINT1 GPA0—>GPA7 GPB0—>GPB6

EINT2 GPC0—>GPC7

EINT3 GPD0—>GPD5

EINT4 GPF0—>GPF14

EINT5 GPG0—>GPG7

EINT6 GPH0—>GPH9

EINT7 GPO0—>GPO15

EINT8 GPP0—>GPP14

EINT9 GPQ0—>GPQ9

每个引脚能够对应一个外部中止。

那么当外部中止电平改变传GPIO里,除了对应端口的哪几个寄存器(CON,PUD,etc)GPIO里又有哪些寄存器会

对这个中止信号形成影响呢?看下面:

EINTXCON :装备触发方法,低电平,高电平,上升沿,下降沿。

EINTXPEND :这个现在用不到,一瞬间中止处理程序会用到,这个是pending register。

EINTXMASK :这儿能够屏蔽某个外部中止,要经过需求clear一下对应的中止位。默许是全屏蔽的,需求留意!

EINTXFLTCON : 这儿设置滤波方法,能够去毛刺。

咱们这儿要设置的是EINTXCON,EINTXMASK,EINTXFLTCON。

这样咱们的中止信号就能够顺畅经过GPIO了,又要到哪里去呢?其时是VIC向量中止控制器!

(抵达VIC

上面说的这些外部中止在GPIO里分成了九组,可是详细反应到VIC里他们占用哪些中止号呢?这儿贴一下:

NO SOURCES Description Group

0 INT_EINT0 External interrupt 0 ~ 3 VIC0
1 INT_EINT1 External interrupt 4 ~ 11 VIC0

32 INT_EINT2 External interrupt 12 ~ 19 VIC1

33 INT_EINT3 External interrupt 20 ~ 27 VIC1

53 INT_EINT4 External interrupt Group 1 ~ Group 9 VIC1

(前四个中止号 覆盖了EINT0,他们共用这四个中止号。53中止号覆盖了1—>9组中止引角,他们悲惨剧的共用一个中止号)

这儿咱们运用VIC,当然要先敞开VIC,这个是在协处理器里设置的 VE位

  1. //enableVE
  2. __asm____volatile__(
  3. “mrcp15,0,r0,c1,c0,0/n”
  4. “orrr0,r0,#(1<<24)/n"
  5. “mcrp15,0,r0,c1,c0,0/n”
  6. :
  7. :
  8. :”r0″
  9. );

这样咱们的VIC就能用了。

这儿就简略了,就这么几个重要的寄存器

VICXINTSELECT 挑选中止方法FIQ or IRQ。

VICXVECTADDR 设置中止处理程序的地址。

VICXINTENABLE 使能GPIO传过来的中止信号。

其实设置到这儿外部中止就能正确运行了,可是还有许多其他寄存器,比方设置什么优先级的,咱们假如需求就添上去。

(抵达ARM)

ARM得知来了个中止,就和VIC进行一系列的握手,得到VICADDRESS,就开端履行咱们的中止处理程序了。

另一个重要的内容,便是中止处理程序里铲除中止。

咱们要clear 一下EINTXPEND,clear 一下VICXADDRESS。有的人说要铲除一下VICXIRQSTATUS,可是我发现我铲除和不

铲除没什么差异,或许是我了解的不透,哪位高手看到了,费事告诉我一声,谢了!或许有人要闻,EINTXPEND和VICXADDRESS

铲除的次序,我要说:无所谓了。由于在ARM宣布VICIRQACK或许读VICADDRESS的时分,硬件主动屏蔽当时中止和比当时中止优先级

小的中止!可是不屏蔽更高优先级的中止。所以谁先谁后无所谓了,总归都清了就行了。

ARM把咱们的中止处理程序履行后,这个循环就完了,咱们的设置的就起了作用了。

下面我贴下OK6410 key中止的代码。

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

这儿解释一下,我为什么要把滤波设置去掉呢,由于我设置延时滤波,作用不大,数字滤波也没细心找适宜的宽度,这儿便是让咱们了解一下外部中止

究竟怎样一步步的履行的。更细节的东西,你能够在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形式下的栈地址。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/276915.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部