This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432E401Y:为看门狗计时器编写汇编语言中断例程

Guru**** 2536440 points
Other Parts Discussed in Thread: MSP432E401Y

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1175668/msp432e401y-writing-an-assembly-language-interrupt-routine-for-the-watchdog-timer

器件型号:MSP432E401Y

您好!

我正在尝试使用设置了 RESEN 位的看门狗计时器0为我的应用实现看门狗计时器功能、以便计时器最终将复位处理器。  我从 SLay723技术参考手册中对这一点的理解是、计时器在第一次计数下降到0时生成中断、然后重新加载计数并在第二次 计数下降到0时将处理器复位。

我对编写中断例程一无所知、因此我希望有人可以为我提供有关如何执行此操作的快速教程。  现在函数正在工作、不同的是、在生成中断之后以及在复位处理器之前、它处于"Default_Handler()"的紧密循环中、处理器收到意外中断时会调用该函数。

谢谢、

Brad McMillan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    抱歉、我们不支持此器件系列的汇编语言应用。

    我们的标准建议是利用现有 SDK 示例(在本例中、从 nortos 开始)并利用该示例查看需要哪些直接寄存器/汇编代码。

    您可以在  examples\nortos\MSP_EXP432E401Y\drivers\watchdog 下找到一个 nortos 示例

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    实际上、我的问题与汇编语言没有任何关系、我不应该将其放在标题中。  

    我的问题很简单。  我从未编写过为中断提供服务的代码、因此我根本不知道它们是如何工作的。  似乎必须有余地来识别与看门狗计时器关联的中断、并且还必须有一种方法来告诉处理器您希望在触发中断时执行的代码的位置。 或者、

    当处理器接收到来自看门狗计时器的中断时、如何告知处理器在特定位置执行代码?

    谢谢、

    Brad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    感谢您澄清问题、我当然可以解释这些细节。

    对于启动器、器件有一个中断矢量表、其中包含不同中断服务例程的地址。 这就是它将一个给定的中断映射到要执行的一部分代码的方式。 每个在器件中有中断的独立外设都有映射。

    为了允许每个外设触发中断、需要配置一个特定于外设的中断使能。 通常还可以选择配置 何时应发生中断的条件。 启用后 、外设将 在满足中断条件时向 NVIC 发送中断。

    NVIC 是嵌套向量中断控制器、它处理中断的优先级并将它们路由到正确的代码以执行。  还需要告知 NVIC 给定外设的中断。

    在代码执行过程中、您将编写一个函数作为中断服务例程(ISR)、其中包含在中断时要处理的代码。

    因此、您需要将 ISR 与我在本说明开头提到的中断矢量表相关联。 对于这样的非 RTOS 应用程序、最简单的方法是将函数添加到 startup_msp432e401y_ccs.c 文件中、并用您为 ISR 创建的函数替换文件中的默认中断处理程序。

    完成所有这些步骤后、当您的程序执行且外设满足中断发生条件时、它将向 NVIC 发送中断信号。 然后、NVIC 将检查中断矢量表、并将代码执行引导至您为该中断注册的 ISR。 此时、您的 ISR 代码将运行。

    希望您能够充分详细地解释该流程、以便您在计划中采取后续步骤!

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    我刚刚回到这个问题、我有几个问题、希望您能帮我解决。

     我已经让看门狗计时器工作到了超时它会将处理器复位的时刻、因此我假设它会成功地向 NVIC 发送中断。

    我通读了 MSP432E 参考手册 slau723a 中有关 NVIC 寄存器的部分、其中没有任何内容涉及看门狗计时器。 您能否澄清一下我 如何告诉 NVIC 希望看门狗计时器产生中断?

    我还在 startup_msp432e401y_ccs.c 文件中找到了中断矢量表。 您提到、我应该用我自己的看门狗定时器中断服务例程替换默认中断处理程序、但我在矢量表中看不到任何涉及看门狗定时器的内容。 您能否澄清一下、我应该如何用我将要创建的函数 ISR 替换文件中的默认中断处理程序?

    感谢您的回答、

    Brad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    [引用 userid="470468" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1175668/msp432e401y-writing-an-assembly-language-interrupt-routine-for-the-watchdog-timer/4447750 #4447750"]I 还在 startup_msp432e401y_ccs.c 文件中找到了中断矢量表。 您提到、我应该用我自己的看门狗定时器中断服务例程替换默认中断处理程序、但我在矢量表中看不到任何涉及看门狗定时器的内容。 您能解释一下我应该如何用我将要创建的函数 ISR 替换文件中的默认中断处理程序吗?

     启动文件中有一个 Watchdog_IRQHandler 条目、因此请查找该条目。

    您只需在 interruptVectors 表中找到该条目并将其替换为您的 ISR 函数即可。 您需要使用 extern 关键字将函数添加到启动文件中。

    [引用 userid="470468" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1175668/msp432e401y-writing-an-assembly-language-interrupt-routine-for-the-watchdog-timer/4447750 #4447750"]我通读了 MSP432E 参考手册 slau723a 中有关 NVIC 寄存器的部分、但其中没有找到任何涉及看门狗计时器的内容。 您能否澄清一下我 如何告诉 NVIC 希望看门狗计时器产生中断?[/引述]

    很抱歉、我之前没有提到过、但用于查找看门狗计时器的 NVIC 表位于器件数据表中、而不是 TRM 中。  您可以在第6.3.3节嵌套矢量中断控制器(NVIC)中找到这些详细信息

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    我在启动文件中找到了 Watchdog_IRQHandler 条目、并将其替换为指向我自己的 ISR 函数的指针。  当我执行程序时、我能够使用调试来验证指针的值是否正确。

    为了进行测试、我运行了一些将看门狗计时器设置为其最大值的代码、然后进入紧密循环、让计时器计数降为零。  我能够通过 调试观察计时器倒计时、但在计数结束时、我的 ISR 从未执行、因此我显然有更多的工作要做。

    您之前提到过"还需要告知 NVIC 给定外设的中断"、因此我假设 这是我需要做的下一件事、才能使其正常工作。  我通读了 MSP432E401Y 数据表的第6.3.3节、其中介绍了 NVIC、但我仍然不清楚如何操作。  在我看来、我需要在某个位置设置位18、但我不清楚我需要在哪里设置该位。

    您能否说明一下、当看门狗计时器计数降为零时、我还需要做些什么来执行 ISR 函数?

    谢谢、

    Brad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    我不知道为什么数据表和 TRM 会尝试将这些信息与其他信息结合在一起... 但数据表提供了表格、但 TRM 提供了寄存器详细信息:

    2.4.1 EN0至 EN3寄存器

    中断0~31置位使能寄存器(EN0)、偏移量0x100

    中断32~63设置使能寄存器(EN1)、偏移量0x104

    中断64-95设置使能寄存器(EN2)、偏移量0x108

    中断96-113设置使能寄存器(EN3)、偏移量0x10C

    因此看门狗将位于 EN1中、您只需启用其中的正确位即可在 NVIC 中启用中断。

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    我在 EN1中设置了应该启用看门狗计时器中断的位、但它仍然不起作用。  正如我之前提到的、我设置计时器、然后进入紧密循环来观察超时。  当计时器达到零时、我希望执行移至中断例程、但它没有。  它保持在紧密环路中、直到计时器再次归零、然后复位 MSP432。

    以下是包含 EN1的调试输出:

    0xE000E100 NVIC_NVIC_EN0
    0xE000E100 20 00 08 00
    0xE000E104 NVIC_NVIC_EN1
    0xE000E104 04 05 00
    0xE000E108 NVIC_NVIC_EN2
    0xE000E108 00 00 00 00
    0xE000E10C NVIC_NVIC_EN3
    0xE000E10C 00 00 00 00

    如您所见、我在 EN1中设置了第3位、我认为该位应该设置为启用看门狗计时器中断。  第6.3.3节中的表格显示前16位用于处理器异常、之后看门狗定时器为位18 (从零开始)、因此它应该是 EN1中的第3位。  我甚至尝试将整个字节设置为 FF、但它仍然不起作用。

    您能看到我在这里做错了吗?

    谢谢、

    Brad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    我对您的读数有一点不确定、因为器件是小端字节序、因此我希望最低字节显示0x04。

    也就是说、如果所有 FF 都不起作用、我想知道主中断是否在某个时候被禁用?

    它们 通常由 CPUcpsie()打开。 我相信 是 PRIMASK 寄存器被更改了、所以您可能需要检查那个。

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    我很确定 EN1的第一个字节是最低字节、它确实显示了0x04。  通过在0xE000E104加载值、将其与04进行或运算、然后将其存储回 0xE000E104、该位也被置位。

    我在《技术参考手册》中查阅了 PRIMASK、第1.4.2.1节说、它与其他内核寄存器一起"不是存储器映射的、而是由寄存器名称访问的、因此基址不适用、并且没有偏移。  您能告诉我如何确定 PRIMASK 的值吗?

    此外、您是否了解任何具有使用中断的功能安全装置定时器的应用?  如果我可以查看其中一项、可能会有所帮助。

    谢谢、

    Brad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    [引用 userid="470468" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1175668/msp432e401y-writing-an-assembly-language-interrupt-routine-for-the-watchdog-timer/4451207 #4451207"]I 在《技术参考手册》中查找了 PRIMASK、第1.4.2.1节指出、它与其他内核寄存器一起"未映射存储器并可通过寄存器名称访问、因此基址不适用且不存在偏移。  您能告诉我如何确定 PRIMASK 的值吗?

    这将对您有效:

        uint32_t ui32Ret;
    
        //
        // Read PRIMASK and enable interrupts.
        //
        __asm("    mrs     r0, PRIMASK\n"
              "    cpsie   i\n"
              "    bx      lr\n"
              : "=r" (ui32Ret));

    [引用 userid="470468" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1175668/msp432e401y-writing-an-assembly-language-interrupt-routine-for-the-watchdog-timer/4451207 #4451207">此外,您是否知道有任何具有使用中断的功能监视器计时器的应用程序?  如果我可以查看其中一个内容、可能会有所帮助。

    是- C:\ti\simplelink_msp432e4_sdk_4_20_00_12\examples\nortos\MSP_EXP432E401Y\driverlib\watchdog_masable_interrupt

    此致、

    Ralph Jacobi