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.

[参考译文] MSP430F2370:TimerB1、TimerB2 CCIFG 在 CCIE 设置为0时自动设置为1、从而导致 ISR 陷阱。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/927536/msp430f2370-timerb1-timerb2-ccifg-set-to-1-automaticaly-when-ccie-is-set-to-0-causing-isr-trap

器件型号:MSP430F2370
主题中讨论的其他器件:TRF7970A

您好!

我将 MSP430F2370与 TRF7970A 搭配使用。 我正在使用基于 sloa214的代码。

在 sloa214中、TimerA0用于 RFID 读取 API 以实现超时、但在修改后的代码中、我们将 TimerA0用于应用逻辑、并将 TimerB0用于 RFID API。

因此、当 Mifare 身份验证过程发生故障时、有时代码 会跳转至 ".text:_ISR:_TI_ISR_TRAP"、因此我编写了所有 INT 矢量处理程序以了解发生了哪个 INT、因此在调试后发现 timerB1 INT 矢量处理程序被调用、但代码在那里存根不会返回 来自处理程序。

那么、我的问题是、当 CCIE 设置为0并调用 INT 处理程序时、为什么 TimerB1、TimerB2 CCIFG 自动设置为1。  

ISR 陷阱上的定时器 B SFR 状态和早期状态附加在屏幕截图中。  

TBIV 值变为0x000E。  

void
McuCounterSet (void)
{
TBCTL |= TBCLR;
TBCTL &=~TBCLR;//复位 timerA
TBCTL |= TBSSEL0 + TBIE;// ACLK (@ 3KHz)、中断使能、定时器停止

TBR = 0x0000;
TBCCTL0 |= CCIE;//比较中断使能
} 

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

    在 MSP430上、独立于各自的 IES 设置 IFG。 为您不感兴趣的事件设置 IFG 是常规做法。

    >    TBCTL |= TBSSEL0 + TBIE;    // ACLK (@ 3KHz), interrupt enable, timer stoped

    This is what's causing your TIMER0_B1_VECTOR (which evidently isn't defined) to be called. Since you don't seem to be interested in TBIFG, I recommend you Not set TBIE.

    In Up mode, TBIFG happens at (almost) the same time as TBCCTL0:CCIFG (TIMER0_B0_VECTOR) so there's rarely a reason to enable both.

    未经请求:TBCLR 位自行清除、因此您的代码无需将其清除。

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

    您好!

    它仍然会产生问题。 请参阅随附的屏幕截图。

    void
    McuCounterSet (void)
    {
    TBCTL |= TBCLR;
    TBCTL &=~TBCLR;//复位 timerA
    TBCTL |= TBSSEL0;// ACLK (@ 3KHz)、中断使能、计时器停止
    
    TBR = 0x0000;
    TBCCTL0 |= CCIE;//比较中断使能
    } 

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

    TB0CCTL1:CCIE 被置位。 这也会导致问题。 如果您不想赶上 CCIFG、请不要设置 CCIE。 [参考用户指南(SLAU144J)第13.2.6节]

    您没有发布任何用于设置 CCIE 的代码、因此您感兴趣的代码位于其他位置。

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

    关于、TB0CCTL1:CCIE 我知道、并且在代码中没有置位。 它在您的建议之前未进行设置、但在您建议应用更改后、这是 INT 的状态。 但在代码 TB0CCTL1:CCIE 中未使用。

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

    TB0CCTL1:CCIE 本身不会变为1、所以在某个地方会对其进行设置。 您是否正在使用任何外部库?

    我想您可以尝试显式清除它。 这至少可以消除您的症状。

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

    您好!

    我们已将应用 程序 sloa214作为我们应用程序的基本代码、因为 MifareCryptoLibrary.lib 已包含在其中、您可以确认库中存在与此问题相关的任何内容。

    此致、

    Hardik Harpal

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

    很遗憾、我无法确认、因为我没有源代码。 [我已经申请了、但我不希望获得批准、因为我不得不承认、我可能不会很快购买其中的任何一个。] 在"Crypto"库中使用计时器相当不寻常。

    我在 AppNote 源中看不到任何 TimerB 引用。 您在上面发布的代码是否是您添加的代码?