ZHCUAN6E October 2022 – May 2025 MSPM0L1105 , MSPM0L1106 , MSPM0L1116 , MSPM0L1117 , MSPM0L1227 , MSPM0L1227-Q1 , MSPM0L1228 , MSPM0L1228-Q1 , MSPM0L1303 , MSPM0L1304 , MSPM0L1304-Q1 , MSPM0L1305 , MSPM0L1305-Q1 , MSPM0L1306 , MSPM0L1306-Q1 , MSPM0L1343 , MSPM0L1344 , MSPM0L1345 , MSPM0L1346 , MSPM0L2227 , MSPM0L2227-Q1 , MSPM0L2228 , MSPM0L2228-Q1
为了支持 32 个以上外设中断源到 NVIC 的映射,某些 MSPM0 器件在 MCPUSS 中包含中断分组逻辑 (INT_GROUP),以组合多个中断来提供一个本机 NVIC 中断。
INT_GROUP 中断分组使用 MSPM0 事件管理寄存器结构,其主要区别在于,中断组的所有外设中断源始终为未屏蔽(始终启用),因此除了外设中断配置和 NVIC 配置外,不需要额外的启用配置。IMASK 寄存器本身是只读的,并且通过硬接线来启用中断组的所有源。图 3-4 展示了 INT_GROUP 结构。
由于不需要屏蔽控制,应用软件只需与中断索引 (IIDX) 寄存器连接,即可有效处理通过 INT_GROUP 寄存到 NVIC 的外设中断。
应用软件可以读取 INT_GROUP 中的 IIDX 寄存器,以确定和清除该组中最高优先级的挂起外设中断。读取 IIDX 将返回与设置中断的最高优先级外设相对应的索引。读取操作还将同时清除与读取所返回索引的最高优先级中断相对应的 RIS 和 MIS 位。从 IIDX 寄存器读取的值随后可用于选择语句,如下所示。
void GROUP_HANDLER(void)
{
switch(IIDX)
{
case 0: // no IRQ pending
break;
case 1: // IRQ[0]
do_peripheral_1_ISR();
break;
case 2: // IRQ[1]
do_peripheral_2_ISR();
break;
default: // out of range
illegal();
}
}
由于组合到一个 INT_GROUP 中的多个外设中断会提供一个 NVIC 中断,因此无法让一个组中的外设中断优先于中断组的活动处理程序的执行。例如,假设 WWDT0 中断请求线路和 PMCU 中断请求线路连接到 INT_GROUP0,而 INT_GROUP0 提供 NVIC 外设中断 0。如果 WWDT0 中断被置为有效,INT_GROUP0 将向 NVIC 发出中断请求。如果没有更高优先级的中断处于活动状态,NVIC 会将处理器引导至 INT_GROUP0 处理程序。然后,应用软件可以读取 INT_GROUP0 IIDX 寄存器,以确定在 NVIC 上触发 INT_GROUP0 中断的是 WWDT0,并且软件可以跳转到 WWDT0 处理程序函数。
如果在处理器仍处于处理程序模式来处理 WWDT0 函数(实际上是 INT_GROUP0 处理程序的一部分)期间,PMCU 将其中断线路置为有效,则 PMCU 中断不能优先于 WWDT0 处理程序。当 WWDT0 处理程序完成时,INT_GROUP0 处理程序将返回。此时,处理器将看到 INT_GROUP0 请求再次置为有效(这次是由于 PMCU),并将第二个条目尾链到中断处理程序。这时,应用软件将读取 IIDX 并确定 PMCU 是向 NVIC 发出 INT_GROUP0 中断的原因。
如果有两个或多个的外设中断挂起到一个中断组,软件可以设置中断处理的优先级,方法是先读取 RIS 或 MIS 寄存器以测试哪个外设中断置为有效,然后执行软件确定的优先级。或者,如果使用中断索引 (IIDX) 寄存器,则中断组硬件将根据索引顺序返回最高优先级索引。