本帖最后由 lengrudie 于 2024-8-30 18:27 编辑
1、前言 在嵌入式设备中,Bootloader常用于设备的远程升级或简化升级步骤。一个简单的Bootloader程序可以进行引导操作,而升级过程通常涉及对约定好的应用程序的Flash进行擦写。常见的升级方式是通过TFTP等协议进行 。 Bootloader主要功能包括硬件初始化(如CPU、时钟、内存控制器等)和内存管理(建立内存空间映射图,识别可用的RAM区域及其大小)等 。
2、需要用到的bin文件 在产品开发过程中,可以使用Keil工具生成bin文件,并根据其大小约定应用程序在Flash的起始位置 。 在如下位置设置:
fromelf --bin ".\object\xx.axf" --output ".\xx.bin" 注意放代码的深度,根据深度调整。
3、Bootloader关键代码 定义好APP代码的存放地址,首先关闭全局中断再操作。 关键代码: void iap_load_app(uint32_t appxaddr) { INT_SYS_DisableIRQGlobal(); if(((*(volatile unsignedint*)appxaddr)&0x2FF00000)==0x20000000) //检查栈顶地址是否合法. { jump2app=(iapfun)*(volatileunsigned int*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址) __set_MSP(*(volatileunsigned int*)appxaddr);//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
} } 估计这个代码大家都比较熟悉,这里就不详细说明了。
4、APP代码设置FLASH地址和中断向量
大家都习惯了Keil软件的设置地址偏移方法如下: 首先想到的就是像上面这样设置。 而APP代码也会如下设置,目的是实现中断向量的偏移: 大家是不是就觉得可以从bootloader跳转到app程序了? 这也是跟其它常规MCU不一样的地方,上面的设置一定是行不通了,会发现一直跳转失败,总是怀疑这里那里错了,而正确的设置方法应该是如下地址设置。 找到如下位置,可以知道你的程序sct文件在哪里:
需修改.sct文件 如下,修改改flash启动地址和中断向量地址: 注意的是,设置的时候直接在原来的值上加上你的app程序地址就可以了。 如此,就可以生成bin文件,把bin文件和bootloader文件合并后烧录就OK了!
|