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

发布者:沭阳小黄同志最新更新时间:2016-06-23 来源: eefocus关键字:s3c6410  外部中断  key  OK6410 手机看文章 扫描二维码
随时随地手机看文章
   今天来说一下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. // enable VE  
  2. __asm__ __volatile__(  
  3.     "mrc p15,0,r0,c1,c0,0/n"  
  4.     "orr r0,r0,#(1<<24)/n"  
  5.                "mcr p15,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. #define VIC0INTENABLE (*(unsigned long volatile *)0x71200010)  
  3. #define VIC0INTSELECT (*(unsigned long volatile *)0x7120000C)  
  4. #define VIC0VECTADDR  (*(unsigned long volatile *)0x71200100)  
  5. #define VIC0IRQSTATUS (*(unsigned long volatile *)0x71200000)  
  6. #define VIC0ADDRESS (*(unsigned long volatile *)0x71200F00)  
  7. #define VIC0SOFTINT (*(unsigned long volatile *)0x71200018)  
  8. #define VIC1ADDRESS (*(unsigned long volatile *)0x71300F00)  
  9. #define VIC0INTENCLEAR (*(unsigned long volatile *)0x71200014)  
  10. // extern interrupt  
  11. #define EINT0CON0 (*(unsigned long volatile *)0x7F008900)  
  12. #define EINT0MASK (*(unsigned long volatile *)0x7F008920)  
  13. #define EINT0PEND (*(unsigned long volatile *)0x7F008924)  
  14. #define EINT0FLTCON0 (*(unsigned long volatile *)0x7F008910)   
  15. // GPN  
  16. #define GPNCON (*(unsigned long volatile *)0x7F008830)  
  17. #define GPNDAT (*(unsigned long volatile *)0x7F008834)  
  18. #define GPNPUD (*(unsigned long volatile *)0x7F008838)  
  19. int count =0;  
  20. void (*show)(char *,...) = (void *)0xc7e11650;  
  21. extern unsigned long print;  
  22. int main()  
  23. {  
  24.     /* enable VE (VIC ENABLE) */  
  25.     __asm__ __volatile__(  
  26.             "mrc p15,0,r0,c1,c0,0/n"  
  27.             "orr r0,r0,#(1<<24)/n"  
  28.             "mcr p15,0,r0,c1,c0,0/n"  
  29.             :  
  30.             :  
  31.             : "r0"  
  32.     );  
  33.     /* GPIO stuff */  
  34.     GPNCON &= 1<<2;  
  35.     GPNCON |= 0x2;                          // set GPNCON (0-1) to extern interrupt.  
  36.     GPNPUD &= ~(1<<2);                        // disable pull down/up.  
  37.     EINT0CON0 &= 1<< 3;  
  38.     EINT0CON0 |= 0x3;                       // set signal both edge trigger.  
  39. //  EINT0FLTCON0 |= (0x1 << 7);  
  40.     EINT0MASK &= ~(0x1);                    // clear the interrupt mask.  
  41.       
  42.     /* VIC stuff */  
  43.     VIC0VECTADDR = &print;  
  44.     VIC0INTSELECT &= ~(1<<0);  
  45.     VIC0INTENABLE |= 1<<0;  
  46.     return 0;  
  47. }  
  48. void __do_irq(void)  
  49. {  
  50.     show("hello extern interrupt./n");  
  51.     VIC0IRQSTATUS &= ~(1<<1);  
  52.     EINT0PEND = 1;  
  53.     VIC0ADDRESS = 0;  
  54.     VIC1ADDRESS = 0;                        // just in case.  
  55. }    
 

 

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

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

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

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

 

       汇编跳转的代码

 

  1. .global print  
  2. .extern __do_irq  
  3. print:  
  4.     mov sp,#0x52000000  
  5.     sub lr,lr,#4  
  6.     stmfd sp!,{r0-r14}  
  7.     bl __do_irq;  
  8.     ldmfd sp,{r0-r13,pc}^  

 

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

关键字:s3c6410  外部中断  key  OK6410 引用地址:s3c6410---外部中断---key (基于OK6410)

上一篇:深入理解ARM体系架构(S3C6410)---arm7,arm9,arm11区别
下一篇:ARM11---中断---向量中断控制器(VIC)---结合s3c6410

推荐阅读最新更新时间:2024-03-16 14:58

STM32_外部中断线/事件线理解
这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套。图中的蓝色虚线箭头,标出了外部中断信号的传输路径。 首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。 接下来是编号3的或门,这个或门的另一个输入是软件中断/事件寄存器
[单片机]
STM32_<font color='red'>外部中断</font>线/事件线理解
AVR128 外部中断 C程序
/*ATavr 128 功能:外部中断INT0、INT1*/ /*GCC编译器*/ #include avr/io.h #include util/delay.h #include avr/interrUpt.h #define SET_1(a,b) a|=(1 b) #define CLE_0(a,b) a&=~(1 b) #define uchar unsigned char #define uint unsigned int /*中断初始化,INT0、INT1、定义为下降沿触发*/ void int_init( void ) { cli(); EICRA|=(1 ISC11)|(1 ISC10); EIMSK|=
[单片机]
基于S3C6410的ARM11学习(五) 核心初始化之关闭看门狗
之前已经完成了设置中断向量表和设置处理器模式。下一步,就是要关闭看门狗。 看门狗,这个东西,在嵌入式系统里面是很常见的一个东西。这个是芯片预先做好的硬件,软件可以对硬件进行配置。说白了,这个东西就是一个定时器,定时器溢出的时候,如果设置开启看门狗的话,就会强制CPU复位。这样,好处就是防止程序跑飞。因为程序正常执行的时候,我们肯定是要对看门狗计数清零的,这样才能保证看门狗不会溢出,不会使CPU复位。 S3C6410的看门狗有两个功能: 作为常规定时器,并且可以产生中断 作为看门狗定时器,当计数器递减为0,产生复位信号。 下面是看门狗的框图
[单片机]
基于<font color='red'>S3C6410</font>的ARM11学习(五) 核心初始化之关闭看门狗
STM32学习笔记(六)---EXTI
EXTI: 外部中断/事件控制器 一、EXTI简介 外部中断/事件控制器包含多大23个用于产生事件/中断请求的边沿检测器。 每根输入线都可单独进行配置:选择类型(中断/事件)和相应的触发事件(上升沿、下降沿或边沿触发) 每根输入线可单独屏蔽。 注意:检测脉冲宽度低于APB2时钟宽度的外部信号 二、EXTI框图 EXITI可分为两大功能:产生中断和产生事件 1. 产生中断 红色虚线指示的流程 编号1:输入线可以通过寄存器设置为任意一个GPIO,也可以是一些外设的事件。 编号2:边沿检测电路检测到EXTI_RTSR(上边沿寄存器)或EXTI_FTSR(下边沿寄存器)有效信号就输出1无效信号输出0 编号3:或门电
[单片机]
STM32学习笔记(六)---<font color='red'>EXTI</font>
STM32系统学习——EXTI外部中断
一、 EXTI 简介 EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 二、 EXTI 功能框图 EXTI 的功能框图包含了 EXTI 最核心内容,掌握了功能框图,对 EXTI 就有一个整体的把握,在编程时思路就非常清晰。EXTI功能框图见图。 在图可以看到很多在信号线上打一个斜杠并标注“20”字样,这个表示在控制器内部类似的信号线路有 20 个,这
[单片机]
STM32系统学习——<font color='red'>EXTI</font>(<font color='red'>外部中断</font>)
EXIT外部中断实验——EXTI
外部中断概述: STM32的每个IO都可以作为外部中断输入。 STM32的中断控制器支持19个外部中断/事件请求: 线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。 I/O口映像图: 每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。 STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,其中映射关系为: GPIOx.0映射到EXTI0 GPIOx.1映射到EXTI1 … GPIOx.15映射到EXTI15 (x为A-G) 注意:同一时间,只能有同一IO口映射到中断
[单片机]
EXIT<font color='red'>外部中断</font>实验——<font color='red'>EXTI</font>
外部中断实验
一。外部中断的概述 1. 对于51系列单片机只有2个外部中断输入引脚,外部中断0和外部中断1 而STM32的每一个IO口都可以作为外部中断输入。 2. STM32F103系列单片机中断控制器支持19个外部中断请求。 线0-15对应外部IO口的输入中断。 线 16:连接到 PVD 输出。 线 17:连接到 RTC 闹钟事件。 线 18:连接到 USB 唤醒事件。 3. 对于每一个中断线都可以独立的配置触发方式:上升沿,下降沿或双边沿触发。 二。 GPIO与中断线的映射 GPIO与中断线的映射关系图 GPIOx.0映射到外部中断线EXTI0 GPIOx.1映射到外部中断线EXTI1 ...... GPIOx.15映射
[单片机]
<font color='red'>外部中断</font>实验
电容式Touch Key实现便携产品省电轻薄的设计
随着近年来触摸技术在各个不同市场的普及,各种触摸技术迅速发展,其中尤以电容式触摸应用发展最快。A1semi继电阻式触摸控制芯片在手机市场的广泛应用后,又推出了电容感应式触摸按键芯片。相比较传统的机械式按键和电阻式触摸按键,电容式触摸手感流畅、触摸屏透光性、面板强固耐受、防尘、防水及防电磁,不受强光信号干扰、成本低等特点。 A1semi的电容式触摸方案AS9048基于RC采样原理,如下图,电容值(C)由两部分组成:固定电容(电极电容)和感应电容(当人手接触或者靠近电极时,由人手带来的电容)。电极电容应该尽可能的小,以保证检测到人手触摸。通过测量触摸电极电容的微小变化,来感知人体对电容式触摸感应器(按键、滚轮或者滑条)的触摸。
[手机便携]
电容式Touch <font color='red'>Key</font>实现便携产品省电轻薄的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved