嵌入式原理与应用篇---常见基础知识(10)
一、STM32时钟源HSI\HSE\LSI\LSE的含义
STM32 微控制器的时钟系统管理着整个芯片的时序和性能,其核心由四种不同的时钟源构成。下面为你详细介绍这四种时钟源的含义:
高速内部时钟(HSI,High-Speed Internal)
- 含义:HSI 是 STM32 芯片内部的 RC 振荡器产生的时钟信号。
- 特点:
- 频率:通常为 8MHz 或 16MHz(不同型号可能有差异)。
- 优势:无需额外的外部元件,降低了硬件成本和电路板空间。
- 不足:精度不如外部时钟源,容易受温度和电压波动的影响。
- 应用场景:适用于对时钟精度要求不高的场合,可作为系统启动时的默认时钟源,也可在低功耗模式下使用。
高速外部时钟(HSE,High-Speed External)
- 含义:HSE 是由外部晶振或时钟源提供的高速时钟信号。
- 特点:
- 频率范围:通常为 4MHz~26MHz,具体取决于芯片型号和外部晶振的选择。
- 优势:精度高、稳定性好,能为系统提供更精确的时钟基准。
- 不足:需要额外的晶振或时钟源,增加了硬件成本和电路板设计复杂度。
- 应用场景:是大多数 STM32 应用的首选时钟源,常用于需要高精度时钟的场合,如 USB 通信、以太网、ADC 采样等。
低速内部时钟(LSI,Low-Speed Internal)
- 含义:LSI 是 STM32 芯片内部的 RC 振荡器产生的低速时钟信号。
- 特点:
- 频率:约为 32kHz(不同型号可能有差异)。
- 优势:无需外部元件,功耗低。
- 不足:精度较低,受温度和电压影响较大。
- 应用场景:主要用于实时时钟(RTC)和独立看门狗(IWDG)等对时钟精度要求不高的低速外设。
低速外部时钟(LSE,Low-Speed External)
- 含义:LSE 是由外部晶振提供的低速时钟信号。
- 特点:
- 频率:标准值为 32.768kHz,这是因为该频率便于通过分频得到 1Hz 的精确时钟,适合用于计时。
- 优势:精度高,能提供稳定的时钟基准。
- 不足:需要额外的晶振,增加了成本和电路板空间。
- 应用场景:主要用于实时时钟(RTC),为系统提供精确的时间基准,也可用于需要低功耗的场合。
总结
这四种时钟源在 STM32 中各自发挥着不同的作用,用户可以根据实际需求灵活配置。一般来说,HSE 和 LSE 提供高精度时钟,适用于对时序要求严格的应用;而 HSI 和 LSI 则具有无需外部元件、启动速度快的优点,适用于对成本和功耗敏感的场景。
二、STM32每个中断向量关于优先级的两个属性的含义(抢占优先级、响应优先级)
STM32 的中断系统中,每个中断向量有两个与优先级相关的属性:抢占优先级(Preemption Priority)和子优先级(Subpriority),它们共同决定了中断的响应顺序。以下是这两个属性的具体含义和作用:
1. 抢占优先级(Preemption Priority)
-
含义:
抢占优先级决定了高优先级中断是否可以打断正在执行的低优先级中断。当一个中断正在处理时,若有更高抢占优先级的中断到来,系统会暂停当前中断的执行,转去处理更高优先级的中断(即中断嵌套)。处理完毕后,再返回继续执行被打断的中断。 -
特点:
- 数值越小,优先级越高。例如,抢占优先级为 0 的中断可以抢占任何其他抢占优先级(如 1、2 等)的中断。
- 抢占优先级相同的中断之间不能互相嵌套,即使它们的子优先级不同。
2. 子优先级(Subpriority)
-
含义:
子优先级(也称响应优先级)决定了抢占优先级相同的多个中断同时发生时的响应顺序。子优先级高的中断会优先得到处理,但不能抢占正在执行的同级或低级中断。 -
特点:
- 数值越小,优先级越高。例如,子优先级为 0 的中断会优先于子优先级为 1 的中断执行(前提是它们的抢占优先级相同)。
- 若多个中断的抢占优先级和子优先级均相同,则根据中断向量表的固定顺序决定响应顺序(硬件默认优先级)。
优先级分组(Priority Grouping)
STM32 通过优先级分组机制动态分配抢占优先级和子优先级的位数。用户可以通过修改NVIC_PriorityGroupConfig()
函数配置分组方式,将 16 个优先级位(0~15)划分为抢占优先级和子优先级两部分。常见的分组方式如下:
分组方式 | 抢占优先级位数 | 子优先级位数 | 抢占优先级范围 | 子优先级范围 |
---|---|---|---|---|
Group 0 | 0 位 | 4 位 | 无(固定为 0) | 0~15 |
Group 1 | 1 位 | 3 位 | 0~1 | 0~7 |
Group 2 | 2 位 | 2 位 | 0~3 | 0~3 |
Group 3 | 3 位 | 1 位 | 0~7 | 0~1 |
Group 4 | 4 位 | 0 位 | 0~15 | 无(固定为 0) |
示例说明
假设配置为Group 2(2 位抢占优先级 + 2 位子优先级):
- 中断 A:抢占优先级 = 1,子优先级 = 2
- 中断 B:抢占优先级 = 0,子优先级 = 3
- 中断 C:抢占优先级 = 1,子优先级 = 1
-
中断嵌套规则:
- 中断 B 的抢占优先级更高(0 < 1),因此中断 B 可以抢占中断 A 或 C。
- 中断 A 和 C 的抢占优先级相同(均为 1),不能互相嵌套。
-
同时触发时的响应顺序:
- 若中断 B 和 A 同时触发,先响应 B(抢占优先级更高)。
- 若中断 A 和 C 同时触发,先响应 C(子优先级 1 < 2)。
应用场景
- 抢占优先级:适用于需要立即响应的紧急任务(如系统复位、硬件故障处理)。
- 子优先级:适用于优先级相同但需要确定执行顺序的任务(如多个传感器数据采集)。
配置代码示例
以下代码展示了如何配置中断优先级:
// 设置优先级分组为Group 2(2位抢占 + 2位子优先级)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 配置USART1中断(抢占=1,子=2)
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);// 配置TIM2中断(抢占=0,子=3)
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
NVIC_Init(&NVIC_InitStruct);
通过合理配置这两个优先级属性,开发者可以灵活控制 STM32 中断的响应和处理顺序,满足不同应用场景的需求。