TI中文支持网
TI专业的中文技术问题搜集分享网站

MSPM0L1306: 在中断里对flash进行操作后,全局变量的值被修改

Part Number:MSPM0L1306Other Parts Discussed in Thread: SYSCONFIG

在MSPM0L1306上,我想要实现GPIO中断触发flash写入操作。

当中断触发时,将一个长度为16的char型数组writeStr(这是一个全局变量)存入flash地址0x00008000中。但是很奇怪的是,我的这段代码在运行完DL_FlashCTL_unprotectSector(FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN);后,writeStr数组的值被修改。

我尝试了一些方法,有一些确实能够解决问题。比如:

1、把flash操作放在main函数里而不是中断里;

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

3、在声明writeStr时对其填入有效数据,这样也能改变writeStr的地址。

虽然上述方法能够帮我解决问题,但我还是很好奇究竟是什么导致flash在操作的时候,全局变量的值会被覆盖修改。

我在keil软件里对代码进行了单步调试,并将writeStr添加到了Watch中,可以看到地址为0x200000D4。

在Memory中查看0x200000D4地址存放的数据,可以看到有三个字节数据,这是我通过键盘外设输入的值。

当程序进入GROUP1_IRQHandler,运行完DL_FlashCTL_unprotectSector(FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN);后

会发现Memory中0x200000D4存放的数据被修改

当设置writeStr值被修改就触发断点后,可以看到上面Disassembly窗口代码停在了下图,此时Memory中可以观察到相应的值也发生了变化。

以上是我调试发现的现象,希望有人能为我指点迷津。

Ben Qin:

你好,为了更好的解决您的问题,我需要咨询下相关资深工程师,一旦得到回复会立即回复您。

,

Ben Qin:

你好,这看起来像编译器的问题,这边在CCS v12.5 上测试了一下没有发现您的问题,您使用的是什么编译器?能否提供下您的代码?或者您是否能在CCS12.5或12.6上测试一下?

,

JAS Zhou:

谢谢您的回复!!我使用的是keil 5.39 + mspm0_sdk_1_20_01_06,工程文件我会上传。看您测试的时候是将DL_FlashCTL_unprotectSector放在了main函数里执行,在我这里也是没问题的,放在main函数确实没有我说的那些问题。我的问题主要是在响应中断后,在中断函数里对flash进行操作有可能会覆盖掉全局变量原有的值,这个bug我们这里很多人有遇到,而且并没有一个从根源解决的方法,因为我们也不知道问题究竟出现在哪。FLASH_WRITE_READ_TIMER.zip

,

Ben Qin:

有没有尝试过增加程序堆栈的大小?

,

JAS Zhou:

确实有可能是这个问题。MSPM0我刚接触不久,想请教一下在keil开发环境下,程序堆栈大小要在哪里进行配置呢?是sysconfig工具吗?

,

Ben Qin:

参考下这个页面:

适用于 MSPM0 MCU 的 Arm Keil MDK IDE 5.38+ 版 — Arm Keil MDK IDE for MSPM0 MCUs Documentation 1.0 documentation

,

JAS Zhou:

非常感谢!明天我尝试一下。

,

Ben Qin:

好的 不客气

,

JAS Zhou:

太感谢了!我将Stack_Size从0x00000100设置为0x00000400后,就没有问题了。

赞(0)
未经允许不得转载:TI中文支持网 » MSPM0L1306: 在中断里对flash进行操作后,全局变量的值被修改
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1