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 , TM4C123FE6PM , TM4C123FH6PM , TM4C123GE6PM , TM4C123GE6PZ , TM4C123GH6PGE , TM4C123GH6PM , TM4C123GH6PZ , TM4C123GH6ZXR , TM4C1290NCPDT , TM4C1290NCZAD , TM4C1292NCPDT , TM4C1292NCZAD , TM4C1294KCPDT , TM4C1294NCPDT , TM4C1294NCZAD , TM4C1297NCZAD , TM4C1299KCZAD , TM4C1299NCZAD , TM4C129CNCPDT , TM4C129CNCZAD , TM4C129DNCPDT , TM4C129DNCZAD , TM4C129EKCPDT , TM4C129ENCPDT , TM4C129ENCZAD , TM4C129LNCZAD , TM4C129XKCZAD , TM4C129XNCZAD

 

  1.   请先阅读
    1.     关于本手册
    2.     术语表
    3.     德州仪器 (TI) 提供的相关文档
    4.     支持资源
    5.     商标
  2. 1TivaWare SDK 简介
    1. 1.1 TivaWare SDK 文件夹细目分类
  3. 2TivaWare 示例工程
    1. 2.1 TivaWare 开发板示例
    2. 2.2 TivaWare 外设示例
    3. 2.3 如何将示例工程导入 CCS
  4. 3在 Code Composer Studio 中将文件和库关联到 TivaWare 工程中
    1. 3.1 在 CCS 中链接文件
    2. 3.2 在 CCS 中链接库
  5. 4如何调试 TivaWare 库
    1. 4.1 如何引导 Code Composer Studio 找到源文件
    2. 4.2 如何重新构建 TivaWare 库
  6. 5如何将 TivaWare 添加到现有 CCS 工程中
    1. 5.1 路径变量
    2. 5.2 包含路径
    3. 5.3 预定义变量
    4. 5.4 库链接
  7. 6TivaWare 引导加载程序
    1. 6.1 在 Code Composer Studio 中修改要用于引导加载的 TivaWare 工程
    2. 6.2 如何使用 LM 闪存编程器引导加载
  8. 7软件最佳做法
    1. 7.1 栈/堆设置和栈溢出
    2. 7.2 中断服务例程
      1. 7.2.1 最佳做法
      2. 7.2.2 TivaWare 矢量表和 IntDefaultHandler
    3. 7.3 TivaWare 硬件头文件
    4. 7.4 ROM 和 MAP TivaWare 前缀
  9. 8TM4C 资源
  10. 9修订历史记录

TivaWare 矢量表和 IntDefaultHandler

在每个工程中包含的用于每个编译器的 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