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.

[参考译文] MSPM0G1506:MSPM0G1506 系统节拍更新变量问题

Guru**** 2989100 points

Other Parts Discussed in Thread: UNIFLASH, MSPM0G1506, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1662180/mspm0g1506-mspm0g1506-system-tick-update-variable-issue

器件型号: MSPM0G1506
主题中讨论的其他部分: UNIFLASH、 SYSCONFIG

尊敬的专家、我正在使用 mspm0g1506、面临大约 10%的 MCU 无法使用正常逻辑正确运行的问题、MCU 无法通过 app.c:56(AppDelayMs 函数)。 在 MCU 工作时使用 Uniflash 转储闪存、工作方式完全相同。

如果我对 SysConfig 或应用程序代码有一些错误(90%的 MCU 可以正常使用此代码)、请点击以下链接下载。

https://drive.google.com/file/d/14P2POg0J5JnXCO5Fa0lRo_vsb8LizPdx/view?usp=drive_link

提前感谢、

 

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

    您好、Hai、

    在深入探讨代码之前、您能否用更多详细信息来描述您的问题、如果您可以将代码范围缩小为一个简单的演示、从而重现问题、效果会更好。

    BR、

    Janz Bai

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

    我无法访问您的源。

    但鉴于这些提示、您是否使用 volatile 来指示未经编译器知道变量可能会更改?

    访问 SysTick 变量时是否锁定中断?

    如果您*正在*锁定中断,您是否访问您的变量这么多以至于您丢失了 systick ?

    这些都是一些过去咬过我的东西。

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

    尊敬的 Janz Bai、

    我将对问题进行如下描述:
    -该工程使用 Sysconfig、默认时钟为 32MHz、SysTick 中断配置为 1ms。
    -一个名为`volatile`的变量用于中断变量。

    定义:
    typedef 结构{
    易失性 uint32_t u32SysTick;
    uint32_t u32TestLedTick;
    uint8_t testLedMode;
    uint8_t testLedPass;
    uint8_t testLedIndex;
    uint8_t lastCoilState;
    uint8_t coilStateCnt;
    uint8_t currCoilState;
    uint8_t tmpState;

    }App_t;

    用法:
    空系统 Tick_Handler (){
    GAPP.u32SysTick++;

    }

    uint32_t AppGetTick (){
    返回 GAPP.u32SysTick;
    }
    -当我在 CCS 中使用调试器时,我会看到一个 SysTick 中断(但我不确定确切的 1ms 间隔),然而,当我在 CCS 中步进时,GAPP.u32SysTick 变量不会稳定递增;它会增加到大约 300 或 400 ,然后返回到大约 100 或 200。 SysSys Tick_Handler 函数在代码中的任何其他地方都不会写入此变量。
    -误差仅在大约 10%的电路板上随机出现。
    -有故障的主板总是失效,而没有故障的主板总是正常运行。
    -故障和无故障电路板的闪存转储具有完全相同的内容。
    -当我对代码进行细微编辑并重建时,错误在所有板上消失。
    -当我检查整个源代码时,我发现没有逻辑问题。
    -当我对源代码进行细微编辑并重新加载以前有故障的电路板时,错误不再再次出现。
    *我想在这个项目中调查的问题是为什么它在使用这个确切的源代码构建时失败。 请说明如何向您发送完整的源代码、以便全面了解(SysConfig,编译器,工程设置等)来确定哪个组件导致了问题?

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

    请参阅下面的答复 Janz Bai 

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

    除了可能通过在 AppGetTick 中关闭 SysTick 中断来保护访问之外、我想看看您是否未向 TestLedTick 写入 16 位值、会破坏 u32SysTick。

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

    我发现原因:我将 WWDT 设置为 500ms 周期、这会导致 500ms 的块延迟在某些 MCU 上触发看门狗复位、而看门狗计时器比其他 MCU 更快。 我通过增加 WWDT 的超时来解决这个问题。

    谢谢你。