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.

[参考译文] MSPM0L1306:在中断中操作闪存后、全局变量的值被修改。

Guru**** 2439710 points
Other Parts Discussed in Thread: MSPM0L1306

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1317488/mspm0l1306-after-operating-the-flash-in-an-interrupt-the-value-of-the-global-variable-is-modified

器件型号:MSPM0L1306

大家好、

客户有问题需要您的帮助:

在 MSPM0L1306上、我希望实现 GPIO 中断以触发闪存写入操作。

当中断被触发时、长度为16的 char 数组 writeStr (一个全局变量)将存储在闪存地址0x00008000中。  但很奇怪的是、在我的代码运行 DL_FlashCTL_UnprotectSectSector (FLASHCTL、MAIN_BASE_ADDRESS、DL_FLASHCTL_REGION_SELECT_MAIN)后、 writeStr 数组的值会被修改。

我尝试了几件事,其中一些确实工作。  例如:

1.将闪存操作置于主函数中,而不是中断中;

2.将其他.c 文件中的全局变量更改为局部变量,以更改 writeStr 的地址;

3. 在声明 writeStr 时填写有效数据,这样 writeStr 的地址也可以更改。

尽管上述方法可以帮助我解决问题、但我仍然很好奇在闪存运行时导致覆盖和修改全局变量值的原因。

I 在 Keil 软件中单步执行代码并将 writeStr 添加到 Watch。 我可以看到地址为0x200000D4。

检查存储器中地址0x200000D4处存储的数据。 您可以看到有三个字节的数据。 这是我通过键盘外设输入的值。

当程序在运行 DL_FlashCTL_UnprotectSectSector (FLASHCTL、MAIN_BASE_ADDRESS、DL_FLASHCTL_REGION_SELECT_MAIN)之后进入 Group1_IRQHandler 时;

您将发现存储器中存储在0x200000D4处的数据已修改。

当 writeStr 值被修改时触发断点时、您可以在下图中看到上述反汇编窗口代码停止。 此时、您可以观察到相应的值也在 Memory 中发生了变化。

以上是我在调试过程中发现的现象。 我希望有人能给我一些建议。

此致、

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

    尊敬的 Ben:

    我在 CCS v12.5上进行了测试。 我在我这边看不到这个问题。 字符串值未更改。  

    对我来说、该问题更像是编译器问题。 客户测试的编译器版本是什么? 能否提供他们的代码? 或者、他们也可以尝试在 CCS v12.5或 v12.6上测试代码。  

    此致、

    现金豪

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

    现金、您好!

    感谢您的回复!   我正在使用 Keil 5.39 + mspm0_SDK_1_20_01_06、然后上传项目文件。  在进行测试时、您似乎会 将 DL_FlashCTL_UnprotectSectSector 放在主函数中进行执行。 这对我来说是没有问题的。 把它放在主函数中没有我提到的问题。  我的问题主要是、在对中断做出响应后、在中断函数中运行闪存可能会覆盖全局变量的原始值。 我们这里的很多人都遇到了这个错误、因此没有根解决方案。 因为我们并不知道问题的确切位置 。  

    FLASH_WRITE_READ_TIMER.zip

    此致、

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

    尊敬的 Ben:

    你是否已尝试过更大的项目堆栈和堆大小?

    此致、

    现金豪

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

    现金、您好!

    非常感谢!  将 Stack_Size 从0x00000100设置为0x00000400后、没有问题。

    此致、