系统控制
功能组件
复位控制
复位 Reset:用手动或自动的方法发信号给硬件特定接口,使软件恢复到特定的程序段运行
复位源
不同的嵌入式系统有不同的复位源,按照复位源的不同可以将复位分为系统复位、电源复位
![[images/Pasted image 20260109151730.png]]
一般系统存在多个复位源:
- 外部复位引脚
- 内部看门狗复位
- 通过 NVIC(嵌套向量中断控制器)产生的软件复位
- 上电/掉电复位
- 低电压检测电路产生的复位信号
系统复位
外部复位
如果应用程序仅使用内部上电复位(POR)电路,那么 RESET 输入端必须通过一个可选的上拉电阻(1 ~ 100kΩ)连接到电源(VDD)
![[images/Pasted image 20260109152048.png]]
看门狗复位
- 在看门狗计数器发生溢出时,可以事先设定程序下一步的去向,避免溢出时程序运行的不确定性,增加程序的可靠性
- 看门狗计数发生溢出时仅将程序计数器清零,而不是像上电复位那样,将所有的寄存器都要清零
软件复位
- 软件复位则是通过软件触发让 MCU 自己对自己进行复位,软件复位是一种通过执行某个指令来触发 MCU 复位的系统复位
- 软件复位可以复位某个特定的外设或者复位整个微控制器,包括内核在内的整个微控制器,均可以通过设置中断和复位控制寄存器的相应位实现复位
电源复位
上电复位
![[images/Pasted image 20260109152157.png]]
掉电复位
- 如果嵌入式系统在运行过程中电源电压突然发生跌落,会导致程序运行的不确定,所以此时需要将硬件板复位,使其处于一个确定的状态
- 当电压跌落到一定的阈值以下时内部的掉电复位控制器中的条件检测位(BOR)就会被置为 1,表示将执行掉电复位程序
时钟控制
- 硬件板上电路的时钟越快,功耗越大,且其抗电磁干扰能力也会减弱,所以不可能一味地提高时钟频率来满足各种设备的需求
- 因此较为复杂的 MCU 一般都采取多时钟源的方法来解决这个问题
输入时钟
- 从时钟源频率分为高速时钟和低速时钟
- 高速外部时钟和高速内部时钟都属于高速时钟
- 低速外部时钟和低速内部时钟都属于低速时钟
- 从芯片角度分为片内时钟和片外时钟
- 片内时钟由芯片内部 RC 振荡器产生,具有起振较快的优点,因此在系统刚刚启动的时候默认采用内部高速时钟
- 片外时钟通常由外部晶体振荡器输入,在精度和稳定性上都具有较大的优势。上电后通过软件配置的方式将系统时钟转而采用高速外部时钟信号
时钟使用:
- 高速外部时钟
- 高速外部时钟通常以外部晶体作为时钟源,常用的晶体频率根据芯片的不同而发生变化
- 高速内部时钟
- 高速内部时钟由芯片内 RC 电阻、电容时钟振荡器产生,常见频率参数有 5MHz,8MHz 等,虽然不稳定,但是它的启动时间比 HSE 晶体振荡器短
- 然而,即使在校准之后它的时钟频率精度仍较差,Cortex-M4 从上电开始即采用 HIS 作为初始的系统时钟
- 低速外部时钟
- 低速外部时钟通常以外部晶振作为时钟源,晶体一般选择一个低速外部晶体或陶瓷谐振器
- 常见频率参数有 32.768kHz,11.0592kHz 等
- 它为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源。
- 低速内部时钟
- 低速内部时钟由片内 RC 电阻、电容时钟振荡器产生,LSI RC 担当一个低功耗时钟源的角色
- 常见频率参数有 10kHz、32.768kHz、128kHz 等
- 可以提供给实时时钟模块和看门狗模块
系统时钟
- 系统时钟 SYSCLK 由多路选择器 SW 根据用户设置来选择 PLLCLK、HSE 或者 HIS 中的一路作为输出而得,SYSCLK 是片上大部分部件的时钟来源。
- 为了让用户能够实时检测系统时钟是否运行正常, Cortex-M4 系列的微控制器专门提供了引脚 MCO。用户可以通过软件编程的方式,选择 SYSCLK、PLLCLK、 HSE 或者 HIS 中的一路在 MCO 上输出以供检测
系统时钟分频得到其他时钟
- HCLK:HCLK 是高速总线 AHB 时钟,AHB 主要用于高性能模块,如 CPU、DMA 和 DSP 等之间的连接。
- FCLK:Cortex-M4 内核的“自由运行”时钟,同样由系统时钟 SYSCLK 经过 AHB 预分频器分频后直接得到,并且与 HCLK 互相同步。
- PCLK1:外设时钟,由系统时钟 SYSCLK 经过 AHB 预分频器,再经过 APB1 预分频器分频后得到。其主要作用是为挂载在 APB1 总线上的时钟提供时钟信号
电源控制
微控制器依靠低功耗模式降低处理器功耗,常见的低功耗模式包括:
- 睡眠模式
- 停机模式
- 待机模式
睡眠模式
- 状态:Cortex 的内核停止工作,但外设还在继续工作
- 进入:执行了 WFE 或 WFI 指令
- 退出:某个外设产生事件或者中断请求,内核才会被唤醒,从而退出睡眠模式
停机模式
- 状态:内核和外设均停止工作
- 进入:电源控制寄存器中的相应位清零时,遇到 WFE 或 WFI 指令,就会进入停机模式
- 退出:任意一个外部中断/事件控制(EXTI)信号唤醒
待机模式
- 状态:内核和外设都停止工作,而且内部的电压调压器也被关闭
- 进入:电源控制寄存器中的相应位置位时,遇到 WFE 或 WFI 指令,就会进入待机模式
- 退出:/RESET 引脚上的外部复位信号或者 RTC 的闹钟事件。
中断控制
嵌套向量中断控制器
嵌套向量中断控制器(Nested Vectored Interrupt Controller, NVIC),控制着整个芯片中断相关的功能,它跟内核紧密耦合
中断
当出现了某个特殊事件时, CPU 会终止当前程序的执行,转而去执行该事件的处理程序(中断服务程序),待中断服务程序执行完毕,在返回断点继续执行原来的程序,这个过程称为中断
中断源
能引发中断的事件称为中断源。
通常一个微控制器系统上,中断源可以是由微处理器异常引发的系统异常中断,也可以由外设引发的外部中断。
系统异常中断因素包括非屏蔽中断、存储器管理、总线故障等,外部中断因素包括定时器溢出、串口收到数据等
中断屏蔽
在微控制器中,程序员可以通过设置相应的中断屏蔽位,禁止 CPU 响应某个中断,从而实现中断屏蔽。
一个中断源能否被响应,一般由总中断允许控制位和该中断自身的中断允许控制位共同决定,这两个中断控制位中的任何一个被关闭,该中断就无法被响应
中断处理过程
中断响应
- 保护现场:保护现场是为了在中断处理完成后,可以返回断点处继续执行下去而必须做的操作,微处理器系统保护现场通常是通过将 CPU 寄存器的值进栈实现的
- 查找中断服务程序地址:中断发生后,CPU 根据中断向量表准确地找到这个中断对应的处理程序
- 中断向量表:按中断号从小到大依次存放着所有中断处理程序的入口地址
执行中断服务程序
每个中断都有自己的对应的中断服务程序,用来处理中断,CPU 响应中断后转而执行对应的中断服务程序,通常中断服务程序又称为中断服务函数,由用户根据具体的应用使用汇编语言或 C 语言编写,用来实现对中断真正的处理操作
中断返回
CPU 执行中断服务程序完毕后,通过恢复现场,即 CPU 关键寄存器出栈实现中断返回,从断点处继续执行源程序
中断优先级
中断的优先级是根据中断实时性、重要性、软件处理的方便性预先设定的。当同时有多个中断请求产生时,CPU 会优先响应优先级较高的中断请求
中断嵌套
中断优先级不仅用于并发中断,还用于嵌套中断。
中断嵌套是指当系统正在执行一个中断服务时,又有新的中断事件发生而产生了新的中断请求。当新发生的中断的优先级高于正在处理的中断时,CPU 可以终止执行优先级低的当前中断处理程序,转去执行新发生的、优先级较高的中断,处理完毕后才返回原来的中断处理程序继续执行
中断原理
![[images/Pasted image 20260109160045.png]]
中断配置
- 建立中断向量表
- 中断向量表的建立必须在用户应用程序执行前完成,用户可以根据应用需求,选择在 Flash 或在 RAM 中建立中断向量表
- 分配栈空间并初始化
- 栈的初始化工作通常是在微处理器上电复位后执行复位程序完成的。栈空间的分配通常位于启动代码的起始位置
- 设置中断优先级
- 设置中断优先级是用户在应用程序中编写代码配置 NVIC 实现的,首先设置中断优先级的分组位数,然后设置中断的抢占优先级和子优先级
- 使能中断
- 在设置完中断的优先级后,通过失效前面提及的中断屏蔽寄存器中的总中断屏蔽位,可以使能对应的中断
- 编写对应的中断服务代码
- 具体内容由用户根据需求编写,实现对中断的具体处理
DMA 控制
传输要求
- 传输源: DMA 传输的数据来源
- 传输目标: DMA 数据传输的目标地址
- 传输单位和需要传输的数据量
- 触发信号: 用于触发一次数据传输的动作,可以用来控制数据传输的时机
传输过程
- DMA 请求,CPU 初始化 DMA 控制器,外设 I/O 接口向 DMA 控制器发出 DMA 请求
- DMA 响应,DMA 控制器判断 DMA 请求的优先级,决定是否屏蔽 DMA 请求,如果接受请求则向总线仲裁器提出总线请求。当 CPU 执行完当前总线周期时,可释放总线控制权。此时,总线仲裁器输出总线应答,表示 DMA 已经响应,DMA 控制器从 CPU 接管对总线的控制,并通知外设开始 DMA 传输
- DMA 传输,DMA 数据以规定的传输单位,通常是字进行传输。每个单位的数据传送完成后,DMA 控制器修改地址,并对数据量的传送单位个数进行计数,继而开始下一个单位数据的传送。如此循环往复,直至达到预先设定的传送单位数量为止
- DMA 结束,当规定数量的 DMA 数据传输完成后, DMA 控制器通知外设停止传输,并向 CPU 发送一个信号,例如,产生中断或事件,报告 DMA 数据传输操作结束,同时释放总线控制权
传输模式
- 停止 CPU 访问内存
- 周期挪用
- 当 I/O 设备没有 DMA 请求、CPU 按程序要求访问内存时,一旦 I/O 设备有 DMA 请求,则由 I/O 设备挪用一个或几个内存周期,这就是周期挪用方式
- 周期挪用的方法既实现了 I/O 传送,又较好地发挥了内存和 CPU 的效率,是一种更为广泛采用的方法
- 周期挪用的方法适用于 I/O 设备读写周期大于内存存储周期的情况
- DMA 与 CPU 交替访内存
- 如果 CPU 的工作周期比内存存取周期长很多,此 时采用交替访内的方法可以使 DMA 传送和 CPU 同时 发挥最高的效率
工作原理
- 触发通道
- 微控制器有两个 DMA,每个 DMA 有不同数量的触发通道
- 优先级
- 与中断的中断源类似,对于 DMA 的每个通道也可以赋予优先级。
- 在每个 DMA 中,DMA 的仲裁器根据通道请求的优先级来启动外设/存储器的访问,同一时刻一个 DMA 的多个通道可以同时发起 DMA 传送请求,但对于一个 DMA 控制器来说只能允许有一个请求有效
DMA 特点及应用
- DMA 优点
- 减轻了 CPU 的负担
- 提高了数据传输的效率
- 减少了用户开发的代码量
- DMA 使用场合
- 实时性较强的嵌入式系统
- 需要高速传送成组数据的系统
初始化配置
片级初始化
- 完成嵌入式微处理器的初始化
- 将默认状态逐步设置成系统所要求的工作状态
- 纯硬件的初始化过程
板级初始化
- 初始化其他硬件设备
- 设置某些软件的数据结构和参数
- 包含软件和硬件的初始化过程
系统初始化
系统初始化过程以软件初始化为主,主要进行操作系统的初始化。初始化代码完成的操作与具有的硬件平台相关,但大都包括以下内容:
- 初始化中断向量表
- 初始化存储器系统
- 存储器类型、时序和总线宽度的配置
- 存储器地址的配置和重映射