ZHCU861A March 2021 – August 2022 TM4C1230C3PM , TM4C1230D5PM , TM4C1230E6PM , TM4C1230H6PM , TM4C1231C3PM , TM4C1231D5PM , TM4C1231D5PZ , TM4C1231E6PM , TM4C1231E6PZ , TM4C1231H6PGE , TM4C1231H6PM , TM4C1231H6PZ , TM4C1232C3PM , TM4C1232D5PM , TM4C1232E6PM , TM4C1232H6PM , TM4C1233C3PM , TM4C1233D5PM , TM4C1233D5PZ , TM4C1233E6PM , TM4C1233E6PZ , TM4C1233H6PGE , TM4C1233H6PM , TM4C1233H6PZ , TM4C1236D5PM , TM4C1236E6PM , TM4C1236H6PM , TM4C1237D5PM , TM4C1237D5PZ , TM4C1237E6PM , TM4C1237E6PZ , TM4C1237H6PGE , TM4C1237H6PM , TM4C1237H6PZ , TM4C123AE6PM , TM4C123AH6PM , TM4C123BE6PM , TM4C123BE6PZ , TM4C123BH6PGE , TM4C123BH6PM , TM4C123BH6PZ , TM4C123BH6ZRB , TM4C123FE6PM , TM4C123FH6PM , TM4C123GE6PM , TM4C123GE6PZ , TM4C123GH6PGE , TM4C123GH6PM , TM4C123GH6PZ , TM4C123GH6ZRB , TM4C123GH6ZXR , TM4C1290NCPDT , TM4C1290NCZAD , TM4C1292NCPDT , TM4C1292NCZAD , TM4C1294KCPDT , TM4C1294NCPDT , TM4C1294NCZAD , TM4C1297NCZAD , TM4C1299KCZAD , TM4C1299NCZAD , TM4C129CNCPDT , TM4C129CNCZAD , TM4C129DNCPDT , TM4C129DNCZAD , TM4C129EKCPDT , TM4C129ENCPDT , TM4C129ENCZAD , TM4C129LNCZAD , TM4C129XKCZAD , TM4C129XNCZAD
在每个工程中包含的用于每个编译器的 TivaWare startup 文件中,微控制器的中断矢量表有一个数据部分。将根据器件中提供的中断填充矢量表条目,中断可在器件数据表的异常类型部分中找到。startup 文件中的备注指示哪一行对应于哪种硬件中断。然后将在器件内部映射此矢量表,将应用程序内部的所有 ISR 链接到 TM4C 微控制器上的嵌套矢量中断控制器 (NVIC)。
矢量表开始处由默认 ISR 处理程序填充。除了用于对器件执行软重置的 ResetISR,每个其他默认 ISR 处理程序都包含一个空的 while(1) 循环。FaultISR 表明 MCU 中出现故障,需要通过调试来检测故障点。TI 提供了一份重点介绍软件故障诊断的应用报告,其中显示了系统故障的调试流程。处理程序收到 NMI 时,将输入 NmiSR。每个其他中断都与包罗万象的 IntDefaultHandler 相关联。卡在 IntDefaultHandler 中的程序表明已启用中断,但 ISR 处理程序并未正确地与 NVIC 矢量表关联。
可以使用两种方式将应用程序 ISR 与 NVIC 矢量表中的合适条目相关联。第一种方式是使用 IntRegister API,它会将存储在闪存中的矢量表复制到 RAM 中,然后在代码执行过程中添加新的 ISR 关联。这样,就能通过动态方法创建新的 ISR 关联,因而灵活性更高。第二种方法是在 startup 文件中为应用程序的 ISR 处理程序手动添加 extern 调用,并用 ISR 处理程序代替目标外设的 IntDefaultHandler 实例。这是一种在编译时生成关联的静态方法,它的优势包括减小内存使用量和减少代码执行,因此这种方法通常更受欢迎。
为了将由应用程序定义的 ISR 处理程序添加到 startup 文件中,请在声明前使用 extern 关键字。以下代码来自 EK-TM4C123GXL LaunchPad 上的 interrupts 示例。如下所示,每个 ISR 处理程序都在声明的其余部分之前添加了 extern 关键字。
//*****************************************************************************
//
// External declarations for the interrupt handlers used by the application.
//
//*****************************************************************************
extern void IntGPIOa(void);
extern void IntGPIOb(void);
extern void IntGPIOc(void);
将 ISR 处理程序正确添加到 startup 文件后,查找与 ISR 对应的矢量表中的外设。例如,通过搜索矢量表查找端口 A、B 和 C 的 GPIO 外设,可以发现矢量图中的以下区段。
IntDefaultHandler, // The PendSV handler
IntDefaultHandler, // The SysTick handler
IntDefaultHandler, // GPIO Port A
IntDefaultHandler, // GPIO Port B
IntDefaultHandler, // GPIO Port C
IntDefaultHandler, // GPIO Port D
IntDefaultHandler, // GPIO Port E
IntDefaultHandler, // UART0 Rx and Tx
并不是所有外设都是按顺序分组的。使用 Ctrl+F 搜索文件是浏览整个表格的快捷方法。
使用由目标应用程序定义的所需 ISR 处理程序代替中断矢量表中每个对应条目的 IntDefaultHandler,然后保存文件。
IntDefaultHandler, // The PendSV handler
IntDefaultHandler, // The SysTick handler
IntGPIOa, // GPIO Port A
IntGPIOb, // GPIO Port B
IntGPIOc, // GPIO Port C
IntDefaultHandler, // GPIO Port D
IntDefaultHandler, // GPIO Port E
IntDefaultHandler, // UART0 Rx and Tx