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后,就没有问题了。