Other Parts Discussed in Thread: LM3S8971
主题中讨论的其他器件:LM3S8971
TI 实施 TM4C1294 NVIC 优先级/子优先级组的方式似乎缺少 ARM Cortex M4v7程序员指南的优先级位字段。
具体而言、数据表中缺少配置为3位拆分的 REG58 (APINT)中每个组优先级(0-7)的子优先级字段。 ARM Cortex M4v7 NVIC 支持 每个中断具有多达256个优先级。 TI 数据表中缺少 ARM 编程人员指南所示的每个主要分组(0-7)中断源的子优先级位字段(半字节)。 数据表表表3-9的第1行(0x0-0x4)不正确、建议在3位拆分中只能存在1个子优先 级、因为这会违反 ARM Cortex M4v7 (成熟的) NVIC 架构。
为清楚起见、 我在 Tivaware (HW_NVIC.h) NVIC_APINT 定义旁边添加了分组位拆分(注) M4v7 NVIC 能够解码。 似乎0x00000200 [2:0]的中断子优先级中断字段3位拆分的 Tivaware 未 设置子 优先 级、 8个中断 优先级位 (0x0-0x7)、例如 优先级分组0x00-0xE0。 ARM M4v7内核 NVIC 支持 主优先级分组和 0-7分组0x0-0xE0内的中断优先级。 IntPrioritySet()没有配置该 功能,它只将“子优先级”中断位字段设置为仅用作主分组,而该功能在 M4v7 NVIC 架构中无法正常工作。 正如 ARM Cortex 文档所建议的那样、TI 似乎有人错误地确定了 NVIC 的工作方式。
我们需要8 个优先级组 0x0-0xE0 (5:3拆分)、 每个分组内至少有8个子优先级(0-7)。 似乎 Tivaware IntPrioritySet()将 NVIC 限制为 1个具有8个子优先级的组,这与表3-9相冲突。 似乎我们无法进行呼叫,但再次访问 IntPriorityGroupingSet (2或4) 时,每个 组将我们限制为仅一个组,而不是表3-9所示的8个单独的组。
相应 地、由于发出更高优先级的中断分组、它们错误地加快了与该组中更高优先级的中断链相对较低优先级的尾链。
// // //为 NVIC_APINT 寄存器中的位字段定义以下内容。 //// ***************** #define NVIC_APINT_VECTKEY_M 0xFFFFFF0000 //寄存器密钥 #define NVIC_APINT_VECTKEY 0x05FA0000 //向量键 #define NVIC_APINT_ENDANESS 0x00008000 //数据字节 #define NVIC_APINT_PRIGROUP_M 0x00000700 // INT 优先级分组 PRI[位] SubPrI[位] #define NVIC_APINT_PRIGROUP_7_1 0x00000000 //优先级组7.1拆分、ARM [7:1][0] #define NVIC_APINT_PRIGROUP_6_2 0x00000100 //优先级组6.2拆分、ARM [7:2][1:0][1:0][1:0]#define NVIC_APINT_PRIGROUP_6_2 0x00000100//优先 级组0xINT_PRINT_INT_PRINP_组6.2][PRINT_INT_PRINT_INT_INT_INPLEV0003.4][PRINT_PRINT_PRINT_INT_INT_INT_INP_LEVINP_4:INT_INT_INT_ ARM [7:4][3:0] #define NVIC_APINT_PRIGROUP_3_5 0x00000400 //优先级组3.5拆分,ARM [7:5][4:0] #define NVIC_APINT_PRIGROUP_2_6 0x00000500 //优先级组2.6拆分,ARM [7:6][PRIC_APINT_PRIGROUP_2_7 0x0007_1.7] [PRIGINT_PRIGINP_组0x000007:PRINT_1.7/PRIGROUP_1.7] [6:0] #define NVIC_APINT_PRIGROUP_0_8 0x00000700 //优先级组0.8拆分,ARM [0] [7:0] #define NVIC_APINT_SYSRESETREQ 0x00000004 //系统复位请求 #define NVIC_APINT_VECT_CLR_ACT 0x00000002 //清除活动 NMI /故障 #define NVIC_APINT_VECT_RESET 0x00000001 //系统复位




