msp430复位方式有多种,这些复位方式的结果不一样。
平台430f5659,我在其上做一个boot程序与应用程序跳转的实验,boot程序使用430的物理中断,应用程序另开辟中断向量表,应用程序的起始点为0x8000,即flash的起始点。
在应用程序中使用asm("mov &0xFFFE, PC");汇编指令产生系统复位从而跳转到boot程序,在boot中擦除flash然后用串口重新下载应用程序。
这时问题来了,从应用程序跳转到boot后,擦除flash时只能擦一个segment,后面程序就跑飞了。
如果我在应用程序中采用掉电复位的方式,则进入boot后擦除flash就没有这个问题。
我怀疑两种复位方式的不同导致结果的差别,具体原因我想不明白。
请大家看看这个怎么解决?
kqian0327:
你好,
我看你描述有点模糊,你的boot程序和应用程序都是在main flash
应用程序起始地址是0x8000?
那boot程序起始地址是?
你所谓的boot程序是自己的boot程序还是5XX的BSL程序?
你描述的两个不同跳转方式我还是没看明白,可不可以用个框图说明问题?
John C Smith:
回复 kqian0327:
boot程序与app(应用程序)都在main flash,boot是自己写的,不是bsl。
将flash地址的0xe000到0xffff这一段给boot用,其余的给app用。
boot程序实际是系统的主程序,系统复位后会先进入boot,再从boot跳转到app,可以认为app是boot的一个子程序。
问题出在擦除flash那一步,不同的复位方式导致擦除的不同结果。
kqian0327:
回复 John C Smith:
你好,
我怀疑是不是在不同boot方式下,reset复位向量已经被修改的原因造成。
不知道你这边方便把你的工程文件发给我在实验室调试一下吗?
John C Smith:
回复 kqian0327:
其实这个问题的核心就是软件复位与掉电复位的区别,我没有找到区别。或许我关注的点是错的?
怪异的地方是软件复位后(比如软件bor),擦除flash时擦完第一个segment就会停止,这个问题目前还没有解决。
kqian0327:
回复 John C Smith:
你好,
其实我也很奇怪为什么擦写完一个segment就会停止。
看起来怪怪的。
shui liu1:
回复 kqian0327:
我也遇到一个类似问题,就是先把整个Flash擦除,第一次通过串口升级可以写入成功,但是写完Flash后跳转到应用程序那条语句asm(" mov &0xF9FE, PC;");就没有跳转,其中0xF9FE是应用程序的复位地址,不知道什么原因,单片机用的MSPF5340,BOOT程序如附件所示,请大侠们分析下原因,不胜感激。
John C Smith:
回复 shui liu1:
可否一并上传你的xcl文件
shui liu1:
回复 John C Smith:
升级程序和应用程序的xcl文件均已上传,麻烦您帮忙看看问题何在,谢谢。
John C Smith:
回复 shui liu1:
1 应用程序复位向量地址是
-Z(CODE)INTVEC=F980-F9FF-Z(CODE)RESET=F9FE-F9FF
看你原来是这样设置的,没有问题。
2 你下载速率太高了,改成2400bps试试,应该没啥问题。
Lichen Wang:
John C Smith
msp430复位方式有多种,这些复位方式的结果不一样。…
在应用程序中使用asm("mov &0xFFFE, PC");汇编指令产生系统复位从而跳转到boot程序,…
從軟件迫使復位,使用 asm("mov &0xFFFE, PC") 不是一個很好的辦法。
我建議你設置在 PMMCTL0 寄存器中的 PMMSWBOR 或 PMMSWPOR。
TI中文支持网




