提示:本文内容参考慕课课程:《ARM微控制器与嵌入式系统》
文章目录
一、中断
1.中断 vs 轮询
轮询:
- 周期/连续的检查外部事件是否发生
- 消耗大量CPU的处理时间
- 轮询过程需要和其他功能代码结合
- 由于CPU需要处理其他事件(可能是无关紧
要的),可能丢失关键事件
• 适于处理对时间响应要求低的场合
• 程序设计简单
中断
- 由硬件来判断是否发生外部事件并通知CPU
- 专用的中断服务程序来处理事件
• 适于处理对响应要求非常高的事件
• 适于处理持续事件非常短的事件
• 适于低功耗的应用
• 程序设计较复杂
2. 中断的流程
中断是一个需要CPU立刻处理的内部/外部事件。
• 内部事件 :定时器定时时间到,AD变换结束等
• 外部事件 : 按键动作,发生外部通信等。
完整的处理流程:
1.内部/外部事件请求CPU处理
2.CPU停止正常流程,执行中断服务程序ISR
3.ISR结束后,CPU返回正常流程
3. 中断的堆栈占用
为了在主程序执行的任何时候都可以被打断,我们需要保留中断前CPU运行的所有寄存器的当前值,在执行完中断后,把寄存器的值恢复到中断前,就好像主程序没有被打断过。
处于效率的考虑,有选择的压栈部分寄存器,比如ARM Cortex的处理器,中断发生前把以下寄存器自动的压入堆栈进行保存。
中断的寄存器入栈由CPU硬件自动完成。
对于具体的CPU,在中断时哪些寄存器被推入堆栈/寄存器在堆栈的保存顺序是在其手册中指明的。
4.中断服务子程(ISR,Interrupt Service Routine)
-
•在一些CPU中,中断服务子程不同于一般的C函数,函数退出时的返回汇编指令有所区别。(如RTI中断返回指令需完成堆栈操作)
• 在ARM Cortex M0+平台上,中断服务子程与一般C函数写法没有区别,使用同样的汇编返回指令即可。(堆栈弹出由NVIC自动完成) -
中断服务子程ISR的共同特点:
• 是被CPU硬件自动调用的,而不是由其他程序在代码中调用;
• 在ISR执行前、后,CPU自动进行了堆栈出入等操作;因为中断由外部事件在任意时刻都可能被调用。
• 写成C函数的参数和返回值都应为void;
5.中断向量表
那么当外部中断事件发生,通知CPU,CPU如何正确找到中断服务程序并运行呢→中断向量表
• 中断向量表是一段连续的存储空间
• 在复位后有默认的起始位置
• 每个中断在向量表中都有相应的表项,该表项的值为该中断对应的服务程序的地址(地址指针)
• 由程序代码确定中断向量表的每个表项
• 中断向量表的位置是可以通过改写中断向量基址寄存器重新定位的
如下图所示的向量表,中断向量表对于ARM的微处理器CPU的设计,上电默认位置从00地址开始,4个字节一个表项,每个表项能存一个指针(一个函数的入口地址)。
一共有48个表项,前16项是异常中断(是一种打断CPU必须响应一种特殊中断,这些异常是由CPU内部所保留的)。
32项是ARM CPU留给外设产生的中断,包括按键定时通讯等。用户编程时更多使用的是这32项。
中断向量表里的每一个表象对应不同的中断源,表里填的内容是函数的入口地址,所以CPU得到通知的时候只要根据发生中断源的项去查中断向量表,找到入口地址,跳转给PC指针寄存器,程序就去执行ISR了
6.中断优先级
-
多个中断同时出现时,高优先级中断先得到响应
-
中断优先级可以是固定的或编程指定的
• 固定优先级: 根据中断向量表顺序(比如S12的内核)
• 设定优先级:每个中断都有优先级设置位(比如ARM Cortex M0+支持4个优先级) -
相同优先级的中断,按先后顺序处理
7.中断嵌套
中断嵌套指CPU在执行一个中断服务程序的过程中,可以再次响应新的中断请求。
- 在进入中断服务程序时,CPU硬件会将全局中断使能位关闭。
为了实现中断嵌套,必须在ISR开始重新允许全局中断(在有多优先级的情况下,选择允许到哪一个级别的中断)。 - 中断嵌套的层数(ARM Cortex M0+只有4个优先级)
- 中断嵌套对堆栈的消耗很大(因而嵌套层数和内存开销可控)
二、 复位
-
复位是初始化微控制器内部电路,包括:
• 将所有寄存器恢复成默认值
• 确认MCU的工作模式
• 禁止全局中断
• 关闭外设
• 将IO置为高阻输入状态
• 等待时钟振荡趋于稳定
然后从固定地址取得复位向量并开始执行指令 -
中断向量表里的第1位是堆栈指针向量(声明可以使用内存的堆栈的起始地址)。
第2位是复位的中断向量,那么这个表项存储的入口地址是ARM芯片复位以后所取回的第一条指令的地址。芯片一旦完成复位,CPU会自动从第2位取一个地址赋给PC指针,然后从该条指令开始执行。
那么这个地址填谁呢?
绝大多数嵌入式开发中,开发工具会帮助我们生成一段Start Code入口函数,该入口函数的最后一条指令就是跳转到main函数。
那么这个地址就是填该入口函数的第一条指令的地址。
上电复位的流程就是将入口函数的第一条指令填入中断向量表的第2项中,CPU自动执行入口函数,然后跳转到main函数。 -
有多种引起复位的因素,有相应的标志位和向量(可以进行不同的初始化流程)
• 上电复位
• 电源丢失复位
• 外部产生的手动复位信号
• 执行复位指令引发的复位
• 非法指令引起的复位 illegal instruction
• 时钟丢失引起的复位
• 看门狗复位
• ………
三、时钟
时钟是指令执行的基本时间间隔,时钟频率高,意味着CPU执行运算的能力强。
时钟通常由外部晶体或振荡器提供,使用外部的配置引脚在复位时选择时钟输入源。
广泛应用锁相环技术,将外部较低频率的时钟提高成内部较高频率的时钟 (better EMC&EMI)。
看门狗/定时器/异步通信等都依赖稳定的时钟。
• MCU内部是一个统一的时钟树,外设的时钟是从系统时钟分频得到的。
图中线的轨迹即为上电复位的一瞬间产生的频率。
这个时钟树里既有采用IRC振荡产生的及时kHz的振荡源作为片内时钟源,也可以通过片外高精度石英晶振的振荡电路提供一个高精度的时钟源。
片内有锁相环和锁频环,可把一个较低的频率翻成几十G的高频给CPU运行,由分出各个模块所使用的时钟。
四、总线
- CPU通过内部总线接口访问存储器/外设。
- MCU的外部总线接口是内部总线接口的信号子集。
- 内部总线接口包括三部分
• 地址线(地址线的宽度决定CPU的寻址范围)
• 数据线(CPU通过数据线从设备读取数据/向设备写入数据)
• 控制线(提供读写选定、数据/地址有线、总线仲裁、总线等待等信息) - 此外,ARM Cortex M0+还支持专门的单周期IO读写