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/MSP430FR6989:此代码如何在 MSP430上无法完全确定地运行?

Guru**** 2589300 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/949173/ccs-msp430fr6989-how-come-this-code-doesn-t-behave-entirely-deterministically-on-the-msp430

器件型号:MSP430FR6989

工具/软件:Code Composer Studio

下面我介绍了一个非常简短的计划。 它的行为以可预测的方式发生变化(因此我的线程标题有点用词不当)、但似乎不应该发生变化、我不确定导致这种变化的原因是什么。

该电路很简单、唯一的外部组件是按钮和两根导线、在按下按钮时将 P2.1连接到 P8.4。 按下按钮时会触发中断例程。

如果我将代码刷写到 MSP430、中断例程将不起作用。 板载 LED 不会亮起(或者在某些情况下、它会稍微闪烁、然后熄灭)。 如果我触发中断例程的次数为奇数次、以便灯亮起、然后重新刷新程序、灯将亮起、灯将按预期工作、每次按下按钮时切换。 如果我在指示灯亮起时重新刷写程序、则中断将按预期工作。 但是、如果我在指示灯熄灭时重新刷新程序、程序将无法再次打开指示灯、直到我按照上述步骤操作(按触发按钮奇数次、然后重新刷新)。

我还对一些代码行进行了注释。 这些行是我实验过的行、用于查看它们是否可以解决问题-例如、将 unlock 语句移至看门狗时钟禁用的正下方、或尝试在初始化任何内容之前清除输出矢量。

我对这种行为非常困惑、因为这完全是意料之外的、我看不到软件中的任何内容会导致这个问题。

#include 

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; 
//PM5CTL0 &=~LOCKLPM5; //P8OUT &=~0xff; //P2OUT &=~0xff;
//P9OUT &=~0xff; P2DIR &=~BIT1;//input P2REN |= BIT1;//PULLUP P2OUT |= BIT1;//SIAT HIGH P8DIR |= BIT4;//输出 P8OUT &=~ ~ ~BIT4;//输出低电平 P2OUT |= BIT1;// 输出中断0xPSIMPLE_TRIPE |= 0x2 ;//在 PORT0上启用 中断/LPTIES |= 0xPM2;//中断0xPM=中断0xLPBIST/中断= 0xPM1;//中断向量 LPBIST_2;//中断=中断0xLPBIST/中断= 0xPM1;//中断=中断0xPM1;//中断0xPM=中断0xLPBIST/中断=中断0xPM2;=中断向量 LP2=中断=中断0x //关联函数。 具有中断矢量 _interrupt void Port_2 (void) // ISR 的名称 { 开关(__evo_in_range (P2IV、P2IV_P2IFG7)) { //我使用 P2.1-2.4作为输入。 案例 P2IV_NONE:break;//向量0:无中断 案例 P2IV_P2IFG0:中断;//向量2:P2.0 案例 P2IV_P2IFG1: P2IE &=~BIT1;//禁用中断 P2IFG &=~0xff; P1DIR ^= BIT0;//使能输出 P1OUT ^= BIT0;//打开板载 LED P2IE |= BIT1; 中断; 案例 P2IV_P2IFG2: 中断; 案例 P2IV_P2IFG3: 中断; 案例 P2IV_P2IFG4: 中断; 案例 P2IV_P2IFG5:中断;//矢量12:P2.5 案例 P2IV_P2IFG6:中断;//向量14:P2.6 案例 P2IV_P2IFG7:中断;//向量16:P2.7 默认值:break; } }

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

    好的、为任何感兴趣的人找到了解决方案。 尽管我仍然可以解释为什么需要这样做:

    我将 IES、IE 和 IFG 语句移到了_ENABLE_INTERRUPT ()之后;

    这已阻止了该问题在简单程序中发生。 但是、在较大的程序中、尽管 ISR 设置相同、但有时问题似乎仍会逐渐增大。 哦、嗯。

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

    > 我将 IES、IE 和 IFG 语句移到了_ENABLE_INTERRUPT ()之后;

    更重要的是、您在清除 LOCKLPM5的声明之后移动了这些内容。 [参考用户指南(SLAU367P)第12.3.1节]