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.

[参考译文] MSP430F67471:我们的一些系统在某个点崩溃、没有已知原因

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/958647/msp430f67471-some-of-our-systems-crashes-at-a-certain-point-without-a-known-cause

器件型号:MSP430F67471

大家好!

我们的某些系统上的引导加载程序中存在一个奇数错误。 我们通过 USART 向引导加载程序发送 FW-File、下载进度显示在 LCD 上。 但在我们的某些系统中、引导加载程序会在 LCD 更新后立即崩溃并复位。 到目前为止、我们只有始终工作或始终失败的器件、我们还没有找到有时会崩溃的器件。 所有器件在技术上都是相同的、硬件没有任何差异、因此它似乎取决于组件容差。

我们的 MSP 采用3.3V 电源供电、运行频率为16MHz:
UCSCTL0 = 0x0000
UCSCTL1 = DCORSEL_5;
UCSCTL2 = FLLD__1 +511;
UCSCTL4 |= SELA2;

我们的(简化的)代码:
静态空 ParseRXData(){
 //解析/验证/刷写接收到的数据块
 if (NewChunk){
    UpdateLCD (((U8)((NumBytes *(U32) 100)/NumBytesTotal));
   _DELAY_CYCLES (51);//<-变通办法!
 }


void UpdateLCD (u8 value){
 //根据值,计算要显示的数字
 _LcdWrite();
 //在此处添加延迟不起作用!


void _Lcdwrite (void){
 //写入 LCDMEM


他迄今所发现的:

  • 使用调试器单步执行代码时、不会发生错误。 但是、由于 USART 中断、代码执行无论如何都是完全不同的
  • 当使用连接的调试器运行时、它将在没有调用堆栈的情况下停止在"_DebugBreak"中、因此我们不知道崩溃的确切发生位置。 状态寄存器不显示任何故障或 NMI
  • 注释掉"UpdateLCD"时、不会发生崩溃。 但是、在专用测试中测试函数 UpdateLCD 效果非常好、它也用于其工作的软件的其他部分。
  • UpdateLCD 之后的__delay_cycles 似乎修复了崩溃。 必须为51个或更多周期、50个周期将崩溃。 在 UpdateLCD 中放入 delay_cycles 将不起作用
  • 将 CPU 时钟降低到8MHz 似乎可以修复崩溃

那么、有什么提示如何解决这个问题呢? 到目前为止、delay_cycles 的权变措施似乎有效、但我们不知道原因。 我们不知道它是否真正修复了所有器件上的问题。

谢谢!

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

    >UCSCTL4 |= SELA2;

    这将设置 ACLK=4 (DCOCLKDIV)、对于 LCD、这一运行频率几乎肯定高于40kHz 的最大值。 [参考 UG (SLAU208Q)表5-7、DS (SLAS815D)第5.46节]。 我怀疑您的意思是:

    > UCSCTL4 |= SELA_2; // ACLK=REFO

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

    感谢您的回答、您答对了、它应该是 SELA _2。 不幸的是、修复此问题对我们的崩溃没有影响。

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

    您好、Florian、

    能否分享  一些有关 UpdateLCD()函数的详细信息?

    谢谢!

    此致

    Johnson

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

    当然、没问题。 它获取输入值("Num"、一个范围为0到100的 U8)、并将其 ASCII 表示形式存储在 char 数组 pStr 中:

    U8 I = 3;
    u32 Val;
    const U16 Powers[]={1、10、100、1000};
    Val =(U32)数字;

    /*将数字转换为 ASCII 表示*/
    执行{
     PStr[3U - I]=(U8) 0x30u;
     while (Val >= Powers[i])
     {
       Val ---- Powers[i];
       pStr[3U - i]++;
     }
    } while (i-->0U);

    /*空格而不是前导零*/
    对于(i = 0;(i < 3U)&&(pStr[i]=(U8) 0x30u);i++){
     pStr[i]=(U8)';


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

    您好、Florian、

    看起来 很奇怪、我在您的代码中没有发现任何问题、您使用的是 MSP430F67471、对吧? 当您将 MCLK 设置为8MHz 或增加51个周期或更多延迟时、该问题将得到解决、对吧?

    此问题:8MHz 可以正常工作、16MHz 异常可能出现在 FRAM MCU 中(如果没有此代码: FRCTL0 = FRCTLPW | NWAITS_1;)、但您应该使用闪存 MCU、这看起来非常奇怪。


    此问题是否出在芯片上? 还是所有 MCU 都存在相同的现象(F67471)?

    谢谢!

    此致

    Johnson

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

    你好

    器件是一款正确的"MSP430F67471IPZ"器件。 对于8MHz 或这51个周期、它也是正确的。

    我们仅以某些单位出现此误差。 所有这些单元都是相同的、相同的 PCB、相同的组件、相同的 CPU、相同的软件。 在大约10个器件中有9个正常工作、但这10个器件中有1个始终显示此错误。 我们不知道这两个单元之间的区别是什么。

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

    本次讨论已离线。

    此致、

    James

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

    要完成此主题:问题是 VCORE 设置错误。 使用 driverlib 中的 PMM 代码解决了我们的问题

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

    您好、Florian、

    感谢您跟进并添加解决方案。 我很高兴问题已得到解决!

    此致、

    James