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.

[参考译文] MSP430FR2355:生成软 ISR

Guru**** 2527710 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1002153/msp430fr2355-generating-soft-isrs

器件型号:MSP430FR2355

你好。。。

我有一个接收命令的 UART。  主系统唤醒并处理/执行命令。  然后、我需要回圈以使用 main 开始处的函数将要发送的命令数据包放在一起。  问题在于、我对传入的 UART 执行操作后、返回主函数的开头、我进入 LPM3、并且永远不会进入第二个函数来构建数据包、因为此时不会发生 ISR。  处理此问题的最佳方法是什么?  假设我使用未使用的 I/O 并生成 IRQ、当我的 UART rcv 处理函数位于代码中间的某个位置时、如何执行此操作?  如果我的函数生成 IRQ,我将返回并在我到达 main 末尾之前处理命令,此时我没有比这更好的选择了,因为 main 的第一行是 LPM3....

简而言之、我的 rcv 处理函数和我构建消息所需的函数位于 main 内的某个位置。  main 仅在 ISR 之后唤醒、在 rcv 处理函数之后、我将不会唤醒 ISR。

配置开始后执行

    while(1)
    {
        LPM3;

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

    您好、Steve、

    下面是有关软中断的相关主题:

    https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/198624/how-to-generate-software-interrupt-in-msp430?tisearch=e2e-sitesearch&keymatch=MSP430F1610

    根据该线程、您应该能够设置中断标志、因此无需通过 GPIO 生成外部触发:  

    https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/137409/software-interrupt

    我目前对如何解决您描述的问题没有任何其他见解。

    希望这对您有所帮助。

    BR、
    Leo

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

    我不完全确定您的担忧是什么、但有一些想法:

    1) 1)在大多数情况下、可以显式设置 IFG 并调用相关 ISR。 (我记得、您使用过此功能。)  

    2) 2)您没有提供太多上下文、但即使是该片段也似乎很奇怪、因为通常情况下、在您无法完成工作后、LPM 调用会更接近主循环的底部。 典型的回路可能如下所示:

    while (1) {
       do_work_1();
       do_work_2();
       __disable_interrupt();         // (Avoid race)
       if (work_to_do()) {            // New work in the meantime?
          __enable_interrupt();
          continue;                   // Go try again
       }
       __bis_SR_register(LPM3_bits | GIE); // Sleep until work to do
    }

    它会不断循环、直到没有新工作到达、然后进入 LPM。

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

    是的,Bruce 我使用了软中断....我的环路是180度相反....

    也就是说、我在顶部设置 LPM3并等待 IRQ 发出。  IRQ 设置"软"处理标志。  然后、我为这些标志提供服务。  其中一些标志通过设置另一个在循环中进一步向下的进程标志来完成...最后在经过一个通道后、我到达循环的底部、然后返回 LPM3。  在本例中、我在循环末尾有一个进程、需要运行一个位于循环中间的进程...不过、我能够确定它、因为我通过设置在 GPIO 输入端创建了一个"软"ISR 唤醒 main 的 while (1)循环的末尾处的 IFG 标志。