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.

[参考译文] MSP430F5325:闪存存储器部分在调试启动时被擦除、MSP-FET 使用批量擦除还是段擦除?

Guru**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1000801/msp430f5325-flash-memory-sections-being-erased-on-debugging-start-does-msp-fet-use-mass-or-segment-erase

器件型号:MSP430F5325

大家好、我在闪存中为项目上的持久性日志存储器设置了最后3个段。  由于我们的代码不需要 FLASH2区域、因此我可以使用小代码和数据模型设置调试/发布配置。  当我运行代码并重置程序("软重置")时、由我的应用程序初始化的闪存日志存储器会显示其写入正确。  但是、如果我重新启动调试器、并且程序被重新加载、闪存日志存储器看起来就像是全部擦除为0xFF。   我本来希望程序加载时只刷写.text 和.const 存储器段、但可能会对整个闪存执行整体擦除。  或其他事情正在发生。  我确实缩短了闪存的长度、因此它只会进入 0xF97F。   我不使用信息闪存区域、因为日志数据大于信息段。

FLASH2:origin = 0x10000、length = 0x43F8 //边界已更改以修正 CPU47 */
闪存:origin = 0x4400,length = 0xB580
Flash_log1 (RW):origin = 0xF980,length = 0x0200 //记录数据的3 512字节段*/
Flash_log2 (RW):origin = 0xFB80,length = 0x0200
FLASH_LOG3 (RW):origin = 0xFD80、length = 0x0200

#ifndef __large_data_model__
.const:{}> FLASH /*常量数据*/
first_day:{}> flash_log1 type=NOINIT/*用于测试结果的日志数据*/
first_year:{}> flash_log2 type=NOINIT
最后一年:{}> FLASH_LOG3 type=NOINIT
其他
.const:{}>> FLASH | FLASH2 /*常量数据*/
#endif

这里是一个代码示例、我在其中设置了闪存中的"变量"。  无论是否使用 const、我似乎都能获得相同的结果。   

#pragma SET_DATA_SECTION (".FIRST_DAY)
静态常量 uint16_t FIRST_DAY LOG_REVISION;
静态常量 test_log_struct first_Day log_flash;
#pragma SET_DATA_SECTION ()

这是映射文件、显示所有内容都已正确分配。

闪存00004400 0000b580 00006192 000053ee RWIX
FLASH_log1 0000f980 00000200 000000f3 0000010d RW
FLASH_log2 0000fb80 00000200 000000f3 0000010d RW
FLASH_LOG3 0000fd80 00000200 000000f3 0000010d RW

.first_day
0 0000f980 000000f3未初始化
0000f980 000000f3 TestLog.obj (.first_day)

.first_year
0 0000fb80 000000f3未初始化
0000fb80 000000f3 TestLog.obj (.first_year)

.LAST_year
0 0000fd80 000000f3未初始化
0000fd80 000000f3 TestLog.obj (.last_year)

Code Composer Studio、版本:10.3.0.00007

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

    我尝试将调试器设置中的擦除更改为"仅擦除和下载必要的段"、但随后出现验证错误。

    MSP430:文件加载器:验证失败:地址0x0468A 上的值不匹配请验证目标存储器和存储器映射。
    MSP430:GEL:文件:C:\users\jerry.morrow\git\jupiter_charger\msp430\Debug\jupiter Charger.out:发生数据验证错误、文件加载失败。

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

    我怀疑您需要移动日志段以与段边界对齐、例如将 LOG3移动到0xFC00。  

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

    这是我在数据表中看到的结果。  段不是从0x4400开始、而是从0x0200递增?

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

    是的、这是我的理解。 例如、区域 LOG3与包含中断矢量的段重叠。 我不确定在这种情况下、下载程序将执行什么操作。

    我不知道为什么验证不匹配在 0x0468A 上弹出、而不是在日志区域附近的某个位置、但我建议修复一些可能会导致下载程序出现一些问题的东西、因此我们知道我们要查看的内容。

    您也可以尝试下一个选项("替换为已写入")并查看其功能。 当我使用 IAR (具有类似的选项)时、我简单地理解了这两个选项之间的区别、但这是10多年前的情况。 总之、这是一个快速实验。

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

    “写的地方”选项有效!!!  非常感谢

    它就在我面前、只是看不到它。