2018年11月13日星期二

STM32 IAP调用__set_MSP函数设置APP栈指针失败

前些天领导要求我把一块STM32板卡的程序改成可以在线升级的,因为这种板卡需要安装在地铁隧道内,以后一旦需要升级软件,如果不支持在线升级的话,操作起来可能非常不方便。
我以前虽然没做过这类开发,但网上找了些文章,很容易就弄明白了原理,本文也不是要讲这个。但动手改起代码来,发现BOOT跳转到APP之前,通过__set_MSP()函数设置栈指针的时候,一直失败,表现在程序跑飞或者进入HardFault_Handler()中断处理函数。
苦苦分析了一下午也没有找到原因,网上也搜不到相关的处理方法。不过后来还是找到了解决的方法,特写出来放在网上。
原来,我之前在网上看了一篇文章,说Keil自带的ARM编译器5版本没有6版本编译速度快,而且5版本已经停止维护了,于是我把Keil的编译器改成了6版本。但是6版本不支持__asm关键字,于是我用了__ASM volatile写法的__set_MSP()函数。这种写法虽然6版本的编译器能编译,但貌似出了问题,导致一直不成功。
后来,我把编译器换成5版本,用了如下写法的__set_MSP()函数,编译成功且功能正常
__asm void __set_MSP(uint32_t topOfMainStack)
{
    MSR MSP, r0
    BX r14
}
上述方法尽管可以解决问题,由于我对汇编语言不熟悉,深层次的原因其实我并没有找到。由于我并不想往这方面发展,因此也没有深入研究。

没有评论:

发表评论