用isp的执行功能从0x8000000执行程序后,提示Ok。 但是为什么没有程序执行的反应呢,郁闷。
答案是: stm32f的BootLoader程序没有根据你的vector_table初始化MSP,而是用0x20000000~0x20000200的512字节大的堆栈,如果你使用了大堆栈,或使用的变量位于0x20000000~0x20000200区间,则整个乱套
解决方法:
1、用嵌入汇编在__low_level_init中初始化MSP。
#pragma language=extended __interwork int __low_level_init(void); #pragma location="ICODE" __interwork int __low_level_init(void) { asm("MOVW R1,#0x0000");//根据vector_table不同,需修改此处地址 asm("MOVT R1,#0x0800"); asm("LDR R0,[R1,#0]"); asm("MSR MSP,R0"); asm("MSR PSP,R0"); return 1; }
2、对于IAR EWARM 442,修改启动文件,在cmain_ctx.s79加入如下代码: ldr r1,=__vector_table ldr r0,[r1,#0] msr msp,r0 并将cmain_ctx.s79加入工程 修改好的cmain_ctx.s79见附件。 此法比较好。 在IAR EWARM 520,还未找到相应方法。 http://www.mcuisp.com/ispiap_note_stm32GoStackIssue.htm
相关链接:https://bbs.21ic.com/upfiles/img/200710/20071013112735121.rar |