您的位置:首页 > 其它

tiny210(S5PV210)中断控制相关学习记录

2014-08-19 11:58 225 查看
简述一下210的中断情况,内置了4个VIC(vectored interrupt controler)中断控制器,型号是ARM的PL192控制器,4个VIC加起来支持93个中断源。

配置中断时,主要涉及4个方面的配置:

1.异常向量表的设置。

2.中断源的配置。

3.中断控制器的配置。

4.处理器内核配置。

1.中断源的相关寄存器:

         当需要开启中断时,则需要对中断源进行相应的配置,这里主要记录常用的外部中断的配置。外部中断的配置主要是对引脚的配置,涉及的寄存器主要分为两组。

         一组是EINT0~16,涉及的寄存器主要是EXT_INT_x_CON,EXT_INT_xMASK,EXT_INT_PEND。EXT_INT_x_CON是外部中断的的配置寄存器,主要配置中断的触发方式;EXT_INT_xMASK是外部中断的屏蔽寄存器,配置引脚的中断是否屏蔽;EXT_INT_PEND是外部中断的中断未决寄存器,中断结束时必须清楚相应位,否则会持续引发中断。

         另一组的则是其余的GPIO的中断,他们复用一个中断线路,涉及的寄存器主要是GPxx_INT_CON,GPxx_INT_MASK,GPxx_INT_PEND。各寄存器功能跟第一组的类似。

2.中断控制器的相关寄存器:

       VICxINTSELECT——中断类型选择寄存器,通过此寄存器选择是IRQ还是FIQ。

       VICxINTENABLE——中断使能寄存器,通过此寄存器使能相应的中断线路。

       VICxINTENCLEAR——中断使能清除寄存器(即失能),在控制器禁止某路中断在该寄存器设置。

       VICxIRQSTATUS——普通中断请求状态寄存器,记录了经VICxINTENABLE和VICxINTSELECT过滤后的IRQ中断请求状态。

       VICxFIQSTATUS——普通中断请求状态寄存器,记录了经VICxINTENABLE和VICxINTSELECT过滤后的FIQ中断请求状态。

       VICxRAMINTR——原始中断请求寄存器,记录了未经VICxINTENABLE和VICxINTSELECT过滤后的中断请求状态。

       VICxSOFINT——软件中断寄存器,通过该寄存器可使控制器产生相应线路的中断信号,该信号未经过优先级,VICxINTENABLE和VICxINTSELECT等寄存器的过滤。

       VICxSOFINTCLEAR——软中断清除寄存器,在ISR(中断服务程序)结束时要清除该寄存器相应位来清除中断,否则该中断会持续触发。

        VICxVECTADDRx——向量地址寄存器,该寄存器保存的是相应线路的ISR的地址。

        VICxVECTPRIORITYx——保存相应相应线路的优先级,有16个优先级,0的优先级最高,当多个相同优先级的线路同时请求中断时,按硬件优先级排序,同一组中断,中断好越低优先级越高,如VIC0中,EINT0优先级;如正在执行某ISR时,又一同软件优先级的但硬件优先级高的线路请求中断,此时该中断被屏蔽,要当前ISR执行完毕才可受理。

        VICxSWPRIORITYMASK——软件优先级屏蔽,可设置屏蔽相应的优先级,屏蔽后则相应优先级的中断被屏蔽。

        VICxADDRESS——保存当前活跃的中断线路的ISR地址,读取一次该寄存器意味着当前活跃的中断请求已被标志为已服务,此操作只能在进入中断处理时执行;向该寄存器写如任意值表示清楚控制器中该路中断状态,此操作只能在ISR结尾处执行。

        VICxPROTECTION——控制器保护模式配置寄存器,配置为保护模式时,中断控制器的寄存器只能在特权模式下被访问;非保护模式时,用户模式和特权模式都可以访问中断控制器的寄存器。VICxPROTECTION只能在特权模式下访问。

3.处理器内核配置主要是配置CPSR寄存器,配置相应中断控制位为允许中断。

寄存器介绍完毕,接下来再捋一遍外部中断的配置过程:

1.异常向量表的设置:

       设置好中断向量,异常向量表的地址为:0xD0037400。

2.中断源的配置:

       (1)配置管脚的功能为中断(GPIOCON)。

       (2)配置中断的触发方式(EXT_INT_x_CON)。

       (3)配置不屏蔽该管脚的中断(GPxx_INT_MASK)。

3.中断控制器的配置:

       (1)选择中断的类型(VICxINTSELECT)。

       (2)配置中断优先级(VICxVECTPRIORITYx)。

       (3)注册中断处理程序(VICxVECTADDRx)。

       (4)使能该中断(VICxINTENABLE)。

4.处理器内核的中断配置:

       主要是配置相应中断控制位为允许中断。

清除中断

    中断服务程序完成前写VICxADDRESS

    清除中断未决寄存器EXT_INT_PEND相应位

遗留问题:

1.daisy-chain指的是”链式“的意思?

2.4个VIC控制器之间的优先级问题?优先级是按代码写的来变还是说有固定的优先级?

3.异常向量为何在0xD0037400,而且存放的是跳转地址,而不是一条跳转指令?异常向量表地址为何不是在0x00000000或者0xffff0000?

4.其他中断源的配置,如UART等,需要外部管脚作为触发中断?

已找到问题3的答案:

       一般ARM的异常向量表存放的确实是跳转指令,异常向量表的其实地址确实是在0x00000000或者0xFFFF0000。而写裸机代码时,S5PV210的0xD0037400这个地址其实是一个被设置为存放异常向量表的地方而已。详述如下:

       先看看210的0x0地址并不是内存,而是IROM(interal ROM),此外,内部还集成了一块IRAM,地址分布如下:





            那块IROM中集成了一些初始化代码,初始化的空间用途如上,其实真正意的中断向量表就是IROM中,发生异常时,PC跳转至0x0地址处的异常向量表,而IROM中的代码通过某种方式从地址0xD003_7400处加载异常处理函数的地址,具体是怎样加载的就不清楚了。所以我们写裸机代码时,用到异常时,通过向0xD003_7400地址存入相关异常服务函数就可以了,异常向量表的设置就OK了。

          不过真正的异常向量表保存在IROM的ox0地址中,运行速度慢,频繁发生异常时运行性能肯定会大大降低。所以通常情况下,我们会使用MMU来进行系统空间地址的重映射,将内存设为0x0地址,然后将异常向量表设置在内存中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息