工具/软件:Code Composer Studio
我正在使用 MSP430FR5889并在 CCS 环境中使用 C 语言进行编写。
在程序运行期间、有时程序流会中断、执行会"跳转到"错误的地址。
有时在代码内部、有时在程序代码外部寻址。
我在捕获和比较模式下都使用 Timer_A 的中断、但在我可以检查的范围内、所有中断都正确结束(我在入口和退出匹配的 ISR 时引入的调试计数器)。
我尝试更改 CCS 版本、编译器版本、优化级别、但没有更改。
有没有这种情况会响铃给任何人?
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.
工具/软件:Code Composer Studio
我正在使用 MSP430FR5889并在 CCS 环境中使用 C 语言进行编写。
在程序运行期间、有时程序流会中断、执行会"跳转到"错误的地址。
有时在代码内部、有时在程序代码外部寻址。
我在捕获和比较模式下都使用 Timer_A 的中断、但在我可以检查的范围内、所有中断都正确结束(我在入口和退出匹配的 ISR 时引入的调试计数器)。
我尝试更改 CCS 版本、编译器版本、优化级别、但没有更改。
有没有这种情况会响铃给任何人?
我发现正常程序流的跳转发生在调用命令的其中一种情况中。
该点的反汇编是:
012980: 13B1 2EDA Calla #SetRF_Mode
程序在此命令中成功传递了数百次、没有问题、但另一次跳转到 了保存地址0x0113B1的命令。
该地址不在 CALLA 命令的操作码范围内、这使我怀疑处理器将 CALLA 命令的第一个字作为 操作、也用作 目的(而不是作为第二个字)。
有什么想法吗?
尊敬的 Caleb:
感谢你的答复。
器件封装:
MSP430 FR5889 TI 541 C C8JN G4
我尝试了3个 CCS 版本(无更改):6.1.0;6.2.0;7.0.0
我在2个器件上尝试过它、但没有改变。
出现问题的代码为:
DBG_RxStatus |= 0x0001;
TA0CCTL1 = 0; //禁用中断
SetRF_SLEEP ();//停止射频 Rx (SLEEP)//解析为 SetRF_Mode (0x00、1);
DBG_RxStatus |= 0x0004;
反汇编是:
1142 dbg_RxStatus |= 0x0001;
012970: D392 2152 BIS.W #1、&dbg_RxStatus
1145 TA0CCTL1 = 0;//禁用中断
012974: 4382 0344 CLR.W &Timer0_A3_TA0CCTL1
1150 SetRF_SLEEP (); //停止射频 Rx (SLEEP)
012978: 434C CLR.B R12
01297A: 435D MOV.B #1、R13
01297c: 13B1 2ED6 CALA #SetRF_Mode
1152 dbg_RxStatus |= 0x0004;
012980: D2A2 2152 BIS.W #4、&dbg_RxStatus
问题在于通常分支到 SetRF_Mode()例程的 Calla 命令,但随后另一个时间分支到地址0x0113b0 - 0x0113b1中的命令。
Ofec。
您好、Ofec、
感谢您提供代码片段。 我将尝试使用我自己的硬件重新创建它。 在与我们的质量团队交谈后、我们还会为您提出几个问题:
此致、
Caleb Overbay
尊敬的 Caleb:
感谢您的努力。
我的处理器以16MHz 运行、因此 NWAITS 设置为1。
我不使用 DMA。
我的系统的硬件设置为:
void hw_Init (void)
{
//看门狗关闭
WDT_HOLD (); // WDTCTL = WDTPW|WDTHOLD
// LED 设置
LED_Init(); // GPIO
LED_ON();
//调试设置
DEBUG0_init (); // GPIO
DEBUG1_INIT();
DEBUG2_init();
DEBUG3_init ();
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//设置系统时钟
PJSEL1 = 0; //将 XTAL 引脚置为有效
PJSEL0 = 0x50;
//
CSCTL0_H = CSKKEY_H; //解锁 CS 寄存器
CSCTL1 = DCORSEL|DCOFSEL_3; //将 DCO 设置为16MHz
CSCTL2 = SELA_VLOCLK|SEL__VLOCLK|SELM_VLOCLK;//选择所有到 VLO 的时钟源
CSCTL3 = DIVA__1|DIVSA_1|DIVM__1; //为时钟源设置无向素
CSCTL4 = HFXTDRIVE_3|HFFREQ_1_LFXTDRIVE_3;//设置驱动器电流和频率。 范围
//
操作
{//循环、直到所有故障标志都被清除
CSCTL5 &=~(HFXTOFFG|LFXTOFFG); //清除故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
//
CSCTL0_H = 0; //锁定 CS 寄存器
//
FRCTL0 = FRCTLPW|NWAITS_1; //设置1等待状态
FRCTL0_H = 0;
//
CSCTL0_H = CSKKEY_H; //解锁 CS 寄存器
CSCTL2 = SELA_LFXTCLK|SEL__HFXTCLK|SELM_DCOCLK;//选择实际的时钟源
CSCTL4 |= VLOOFF; //关闭 VLO
CSCTL0_H = 0; //锁定 CS 寄存器
//初始计时过程
Timer_Init(); //如下所示
//启用中断
_enable_interrupt ();
//设置看门狗计时器
WDT_SET (); // WDTCTL = WDTPW|WDTCNTCL|WDTSSEL0|WDTIS__32K
//将 LED 关闭
LED_OFF (); // GPIO
}
空 Timer_Init (空)
{
//为 SMCLK/8设置 Timer_A0、Timer_A1和 Timer_A3、启动、溢出时无中断。
TA0CTL = TASSEL1|ID1|ID0|MC1|TACLR;
TA1CTL = TASSEL1|ID1|ID0|MC1|TACLR;
TA3CTL = TASSEL1|ID1|ID0|MC1|TACLR;
//为 ACLK 输入设置 Timer_A2、启动、溢出时无中断。
TA2CTL = TASSEL0|MC1|TACLR;
//初始化时间计数过程
TA3CCTL0 = 0;
TA3CCR0 = MILISECOND;
TA3CCTL0 = 0;
TA3CCTL0 = CCIE;
}
我没有尝试在没有调试器的情况下工作。
在我的程序正常运行之前、我很少这样做。
至於问题的重现性,我会再次强调:
该程序正常运行几秒钟、甚至一两分钟。
在这段时间内、它经过了几十到几百次、没有任何问题。
由于没有外部原因、我可以看到、这种现象发生了一次。
当我 此时没有使用断点停止程序时、程序会继续运行、但由于0x0113b1代码位于主循环中、因此 Stuck 无法正确折返、并且在几次出现问题后、堆栈溢出、WDT 会复位处理器。
我想强调的是、当我对代码进行一些更改(如添加调试标志设置)时、问题可能会改变其发生的频率。
例如、在我发送给您的示例代码中、添加 dbg_RxStatus |= 0x0002;在 TA0CCTL1 = 0之后的行中;在调用例程之前、将问题的频率而不是在数秒之后更改为在数分钟之后、有时超过1小时。
Ofec。
您好、Ofec、
感谢您提供详细说明。 我看到您在将时钟初始化为16MHz 后将设置等待状态。 我强烈建议在执行此初始化之前设置等待状态。 虽然这可能不是问题的根本原因、但它将有助于将其排除为问题的一部分。
我无法在我的末尾重现此问题 由于这个问题看起来非常具体、因此最好使用您正在运行的代码的副本来复制这个问题。 如果愿意、您可以向我发送包含您的代码的私人消息、以便我们更好地评估此问题。 我已向您发送朋友请求、一旦接受、您应该可以向我发送一条消息。
此致、
Caleb Overbay