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.
在用MSP430F5438A芯片时,经常会碰到程序跑乱的情况,于是想查一下看flash有没有异常。
试验过程:用全新的芯片做实验,在烧写程序之前,先读一下芯片的flash,烧完程序后立即再读一遍,当程序运行异常后,再次读一遍flash,分别存在3个文件夹里。其中烧程序后立即读出时,不管是烧完后立即读,还是运行一会再读,读出来的内容都是一致的,只有出问题后,读出来的才不一致。程序里实际没有操作flash,既没有读,也没有写。
问题分析:对比烧写前读出的文件和烧完后立即读出的文件,发现头和尾都是一致的,只有程序存储区0x5c00至0x2e800区域不一致。说明烧写过程正常,没有擦写不该擦写的区域。对比故障后读出的文件,发现从0x1100开始就有很多不一致,0x1000至0x17ff应该是BSL flash区域,按理说是不能被改写的。用户程序区更是被大量的改写了,0x5c00至0x45bff区域有很多块被擦写成0xff。
请帮忙分析出现此现象的原因,谢谢!
您好,
1.flash工作时是否满足spec要求的供电电压和频率?您可以测试下在程序跑飞的时候系统的供电电压是否有尖峰或者扰动
2.可以开启SVS监控系统电压,看下是否还会出现程序跑飞flash更改的问题
3.在flash操作期间是否有异常的复位
TI有一篇关于debug flash 的application note 可以参考一下
https://www.ti.com/lit/an/slaa729a/slaa729a.pdf?ts=1634807496621
1、供电电压为3.3V,Vcore已设置为1.9V。程序跑飞时时间不确定,有时候一天就能飞,有时候跑一个星期都不出异常,很难监测到当时的电源情况。
2、已开启SVS高低压监控。
3、程序里实际没有操作过flash。
4、时钟是XT1上接32.768K晶振,PLL到18.022MHz。
void Init_CLK(void) { WDTCTL = WDTPW + WDTHOLD ; //Init_Power(); //5438A需要单独设置电源项 PMM_setVCore(PMMCOREV_3); //SVS Low side is turned off PMM_enableSvsL(); //Vcore低边 //Monitor low side is turned off PMM_enableSvmL(); //VCC低边 //Monitor high side is turned off PMM_enableSvmH(); //VCC高边 //SVS High side is turned off PMM_enableSvsH(); //Vcore高边 //Enable POR on SVS Event PMM_enableSvsHReset(); //低边复位 PMM_enableSvsLReset(); PMM_enableSvmLInterrupt(); //高边中断 PMM_enableSvmHInterrupt(); //例程设置时钟 //Port select XT1 GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_P7, GPIO_PIN0 + GPIO_PIN1 ); //Initialize XT1. Returns STATUS_SUCCESS if initializes successfully UCS_turnOnLFXT1WithTimeout( UCS_XT1_DRIVE_0, UCS_XCAP_3, 50000 ); //Select XT1 as ACLK source UCS_initClockSignal( UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1 ); //Set DCO FLL reference = ACLK UCS_initClockSignal( UCS_FLLREF, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1 ); //Set Ratio and Desired MCLK Frequency and initialize DCO UCS_initFLLSettle( 18022, FLL_FACTOR ); }
您好,
关于时钟设置这部分的代码在我看来没有什么问题。
通常来讲BSL段内存是不允许用户修改的,加载boot之后会将保护位打开以保护 BSL segment数据不被修改。您可以查一下SYSBSLPE是否被使能。
程序中没有修改过这个寄存器,也没有调过相应的库函数。除了这种情况,还有什么情况下可能会改写flash?
另外被改写过后flash看起来很有规律,基本上都是把一块256字节的区域擦除成0xff,从0x5c00地址开始,基本上都是隔一个256字节区域,擦一个256字节区域。
您方不方便留个邮箱?我可以把故障前后读出来的文件发给您,方便分析问题。