有关于stm32 cotex m0 系列的iap升级

该文章转载,但是有的地方需要验证,标红色的是我认为不错的。

最近在搞stm32的在线升级,网上资料也是挺多的。看了好多文档之后总算是理解了。现在自己再整理一遍。

个人觉得,如果要做IAP的话,首先得知道一些基础。

1、cotex m系列都是支持程序在flash里面运行的,里面由几个特别寄存器用来存sp(栈指针)和cp(程序跳转指针)。(程序跳转的时候需要用到)

2、cotex m 系统当发生硬件中断的时候,cp指针会被强制切换到(0x800 0004)flash里面的复位地址中,然后根据中断号进行指针偏移,这些中断入口的在启动文件(startup_stm32f070xb.s)。如果把寄存器设置设置成     SYSCFG->CFGR1 |= 0X03;(参考手册上有描述) 这样就意味这,硬件中断发送后pc指针被强制切换到0x200 0004(也就是sram里面)。cotex m4 有一个寄存可以设置中断发送后,pc指针直接强制切换到自定义的地址,但是M0是没有的。所以M0需要把程序的中断映射到sram里面,这样才能实现中断功能。keil 可以设置把生成的代码放到哪里,还有sram从哪里开始使用等。

3、keil生成的.hex文件其实是一个标准的下载文件,但并不是保存在flash里面运行的代码。保留在flash里面的运行代码是.bin文件。也就是说如果使用STM32 ST-LINK Utility,把flash里面的东西读出来和.hex文件是不一样的。因此在线升级(IAP)需要的是.bin文件。keil里面可以调用官方提供的cmd命令fromelf.exe 直接把.hex文件生成.bin文件。(如果把bin文件,直接拷到片内的flash 的0x800 0000 是可以直接运行的)

以下是有关操作:

第一:设置sp的和cp指针

__asm void MSR_MSP(u32 addr) 
{
    MSR MSP, r0             //set Main Stack value
    BX r14  //r14是lr寄存器,这个在c语言中程序跳转回使用lr留存跳之前的地址。其实也即是返回。
}

    if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)   //检查栈地址是否合法
        jump2app=(iapfun)*(vu32*)(appxaddr+4);            
        MSR_MSP(*(vu32*)appxaddr);                //设置栈地址
        jump2app();                               //跳转效果等同汇编直接使用b xxxx 或者是ldr r15,#xxxx
    }
    else return ACK_FALSE;

第二:设置Keil的flash和sram的开始地址

第三:使用fromelf.exe生成对于的.bin文件

 

 

最后生成的.bin文件想个办法写道内部的0x8005000里面即可。这里有一个简单的验证方法。

先烧录bootloader程序,然后把app程序再烧录进去。在bootloader程序可以实现一个功能:把app的代码搬到片内的另外一个内存里面,然后再在烧录app程序的flash烧录其他的程序。重启的时候bootloader 把之前备份的代码重新搬移到app(0x8005000)里面如果能正常运行,这说明成功。

另外一种实现方法:用qt编写一个上位机串口工具,在bootloader里面初始化 串口,通过一定的协议把.bin文件烧录到片内的flash里面也可以。

需要注意的事情:

1、直接修改sp和cp指针跳转时,bootloader设置的外设寄存器是不会改动,直接就跳到app应用上了,所以这里能会导致app运行失败。所以建议使用bootloader执行系统复位,然后在不初始化任何外设的情况直接调转。这里可使用固定一个sram来存标志位,并设置该位置重启后不改动。设置语法如下

__attribute__((zero_init)) u32 ResetJampMask[2] __attribute__((section(".ARM.__at_0x20000100"))); 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值