嵌入式外部中断控制编程方法论—比較CC2541(51核)和S5PV210(ARM核)

这是一篇阐述怎样对嵌入式SOC外部中断进行控制编程的方法论文章。希望读者理解本篇文章后。能够具备对市场上全部已经面世和将来面世的嵌入式芯片的外部中断进行控制编程的能力。

笔者原创的技术分享一直都恪守下面原则:

从需求的角度去理解嵌入式各种软件和硬件模块的作用和组成。并从芯片系统设计的角度去阐述怎样进行控制编程。

前者对于理解复杂的系统(如linux的各个子系统)是非常有效的;后者所讲的是代表一个芯片设计project师的视觉,芯片模块由他负责设计,他对于该模块的控制编程自然是最有发言权的。

笔者还想传递给读者一个重要的嵌入式控制理论的观点:

不同SOC芯片中的相似功能模块(比如51内核?集成的TIMER和ARM内核集成的TIMER)的设计理念是基本一致的,虽然各家集成电路厂商的制程工艺、总线技术标准、功耗等技术不一样,但对于编程人员来说,相似功能模块呈现的硬件接口(即寄存器编程)是基本一致的。不管是基于高级ARM核、MIPS核。还是基于简单的51核。各个核所集成的时钟控制、GPIO、中断、TIMER等模块的设计都是相仿的。当中最重要的原因就是。目标模块所完毕的目标功能(能够理解为硬件需求)都是一样的,即ARM核的中断和51核的中断,其完毕的功能是一样的,GPIO完毕控制功能也是一样的。

所以,笔者希望从系统设计的角度来阐述GPIO外部中断的控制编程。使读者能够跳开某个详细芯片而掌握全部芯片的GPIO外部中断的控制编程。

一、       中断综述

细细数来,笔者已经针对中断写了三篇文章了。

每篇篇幅都非常大。阐述的重点都不一样。这里给出參考。大家如有时间能够先系统地看完这三篇文章。再来阅读本文。

《软件和硬件都是对生活的高度抽象---论中断控制(ARM体系编程)》, 摘要是:硬件模块设计又是高度抽象于现实需求。非常多时候,X86、ARM和MIPS仅仅有底层寄存器和指令级别的差异,对于软件驱动基本是一致的。本文论及ARM体系的中断控制。以基于Cortex-A8的S5PV210为例。中断是一种异步工作机制,也是嵌入式处理器的一个核心工作机制,对于实时操作系统来说不可缺少。

《从需求的角度去理解Linux之二:Linux中断全然分析》, 摘要是:学习本文将能够对linux中断有全面而又深刻的认识。本文对Linux中断所涉及的需求、管理机制、中断实现、中断接口(上半部和下半部)、驱动使用进行全然分析。

《体系编程、SOC编程那些事儿》, 摘要是:笔者将从芯片IC的系统设计的角度去诠释怎样掌握体系编程和SOC编程。笔者有超过10年的嵌入式研发经验,作为架构师多次主导过多媒体SOC研发并成功量产案例,在高端处理器体系编程和嵌入式Linux方面有丰富的教学经验,希望本文能给嵌入式学习者和从业者有较深刻的指引。

二、       外部中断控制设计框图

外部中断控制是在中断控制模块上接入GPIO,外部中断就是GPIO中断控制。外部中断控制的核心是中断支持GPIO边沿触发、电平触发。设计框图例如以下,该图是TI蓝牙单芯片CC2541的中断控制框图局部,CC2541基于8051内核。

从之前的參考文章,我们能够知道,要完毕中断控制功能,必须下面组成部分:

  1. 中断源。中断源索引。
  2. 优先级寄存器(priority)。优先级高的中断会先响应。
  3. 中断屏蔽寄存器(mask)。或者称为选通寄存器(enable)。芯片的上电状态往往是屏蔽全部中断源。除了对某个中断源进行屏蔽外,一般都会有一个全局中断开关。
  4. 中断状态寄存器(pending),中断发生后。相应bit会置1。中断运行后应该软件对其清0.
  5. 中断向量地址,中断发生后。PC会从该地址開始运行。中断服务程序的第一条指令应该设置在该处。并跳转到中断服务子程序。

三、       外部中断控制设计分析

针对以上框图。我们来进行解构分析。

1.中断分级

曾记得,8位单片机鼻祖80251的外部仅仅有2个引脚。中断控制仅仅有一级。那么这里为什么要分两级呢?那是由于80251仅仅有简单的外部中断、timer中断等中断源,而蓝牙单芯片不仅集成timer,还有串口,DMA、射频、PWM等等,并且GPIO P0,P1,P2大部分引脚都能够复用为中断引脚,因此中断源有非常多。而8位单片机的中断指示pending寄存器就仅仅有8个bit,怎么能够表述那么多中断源呢?仅仅有中断分级来解决,将中断源分为一级中断和二级中断。

2.一级中断控制

一级中断的中断源一般以子模块为单位,即串口1给出一个中断源,串口2给出一个中断源,P1(8个引脚)给出一个中断源。TIMER0给出一个中断源,TIMER1给出一个中断源。

每一个中断源都相应下面寄存器或者寄存器位:

一级pending位,代表该中断产生中断(仅仅是中断产生,CPU并不一定响应)。

一级mask选通位,选通该位才同意中断。

全局中断mask位,这个bit是全局中断开关,必须要同意才干使用CPU的中断控制。

一级中断矢量寄存器。代表中断后PC跳转的地址。

一级优先级位,当多个中断源同一时候产生时,CPU将选择最高优先级的中断源相应的中断矢量地址进行PC跳转响应。

从中,我们看出,一级pending位在中断响应里面要主动去清零,否则中断会反复产生。

3.二级中断控制

二级中断的中断源以子模块内部的子功能为单位。如串口1的接收中断、发送中断,P1的8个引脚P1.0。P1.1。…P1.7的引脚中断。

这些中断源都会接入到相应的或电路。并输出一个中断源,作为一级中断源。

各个二级中断源相同相应下面寄存器或者寄存器位:

二级pending位,代表该中断产生中断(仅仅是中断产生,CPU并不一定响应)。

二级mask选通位,选通该位才同意中断。

对于GPIO外部中断来说,还须要配置下面寄存器:

二级边沿触发位,每一个引脚都要配置相应的触发方式,上升沿。下降沿还是高低电平触发。

此外。我们还须要谨记,在《体系编程、SOC编程那些事儿》提到,CLOCK和引脚复用是SOC各模块的公共组成部分。所以模块都须要先配置这两个模块。对于GPIO来说,时钟一般按上电默认设置就可以。但引脚的复用设置通常是普通的GPIO。而不是中断功能。

因此,我们还须要对GPIO的中断进行配置,将其设置为中断功能。

相同,中断响应里面须要对二级pending位清0,否则会反复中断。

4.中断响应

一般在有操作系统的固件中,中断都有一个统一的入口,然后按优先级查询一级pending位。以做出响应服务。假设要进一步提高中断响应速度,将各个详细的中断服务程序入口直接放到相应中断矢量地址上。

记得清一级pending和二级pending。

四、       外部中断控制编程方法

理解了以上外部中断控制的设计框图。进行控制编程应该是非常easy的。各种不同SOC的中断控制的设计都是一致的。不同的是代表各部分的寄存器的命名是不一样的。一般的方法过程是:

1.   找出各个详细的SOC datasheet的中断控制框图。

2.   分别找出中断控制框图中的代表各部分的寄存器或者寄存器位。并依据datasheet的指示值进行配置控制。

3.   对于GPIO中断控制来说,包含一级中断、二级中断、引脚复用配置。这对全部SOC都是一致的。

五、51核CC2541外部中断编程

我们依照以上方法找到分别相应的寄存器,假设我们先要对P1.2进行下降沿触发控制。

1.   一级中断

一级pending

一级mask选通

二级pending位

二级mask选通位

二级边沿触发

GPIO引脚复用,P1.2要设置为1,选择为中断功能。

六、ARM核S5PV210外部中断控制编程

请參考《软件和硬件都是对生活的高度抽象---论中断控制(ARM体系编程)》。

七、不同SOC外部中断控制的可能差异

以上我们阐述了外部中断控制的设计和编程。当中强调的一致性。接下来。我们说说不同SOC中断控制的可能差异。这些差异跟SOC的应用场景有关。

1.   低端SOC的中断源少,可能仅仅有一级中断。

2.   低端SOC使用8位核或者16位核,一个pending位最多表示8个或者16个中断源,而中断源可能超过16个。因此一级中断源可能由多个寄存器来表达。CC2541即是这样。

3.   高级SOC的中断更强调快递响应,特别针对某一类对时间要求特别高的中断源。提供高速中断响应模式。一般的场景则使用普通中断响应。即有FIQ和IRQ方式。基于ARM核的SOC即是这样。我们都知道在中断响应里面,中断上下文要先保存用户态上下文,而FIQ高速中断响应则不须要保存用户态上下文,由于在FIQ状态有单独的一组寄存器供服务程序使用。这组寄存器跟用户态上下文的寄存器组是无关的。

4.   在统一的中断服务入口里面,可能会依照pending的优先级来查询并响应,但假设硬件能够自己主动判别最高优先级。那么响应里面就能够直接读这个寄存器的值来跳转就可以,避免for循环遍历,以提高响应性能。

S5PV210的中断响应即支持这样的机制。

怎样。有信心以不变应万变了吗?


很多其它嵌入式和物联网原创技术分享请关注微信公众号:嵌入式企鹅圈


时间: 2024-11-05 13:38:04

嵌入式外部中断控制编程方法论—比較CC2541(51核)和S5PV210(ARM核)的相关文章

STM32之外部中断控制

一.STM32外部中断 1.STM32外部中断结构图 如上图所示: 主要包括四个环节,GPIO.AFIO.EXTI.NVIC. 2.STM32外部中断软件配置步骤 ① 配置NVIC控制器 ② 使能GPIO和AFIO时钟 ③ 配置GPIO (复用功能的输入输出配置) ④ 配置AFIO (选定要配置为EXTI的I/O口线) ⑤  EXTI控制器的配置 配置寄存器就好像是我们在更改STM32的硬件电路,让它们处于一种新的工作状态--外部中断模式. 二.STM32外部中断软件配置细节 以PA0引脚的外部

软件和硬件都是对生活的高度抽象---论中断控制(ARM体系编程)

不同的芯片体系设计在集成电路系统设计阶段其实都遵循大体一致的设计思想,芯片设计发展那么多年,真正为人所熟知的就是X86架构和ARM架构,当然还有日渐没落的MIPS,其他都是一些简单的控制器芯片体系.而硬件模块设计又是高度抽象于现实需求,很多时候,X86.ARM和MIPS只有底层寄存器和指令级别的差异,对于软件驱动基本是一致的.本文论及ARM体系的中断控制,以基于Cortex A8的S5PV210为例.中断是一种异步工作机制,也是嵌入式处理器的一个核心工作机制,对于实时操作系统来说必不可少. 1.

「ZigBee模块」基础实验(3)外部中断

1.实现功能 使用中断方式实现: 按键KEY1按下LED1依次亮灭 按键KEY2按下LED2依次亮灭 2.元件连接方式 P1_0连接LED1 P1_1连接LED2 P0_0连接KEY1 P0_1连接KEY2 3.中断相关寄存器 PXIEN P0IEN P1IEN P2IEN 地址 0xAB 0x8D 0xAC PX[7:0] 各个控制口中断使能 (0:中断禁止 1:中断使能) PICTL: D0~D3设置各个端口的中断触发方式(0:上升沿触发 1:下降沿触发) D7控制I/O引脚在输出模式下的驱

第17章 EXTI—外部中断/事件控制器

上一章节我们已经详细介绍了NVIC,对STM32F7xx中断管理系统有个全局的了解,我们这章的内容是NVIC的实例应用,也是STM32F7xx控制器非常重要的一个资源.学习本章时,配合<STM32F76xxx参考手册>系统配置控制器以及中断和事件章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分. 特别说明,本书内容是以STM32F767xx系列控制器资源讲解. 17.1  EXTI简介 外部中断/事件控制器(EXTI)管理了控制器的25个中断/事件线.每个中断/事件线都对应有一个边沿检测

STM32F103外部中断编程

STM32F103外部中断编程   中断,顾名思义就是停下手头的活,去干另外一件急活,干完急活然后回来继续干手头的活. 单片机和人一样,有时候也有更急的程序需要执行,执行完之后再回来执行之前正在执行的程序.今天就来试试如何让单片机中断当前任务,执行其他任务. 先看看我的实验板上做外部中断要用的资源:         如上图,板子的下面有三个独立按键,右下边有三个贴片的LED,其中这两部分的电路图如下图所示: 1.独立按键电路: 由上图可知,三个独立按键分别接在STM32的PB7.PB8.PB9引

外部按键 控制 LED 中断 (参考 http://www.oschina.net/question/565065_115196?sort=time )

转帖: http://www.oschina.net/question/565065_115196?sort=time 实验目的: mini2440开发板上有6个按键,将其中的前4个按键设为外部中断方式,当按下K1时,LED1亮:当按下K2时,LED2亮:当按下K3时,LED3亮:当按下K4时,LED4亮. 首先我们先了解一下 mini2440 按键和LED接口:     GPBCON 地址: 0x56000010 (LED 灯可以参考流水灯的随笔) 按键接口电路如图2所示,当按键没有按下时,G

嵌入式单片机,外部中断,中断标志位介绍

body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-chil

stm32中断优先级管理与外部中断编程

stm32中断优先级管理与外部中断编程 中断优先级管理 外部中断编程 原文地址:https://www.cnblogs.com/-wenli/p/10633445.html

嵌入式02 STM32 外部中断实验

一.中断 由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理事件的一个程序.该程序执行完成后,CPU接着执行被暂停的程序.这个过程称为中断.(我正在捉泥鳅,但是我妈喊我回家吃饭,我必须回家吃饭,回家途中,发现泥鳅没带,回去把泥鳅带回家,然后吃完饭继续捉泥鳅!!!) 中断是CPU处理外部突发事件的一个重要技术.引起中断的原因或者说发出中断请求的来源叫做中断源.根据中断源的不同,可以分为硬件中断和软件中断两大类,有了中断,系统可以更好更快的利用有限的系统资源解决系统响应速度和运行效率的一