书上内找到的
嵌入式系统的特点(P3)
易记:专省时(实)事(适)靠寿固
-
常用于特定的任务(专):嵌入式系统设计用于执行特定的任务或应用,通常被定制以满足特定需求
-
需要专用工具和方法来进行软硬件设计(专)
-
运行资源有限(省):受成本、体积和功耗等多种因素的限制,嵌入式系统的软、硬件资源相对有限
-
往往极其关注成本(省):控制成本是设计嵌入式系统时需要考虑的重要因素
-
有功耗限制(省):许多嵌入式系统需要在功耗有限的情况下运行,尤其是那些依赖电池供电的移动设备
-
对实时性有要求(实):需要在预定的时间内产生反应,可分为硬实时系统(在给定的时间限制内完成任务)以及软实时系统(对任务的完成时间有一定的宽限度)
-
运行环境差异较大(适):面向应用需求设计导致不同的嵌入式系统的运行环境差异很大
-
对可靠性要求高(靠):嵌入式系统往往要在长期无人值守的情况下运行
-
具有较长的生命周期(寿):嵌入式系统的控制系统应该在其生命周期中不需要升级或维护,软硬件的升级也要保证稳定性和连续性
-
目标代码通常固化在非易失性存储器芯片中(固)
嵌入式系统软件组成(P5)
包括嵌入式操作系统、嵌入式文件系统、嵌入式系统中间件、嵌入式图形系统、嵌入式应用程序等
-
嵌入式操作系统:负责嵌入式系统的全部软、硬件资源的分配和调度工作,并控制和协调并发活动
-
嵌入式文件系统:负责管理存储在嵌入式系统中的各种数据、程序和运行支撑库等
-
嵌入式系统中间件:满足上层软件对运行环境的需求,从而增加软件的复用程度,减少软件二次开发和移植的工作量
-
嵌入式图形系统:要求简单、直观、可靠、占用资源小且反应迅速并具备高度可移植性和可裁剪性
-
嵌入式应用程序:针对特定应用领域、基于某一特定硬件平台的用来实现用户预期目标的计算机软件
Contex-M4处理器的各寄存器Rx(x=1..15)代表什么(P49)
在 Cortex-M4 处理器中,R0 到 R15 是通用寄存器(General Registers),用于存储操作数和中间计算结果。这些寄存器的命名方式是 R0、R1、R2,一直到 R15。
以下是这些寄存器的一般用途:
-
R0 到 R12: 通用寄存器,用于存储临时数据、中间计算结果等。
-
R13(SP,堆栈指针): 这是堆栈指针寄存器,用于指向当前任务的堆栈。
-
R14(LR,链接寄存器): 在函数调用时,保存调用指令的返回地址。当发生函数调用时,会将当前 PC(程序计数器)中的值复制到 LR 寄存器中。
-
R15(PC,程序计数器): 存储当前执行指令的地址。当执行分支或跳转指令时,会改变 PC 的值。
Cortex-M4默认使用的存储器格式(P49)
Cortex-M4 处理器默认使用的存储器格式是小端模式(Little-Endian)。在小端模式下,较低的字节存储在较低的内存地址,而较高的字节存储在较高的内存地址。这是与大端模式(Big-Endian)相对的一种存储方式
在小端模式中,32位数据的存储顺序如下:
Address Byte 0 Byte 1 Byte 2 Byte 3 -------- ------ ------ ------ ------ 0x1000 LSB - - MSB
其中,LSB 表示最低有效字节,MSB 表示最高有效字节。在 Cortex-M4 处理器中,默认采用小端模式,这与 ARM Cortex-M 架构的通用约定一致。小端模式在许多嵌入式系统和大多数个人计算机中都是常见的存储方式。
APSR程序状态寄存器(P51)
APSR(Application Program Status Register)是 Cortex-M 处理器中的一个程序状态寄存器,用于保存程序执行状态的一些标志位。APSR 是 ARM Cortex-M 架构中的寄存器之一,它的位域包括:
-
N(Negative)负数标志位: 用于指示最近的算术或逻辑操作结果是否为负数
-
Z(Zero)零结果标志位: 用于指示最近的算术或逻辑操作结果是否为零
-
C(Carry)进位/借位标志位: 用于指示最近的无符号算术操作是否有进位
-
V(Overflow)溢出标志位: 用于指示最近的有符号算术操作是否发生了溢出
-
Q(Sticky Overflow)饱和条件码: 在某些指令中,用于指示上一次指令是否导致了溢出
-
GE(Greater than or Equal)大于或等于标志位: 用于协助 SIMD(Single Instruction, Multiple Data)指令,指示比较的结果
5个标志位,4个可以作为条件跳转及条件执行的判断依据,即可单独使用也可组合使用从而产生15种条件跳转。
Cortex-M4系列处理器支持指令集(P55)
只支持Thumb-2指令集
STM32F407的程序代码地址(P68)
需要注意的是
-
0x00000000是整个Block0的起始位置
-
0x08000000是用户FLASH,是程序启动地址,是题指
STM32F407最小系统(P75)
包括STM32F407微控制器、晶振电路、复位电路、电源、下载电路、启动模式设置等
STM32F4xx的独立看门狗由内部低速时钟
驱动(P117)
STM32F407xx的5个时钟源(P117)
-
HSI(High-Speed Internal)时钟: 内部高速时钟源,其频率为16 MHz。它是一个高频率、低功耗的时钟源,适用于许多应用
-
HSE(High-Speed External)时钟: 外部高速时钟源,可以通过外部晶振或时钟发生器提供。其频率范围通常为 4 MHz 到 26 MHz,具有更高的精度和稳定性
-
PLL(Phase-Locked Loop)时钟: 可配置时钟源,可以从 HSI 或 HSE 时钟源衍生出高频率时钟。通过 PLL,可以生成用于系统时钟的高频率时钟。PLL的输入可以是 HSI、HSE 或者其他源,频率范围通常为 192 MHz
-
LSE(Low-Speed External)时钟: 外部低速时钟源,通常用于实时时钟(RTC)模块。LSE 的频率通常为 32.768 kHz
-
LSI(Low-Speed Internal)时钟: 内部低速时钟源,通常用于低功耗模式。其频率在低功耗运行模式下可能降至几百 Hz
STM32F4重要时钟源(P117)
-
系统时钟源
-
HSI(high speed internal)高速内部
-
HSE(high speed external)高速外部
-
PLL(phase lock loop)相位锁定回路
-
-
低速时钟源
-
LSI(low speed internal)低速内部
-
LSE(low speed external)高速内部
-
GPIO引脚配置模式(P127)
-
输入模式:模拟信号用TTL转数字信号
浮空输入、上拉输入、下拉输入、模拟输入
-
输出模式:数字信号输出模拟信号
开漏输出、开漏复用输出、推挽输出、推挽复用输出
-
复用功能输入输出:将控制权交给外设由外设控制
-
模拟模式(不做电平转换)
-
输入:电压信号不做电平转换直接输入外设
-
输出:外设产生的电压信号直接输出到GPIO
-
STM32F40xx通用I/O端口的寄存器及数量(P129)
每个通用 I/O 端口包括:(x为A~G)
-
4 个 32 位配置寄存器
-
GPIO 端口模式寄存器 (GPIOx_MODER)
-
GPIO 端口输出类型寄存器 (GPIOx_OTYPER)
-
GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)
-
GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR)
-
-
2 个 16 位数据寄存器
-
GPIO 端口输入数据寄存器 (GPIOx_IDR)
-
GPIO 端口输出数据寄存器 (GPIOx_ODR)
-
-
1 个 32 位置位/复位寄存器 (GPIOx_BSRR)
-
2 个 32 位复用功能选择寄存器
-
GPIO 复用功能低位寄存器 (GPIOx_AFRL)
-
GPIO 复用功能高位寄存器 (GPIOx_AFRH)
-
中断优先级(P142)
中断优先级是一个数字,通常是 0 到 255 之间的值。较小的数值表示较高的优先级。
Cortex-M3/M4的NVIC支持最多256级的可编程优先级,STM32F407xx的中断向量表只用到了98个中断,前16个为不可屏蔽中断,后82个外部中断为可屏蔽中断
STM32F407可屏蔽中断通道(P144)
-
外部中断通道(EXTIx)
-
定时器中断通道:
-
TIM1_UP_TIM10:定时器 1 更新中断及定时器 10全局中断
-
TIMx_IRQn:定时器 x 中断
-
-
串口中断通道(USARTx_IRQn)
-
DMA 中断通道(DMAx_Streamy_IRQn):DMAx流y中断
-
I2C 中断通道(事件中断:I2Cx_EV_IRQn、错误中断:I2Cx_ER_IRQn)
中断优先级的一般规则(P146)
-
组优先级和子优先级均是数值越小,优先级越高
-
不管子优先级为多少,首先判断组优先级,组优先级数值越小的优先级越高
-
如果两个终端的组优先级相同,那么子优先级的数值越小优先级越高
-
如果两个中断的组优先级和子优先级均相同,那么中断向量表中入口地址低的优先级较高,这是微控制器复位时的默认状态
在8位中断优先级寄存器中,STM32采用4位来编辑中断的优先级,16级优先级,共有5组优先级分组方式(P146)
-
4位编辑优先级:中断优先级有NVIC中的IPR0~IPR20寄存器配置,每个IPR寄存器有4个8位用于配置中断优先级,即IP[0]~IP[81]的高四位
-
16级优先级:IP[7:4]4个位最多只能配置16个中断优先级。
-
5组:每个IP[7:4]包括两部分,组优先级以及子优先级;由应用程序中断及复位控制寄存器(AIRCR)中的[10:8]进行控制分为(0,4)、(1,3)、(2,2)、(3,1)、(4,0)
NVIC优先级分组(接上,网上搜的书上没有)
NVIC 优先级分组用于确定预设优先级和子优先级的位数。ARM Cortex-M 处理器支持不同的优先级分组,常见的包括:
-
NVIC_PRIORITYGROUP_0: 优先级分组为 0 位预设优先级 + 4 位子优先级。
-
NVIC_PRIORITYGROUP_1: 优先级分组为 1 位预设优先级 + 3 位子优先级。
-
NVIC_PRIORITYGROUP_2: 优先级分组为 2 位预设优先级 + 2 位子优先级。
-
NVIC_PRIORITYGROUP_3: 优先级分组为 3 位预设优先级 + 1 位子优先级。
-
NVIC_PRIORITYGROUP_4: 优先级分组为 4 位预设优先级。
外部中断/事件控制器(EXTI)支持中断/事件请求数(P147)
EXTI控制器为每个终端/事件线都提供了专用的状态位,每个EXTI控制器只能控制一个中断/事件请求。对于STM32F407xx来说,它最多支持23个外部中断/事件请求,EXTI0~EXTI22
SysTick定时器(P158)
是NVIC的组成部分,对应中断号为15,只提供了简单的倒计时功能,是24位倒计时器,时钟源可以是HCLK或HCLK/8,操作系统需要借助这种提供周期性的心跳信号的中断服务程序实现系统的调度,SysTick的控制寄存器只能在特权模式先访问,可通过STK_CTRL,STK_LOAD,STK_VAL,STK_CALIB4个控制寄存器来配置。
使用 SysTick 定时器的一般步骤如下:
-
初始化 SysTick: 设置时钟源、加载寄存器和中断使能等。
-
启动 SysTick: 开始计数,SysTick 将根据时钟源递减计数。
-
等待中断或查询计数器: 等待 SysTick 中断的触发,或者查询当前值寄存器以获取计数值。
-
处理中断或完成定时操作: 在中断服务程序中执行定时操作,或者通过查询当前值寄存器来判断定时是否到达。
STM32定时器的时钟源(P165)
-
CK_INT
-
ETRF
-
T11FP1
-
T12FP2
-
ITRx
-
TRGI
-
TRGO
-
CK_PSC
-
CK_CNT
STM32定时器的计数模式(P165)
-
向上计数模式:计数器从0开始计数,计数值逐渐增加,直到达到自动重装载值,然后重新从0开始计数
-
向下计数模式:计数器从自动重装载值开始计数,计数值逐渐减少,直到达到0,然后重新从自动重装载值开始计数
-
中心对齐模式:计数器在向上计数和向下计数之间切换,每次计数器计数到自动重装载值时,计数器的方向会自动翻转
-
模式1:向上计数模式,计数器计数到自动重装载值时,方向翻转
-
模式2:向下计数模式,计数器计数到0时,方向翻转
-
模式3:向上计数模式,计数器计数到自动重装载值时,方向翻转;计数器计数到0时,方向再次翻转
-
当使用定时器输出?ms的定时,若预分频值为xxxx,计算定时器的自动重装载计数值(P170)
主要公式:定时时间us=((预分频值+1)(重装载计数值+1))/时钟频率MHz
示例:
假设定时器的时钟频率为 84MHz,预分频值为 1000,所需的定时时间为 1 ms,求自动重装载计数值
解析:1000us = ((1000 + 1)(x + 1)) / 84 \Longrightarrow x \approx 83
在这个例子中,如果你将定时器的预分频值设置为 1000,那么定时器每 1ms 就会产生一个中断
PWM是什么(P182)
用于产生固定频率、固定占空比的输出信号,通过控制信号的高电平时间(脉冲宽度)和低电平时间的比例,来实现对输出信号的调制;可选PWM模式1与PWM模式2两种输出模式
-
PWM模式1
计数单元采用向上计数时,计数器计数值小于捕获/比较寄存器的值输出有效电平;采用向下计数时,计数器计数值小于捕获/比较寄存器的值输出无效电平
-
PWM模式2
计数单元采用向上计数时,计数器计数值小于捕获/比较寄存器的值输出无效电平;采用向下计数时,计数器计数值小于捕获/比较寄存器的值输出有效电平
PWM信号周期时间、频率、占空比计算、定时器参数计算(P184)
关键公式:
-
PWM波形频率Hz=时钟频率MHz/((预分频值+1)(重装载计数值+1))
-
占空比 = ((捕获/比较寄存器值 + 1) / (重装载寄存器值+1))*100\%
例题:
在定时器的TIM3_CH3通道上预分频系数为8399、输出频率为10Hz、占空比为30%的PWM波形。
解析:
-
重装载计数值=(时钟频率MHz \times (预分频值+1))/PWM波形频率Hz=(84000000\times (8399+1))/10=999
-
捕获/比较寄存器值=占空比 \times (重装载寄存器值+1)-1=(8399 +1)/占空比-1=299
串口工作方式中单工通信、半双工通信、全双工通信(P199)
-
单工通信
发送端和接收端是固定的,数据信号仅从发送端传送到接收端,数据流是单向的
-
半双工通信
数据可以在两个方向上传送,通信双方既能接收数据也能发送数据,但是接收数据和发送数据不能同时进行
-
全双工通信
在同一时刻,数据可以进行双向传输,通信双方既能接收数据也能发送数据,并且可以同时进行
STM32的串口工作模式(P199)
-
全双工模式: 在全双工模式下,串口可以同时进行发送和接收操作,允许双方在同一时间进行双向通信。每个方向都有独立的数据线,分别用于发送和接收数据。这种模式适用于需要双向通信的应用,如终端设备和计算机之间的通信。
-
半双工模式: 在半双工模式下,串口在不同的时间段内分别用于发送和接收操作。虽然同一时刻只能执行发送或接收操作,但在某个时间段内可以切换到另一个方向。这种模式适用于一方发送,等待接收完成后再切换到接收的场景,例如无线通信、传感器与控制器之间的通信。
串口工作模式的选择通常取决于具体的应用需求。在使用 STM32 系列微控制器时,你可以根据你的通信需求配置串口模块为全双工或半双工模式。在配置串口的时候,你需要设置相应的控制寄存器,如 CR1 寄存器中的 TE (Transmitter Enable) 和 RE (Receiver Enable) 位,来使能发送和接收功能。同时,也需要配置引脚作为串口的 TX 和 RX 引脚,以连接到外部设备。
同步/异步传输(P200)
-
同步串行传输:
-
发送端在发送数据时提供时钟信号,并按照约定的时序发送数据,接收端根据发送端提供的时钟信号以及约定的时序接收数据。
-
常用的I2C、SPI
-
效率较高,适合于批量传输大量数据,但要求收发双方在通信过程中保持精确的同步时钟,因此接收器和发送器较为复杂且成本较高
-
-
异步串行传输:
-
收发双方没有共享时钟信号,发送端在发送数据之前,通过提供Start信号告诉接收端开始传输,然后按照约定的发送速度和格式发送数据,发送完成后,通过提供Stop信号告诉接收端数据传输完毕
-
常用的UART
-
成本低,传输效率低,简单可靠,容易实现
-
串口数据帧格式(P201)
-
起始位: 无数据传输时通信线上为逻辑1,接收端检测到逻辑0后,就开始准备接受数据
-
数据位: 5~8位,低位在前,高位在后,由低位向高位逐位发送
-
校验位: 可选,数据位发送完后发送。常用奇校验和偶校验
-
停止位(Stop Bits): 逻辑1有效,占位有0.5、1、1.5、2位
DMA(P220)
在外设与存储器之间以及存储器与存储器之间提供了高速数据传输通道,可在无须CPU参与的情况下实现数据的快速复制,既减轻了CPU负荷,又降低了系统能耗。其数据传输是在后台进行的,无需处理器干预,因此在数据传输过程中处理器能够执行其他任务。只有当一个完整的数据块传输完成后,才会进行一次DMA中断
DAC转换中用到的寄存器(P236)
-
DHRx(数据保持寄存器):用于存放写入待转换数据
-
DORx(数据输出寄存器):用于存放DAC正在转换的数据,为只读寄存器
-
转换过程中,数据必须先写入到DHRx中,DORx在加载了DHRx中的内容之后,经过一段时间(转换建立时间),模拟输出电压将被输出到DAC_OUTx引脚上
ADC转换过程(P248)
-
取样
-
保持
-
量化
-
编码
ADC转换器的主要技术指标(P249)
-
取样时间:取样时间是指采样保持电路对模拟信号进行采样的时间。取样时间越长,采样精度越高,但是采样速度越慢
-
转换时间:转换时间是指从采样开始到转换结束所需的时间。转换时间越短,转换速度越快
-
采样率:采样率是指采样保持电路每秒对模拟信号进行采样的次数。采样率越高,采样精度越高,但是采样速度越慢
-
分辨率:分辨率是指ADC输出数字量变化一个相邻数码所需输入模拟电压的变化量。分辨率越高,ADC的精度越高
-
转换精度:转换精度是指ADC输出数字量与输入模拟电压之间的误差。转换精度越高,ADC的精度越高
ADC规则转换组最多由16
个转换组成,注入转换组最多由4
个转换组成(P252)
ADC初始化,传感器采集数据并输出到PC(P264)
ADC_HandleTypeDef hadc1; /* 定义全局变量hadc1,用于存储ADC1的初始化参数*/
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; // 设置ADC1的时钟频率为APB2总线时钟频率的四分之一
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 设置ADC1的分辨率为12位
hadc1.Init.ScanConvMode = DISABLE; // 禁用扫描模式
hadc1.Init.ContinuousConvMode = DISABLE; // 禁用连续扫描模式
hadc1.Init.DiscontinuousConvMode = DISABLE; // 禁用ADC1的不连续转换模式
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; // 外部突发转换
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // ADC将由软件启动触发
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc1.Init.NbrOfConversion = 1; // 转换通道数为1
hadc1.Init.DMAContinuousRequests = DISABLE; // 禁用ADC的DMA连续请求
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; // ADC将在单次转换后自动停止转换
if(HAL_ADC_Init(&hadc1) != HAL_OK) // 配置ADC全局参数,包括GPIo引脚
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_4; // 配置通道
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; // ADC将在每个转换期间使用3个时钟周期进行采样
if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) // 配置ADC各个通道的采样参数
{
Error_Handler();
}
}
UART_HandlerTypeDef huart2;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_ADC1_Init();
uint32_t data;
while(1)
{
HAL_ADC_Start(&hadc1);
data = HAL_ADC_GetValue(&hadc1);
printf("data = %d, voltage=%.2fV\n", data, data*3.3/4096);
HAL_Delay(500);
}
}
书上找不到的需要自己准备的
冯诺依曼完整的计算机系统组成
-
中央处理器: 执行计算和控制任务的核心部件,包括算术逻辑单元(ALU)和控制单元(CU)
-
存储器:
-
主内存(RAM): 用于存储程序和数据,是CPU直接访问的内存
-
辅助存储器: 如硬盘,用于永久性存储程序和数据
-
-
输入设备: 将外部数据输入到计算机系统,如键盘、鼠标、摄像头等
-
输出设备: 将计算机处理结果输出,如显示器、打印机、扬声器等
-
总线系统: 传递数据和控制信号的通信系统,包括数据总线、地址总线和控制总线
-
I/O 接口: 与外部设备通信的接口,连接各种外围设备
-
指令集架构: 定义CPU能够理解和执行的指令集合
-
程序计数器(PC): 记录当前执行指令的地址,用于顺序执行程序
-
控制单元(CU): 指导数据在CPU内外存储器之间传输,并控制指令的执行
-
时钟: 同步各系统组件的时钟信号,确保计算机操作按时序进行
哈佛结构
在哈佛结构中,程序存储和数据存储是分开的,分别使用不同的总线
具体来说,哈佛结构包括两个独立的存储器:
-
程序/指令存储器: 存储计算机程序的指令,用于提供CPU执行程序的指令流。
-
数据存储器: 存储程序处理的数据。
相比冯·诺依曼结构,哈佛结构的优势在于可以同时访问指令和数据,提高了访问效率
流水线
流水线是一种将计算机指令的执行过程划分成多个阶段,使得多条指令可以同时在不同阶段执行的技术。典型的流水线包括取指、译码、执行、访存和写回等阶段
APB总线及其时钟频率
APB(Advanced Peripheral Bus)总线是一种低功耗外设总线,广泛应用于ARM架构的嵌入式系统中。它是一种串行总线,用于连接处理器和外围设备,如GPIO(通用输入输出)、定时器、UART(通用异步收发器)等。
APB总线通常被划分为两个域:APB1和APB2。每个域都有独立的时钟控制,因此它们的时钟频率可以是不同的。
-
APB1的时钟频率是系统时钟频率的四分之一
-
APB2的时钟频率是系统时钟频率的二分之一
-
因为APB1和APB2域通常用于连接不同类型的外设,而某些外设对时钟的要求不同。
!计算位带别名区的地址(P138)
别名地址=起始地址+偏移量*32+位数*6
-
别名地址就是最终转换的目标
-
起始地址要根据题给条件判断
-
偏移量
I/O端口寄存器访问方式
-
选择端口和引脚: 首先确定要配置的 GPIO 端口和引脚。例如,如果要配置 GPIOA 的第 5 个引脚,你需要知道 GPIOA 的基地址以及引脚 5 的位置。
-
寄存器地址计算: 计算寄存器的地址。对于 STM32 微控制器,寄存器的地址通常是基地址加上相应的偏移量。例如,GPIOA 的 MODER 寄存器的基地址为
0x40020000
,而 MODER 寄存器的偏移量为0x00
,所以 MODER 寄存器的地址为0x40020000 + 0x00 = 0x40020000
。 -
读取或写入寄存器: 使用指定的寄存器地址进行读取或写入操作。在 C 语言中,可以通过指针来访问寄存器,如
GPIOA->MODER
。在汇编语言中,使用汇编指令来加载地址、计算偏移量,并通过存储指令写入寄存器。GPIOA->MODER |= (1 << (2 * 5)); // 设置 GPIOA 的引脚 5 为输出模式
中断服务程序
中断服务程序(ISR,Interrupt Service Routine)是由中断向量表(Interrupt Vector Table)中的相应中断向量所指向的处理函数。中断向量表是一组指针数组,每个元素指向一个中断服务程序。当发生中断时,处理器会跳转到相应中断向量指向的中断服务程序
中断向量
中断向量表通常是在程序的起始地址处,包含了各个中断通道的中断服务程序的地址。在 Cortex-M 处理器中,中断向量表的第一个地址是初始栈指针(Initial Stack Pointer,ISP)
中断嵌套
中断嵌套是指在一个中断服务程序(ISR)执行期间,另一个中断发生并执行其相应的 ISR。在嵌套中断场景下,处理器在执行当前中断时可以被更高优先级的中断打断,进入更高优先级的中断服务程序,完成后再返回执行原先的中断。
在 Cortex-M 处理器中,中断嵌套的支持是由硬件和 NVIC(Nested Vectored Interrupt Controller)来管理的。以下是关于中断嵌套的一些概念和注意事项:
-
中断优先级: 每个中断都有一个优先级,较小的数值表示较高的优先级。在 NVIC 中,中断通道的优先级分为预设优先级和子优先级,具体取决于优先级分组的配置方式。
-
中断服务程序入口和退出: 中断服务程序入口和退出时,硬件会自动保存和恢复寄存器的状态。这包括保存当前中断的现场,执行嵌套中断时自动保存和恢复更高优先级的中断现场。
-
中断屏蔽: 在 Cortex-M 处理器中,可以使用
__disable_irq
和__enable_irq
等指令来手动关闭和打开中断。在某些情况下,可能需要手动管理中断的嵌套。 -
嵌套中断的优先级处理: 当一个中断正在执行时,如果发生了更高优先级的中断,处理器会中断当前中断的执行,转而执行更高优先级的中断服务程序。在完成更高优先级中断的处理后,处理器会恢复之前被打断的中断的现场,并继续执行。
-
配置 NVIC: 在配置中断时,通过
NVIC_InitTypeDef
结构体中的NVIC_IRQChannelPreemptionPriority
和NVIC_IRQChannelSubPriority
字段来配置中断的优先级