描述 #
该文件包含 CH32V00x 微控制器中断嵌套控制与 NVIC(嵌套向量中断控制器)初始化相关的函数原型和配置常量。通过配置 CSR 寄存器(0x804)的 bit1,系统可选择是否启用中断嵌套,从而影响优先级分组的分配方式。该模块允许开发者在有限的优先级位宽下灵活配置抢占优先级与子优先级,以满足实时性需求。在不启用嵌套时,所有中断共享同一抢占层级,仅通过子优先级调度;启用嵌套后,可实现真正的多级抢占,提升关键中断响应效率。
常量 #
CSR_INTSYSCR_INEST_definition
#
中断嵌套使能配置常量,用于控制 CSR 寄存器 0x804 的 bit1,决定优先级分组策略。该配置在编译时由 INTSYSCR_INEST 宏决定,通常在启动文件中设定,影响整个 NVIC 优先级结构的行为。
| 名称 | 值 | 简述 |
|---|---|---|
INTSYSCR_INEST_NoEN |
0x00 |
禁用中断嵌套(CSR-0x804 bit1 = 0) |
INTSYSCR_INEST_EN |
0x01 |
启用中断嵌套(CSR-0x804 bit1 = 1) |
以上所有值均为
uint8_t类型,但用于配置 32 位 CSR 寄存器的单个位,实际写入时仅影响指定位。
Preemption_Priority_Group
#
优先级分组配置常量,根据中断嵌套是否启用,仅定义一个有效值。若启用嵌套,则使用 NVIC_PriorityGroup_1(1 位抢占 + 1 位子优先级);若禁用,则使用 NVIC_PriorityGroup_0(0 位抢占 + 2 位子优先级)。该设计简化了优先级管理,避免运行时配置冲突。
| 名称 | 值 | 简述 |
|---|---|---|
NVIC_PriorityGroup_0 |
0x00 |
禁用嵌套时使用:0 位抢占优先级,2 位子优先级 |
NVIC_PriorityGroup_1 |
0x01 |
启用嵌套时使用:1 位抢占优先级,1 位子优先级 |
以上所有值都强制转换为
uint32_t,用于传递给优先级配置函数,但实际仅使用低两位。
枚举 #
无
结构体 #
NVIC_InitTypeDef
#
NVIC 中断通道初始化结构体,用于配置特定中断源的优先级与使能状态。结构体字段与 CSR 寄存器的优先级分配策略紧密耦合,其有效取值范围依赖于 INTSYSCR_INEST 的编译时配置。
| 名称 | 类型 | 简述 |
|---|---|---|
NVIC_IRQChannel |
uint8_t |
指定要配置的中断通道号(如 EXTI0_IRQn、TIM2_IRQn 等) |
NVIC_IRQChannelPreemptionPriority |
uint8_t |
抢占优先级:启用嵌套时范围为 0~1,禁用时必须为 0 |
NVIC_IRQChannelSubPriority |
uint8_t |
子优先级:启用嵌套时范围为 0 |
NVIC_IRQChannelCmd |
FunctionalState |
中断通道使能状态:ENABLE 或 DISABLE |
FunctionalState为ch32v00x.h中定义的枚举类型(ENABLE=1,DISABLE=0),用于控制中断使能开关。
函数 #
NVIC_PriorityGroupConfig
#
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
配置 NVIC 的优先级分组模式,决定抢占优先级与子优先级的位数分配。该函数仅保存配置值至全局变量 NVIC_Priority_Group,不直接写入硬件寄存器,实际优先级编码由 NVIC_Init() 在设置中断时应用。必须在调用 NVIC_Init() 前调用本函数,否则默认使用未定义的分组,可能导致优先级行为异常。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
NVIC_PriorityGroup |
uint32_t |
优先级分组常量,必须为 NVIC_PriorityGroup_0 或 NVIC_PriorityGroup_1,否则行为未定义。 |
返回值:
无
NVIC_Init
#
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
根据传入的初始化结构体配置指定中断通道的优先级与使能状态。该函数会根据 NVIC_Priority_Group 的当前配置,自动将抢占优先级与子优先级组合成硬件所需的 8 位优先级值(高 2 位为抢占,低 6 位为子优先级),并调用底层 NVIC_SetPriority() 写入 NVIC 寄存器。同时根据 NVIC_IRQChannelCmd 的值启用或禁用中断。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
NVIC_InitStruct |
NVIC_InitTypeDef * |
指向包含中断通道、优先级和使能状态的配置结构体。必须确保字段值在当前嵌套模式下合法,否则可能导致优先级冲突或无效配置。 |
返回值:
无
重要说明:
- 在
INTSYSCR_INEST_EN模式下,抢占优先级只能为 0 或 1,子优先级只能为 0 或 1,共 4 种组合。- 在
INTSYSCR_INEST_NoEN模式下,抢占优先级必须为 0,子优先级可为 0~3,共 4 种组合。- 所有优先级值在内部通过左移 6 位(
<< 6)对齐至 NVIC 的高 2 位,确保与硬件寄存器格式一致。- 该函数不检查
NVIC_IRQChannel是否有效,开发者需确保使用的是芯片支持的中断号,否则可能触发异常。