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.

[参考译文] CCS/MSP430FR5849:MSP430FR5849

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/586888/ccs-msp430fr5849-msp430fr5849

器件型号:MSP430FR5849

工具/软件:Code Composer Studio

您好!

我正在使用 MSP430FR5849DA 进行设计。

为了捕捉红外接收器的输出、我使用引脚36、TA0 CCR0捕捉:CCI0B 输入。

MSP430FR5849数据表的表6-4 (第58页)显示了使用中断矢量0FFEAh 来捕获该引脚上的中断。

MSP430FR5849系列用户指南和 CCS MSP430FR5849头文件表明 TA0IV 寄存器仅支持 TA0CCR1和 TA0CCR2的向量。

什么是正确的、我可以使用中断下的引脚36来捕获事件吗?

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

    你好,Jan!

    CCR0始终有它自己的中断矢量,而 CCR1、CCR2 ... 共享一个矢量、TAxIV 可用于确定中断源(这也会清除最高挂起中断标志)。 但这不适用于另一个矢量的 CCR0、这就是 TAxIV 不涵盖 CCR0的原因。

    来自 TA0的 CCR0中断向量为:

    #pragma vector = TIMER0_A0_Vector
    __interrupt void timer0_a0_isr (void)
    {
    //进入中断函数时自动清除 CCR0的中断标志
    } 

    Dennis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dennis、
    感谢您的澄清。
    我怀疑有这种情况、但不确定、因为系列用户指南中没有提到这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dennis、

    还有一个问题。
    由于在中断矢量处理中使用了 switch 语句、因此我也在最初的捕获比较 ISR 中使用了 switch 语句、并在代码中广泛使用 break 语句跳转到 ISR 的末尾。 (如果您有兴趣、我可以向您发送代码)
    由于不再需要 switch 语句、break 语句不是从 ISR 中跳出的最简单方法。
    我是否还可以使用"exit(0)"语句代替中断,而不影响 ISR 内容恢复?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Jan!

    很抱歉、我不完全理解您所写的内容。 我不知道"EXIT (0)"。 可能只需发布 ISR 代码或显示您含义的示例。 无需在 ISR 中使用开关情况结构、但由于 TA0IV 返回整数值、因此使用开关情况很简单。 进行比较

    if (TA0IV == 2)
    {...
    
    }
    否则,如果(TA0IV ==4)
    {...
    
    }
    (笑声) 

    每次访问 TA0IV 时、您都会清除最高挂起中断标志、因此如果在这里不起作用、则会清除 if-else。 开关情况的另一个优势。 如果只启用了一个中断源、则可以完全不启用中断源、如果不自动清除该标志、只需自行清除即可。 对于 CCR1、CCR2、... 您必须将其清除、因为 CCR0通过进入 ISR 被清除。

    Dennis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dennis、
    很抱歉让你迷惑。
    在 RC5解码器的版本1中、使用 CCR1作为输入、因此我使用 TA0IV 解码和 switch 语句来获取正确的 CCR1矢量并执行适当的代码。
    我的完整 RC5解码器包含在该 switch 语句的 CCR1案例中、并使用几个中断在代码中的几个点退出案例以跳转到 ISR 末尾。 现在、使用 CCR0并为其分配单个中断、我不再需要您也提到的 switch 语句。
    没有 switch 语句意味着在 case 中没有 break 语句、因此我需要另一种方法来跳转到代码中的 ISR 末尾或重写完整函数。
    我假设 switch 语句中的 break 语句有点像指向 switch 语句末尾的"goto"语句。
    C 语言中还有一条"EXIT(0)"语句、但文献内容模糊、无论该语句是否直接从 ISR 中跳出而不保存任何上下文。

    这是我的实际问题-> ISR 中的"EXIT(0)"语句在退出时仍会保存上下文。

    更好的方法可能是在 ISR 结束时使用该"goto"语句、并允许在 ISR 退出时恢复上下文或重写完整函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Jan、

    如果我理解正确、您可以使用状态变量并在需要跳转到 ISR 末尾时将其设置为指定值。 然后、使用 If-else 语句防止代码的某些部分根据变量的值执行。

    此致、
    Caleb Overbay