G32A1445的Bootloader跳转失败原因
本帖最后由 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了!
Bootloader可能试图跳转到一个错误的地址。 跳转失败大概率是因为中断向量地址出错 Bootloader或操作系统固件可能因存储介质损坏、传输错误或不当操作而损坏。 sesefadou 发表于 2024-9-3 16:05
Bootloader可能试图跳转到一个错误的地址。
是的,实际就是跳转后APP程序的地址没有设对地方 caigang13 发表于 2024-9-3 16:07
跳转失败大概率是因为中断向量地址出错
是的,刚好这个芯片设置APP地址偏移的方法跟其它MCU有点区别 minzisc 发表于 2024-9-3 16:34
Bootloader或操作系统固件可能因存储介质损坏、传输错误或不当操作而损坏。
厉害,大佬看问题比较深,能想到这么多可能的地方 检查是否有栈溢出或栈损坏的情况。 在跳转前,确保所有中断都被正确禁止,否则中断可能会干扰跳转过程。 电源供应稳定,电压波动可能导致跳转失败。 如果地址线或数据线连接松动、短路或接错,会使 Bootloader 无法正确访问应用程序的存储位置。 如果中断向量表没有正确配置,会导致跳转后的应用程序无法正常运行。 如果Bootloader和应用程序使用了相同的内存区域,可能会导致冲突。检查内存映射 入口地址错误 APP程序的入口点设置正确,并且与bootloader跳转的地址相匹配。如果入口点地址设置错误,bootloader将无法正确跳转到APP程序。 如果 Bootloader 在验证应用程序的完整性时发现校验和错误,可能会拒绝跳转。 地址超出了SRAM的最大可用空间 跳转的目标地址正确无误,目标地址应该是有效的代码入口地址。 Bootloader 和应用程序的版本不兼容,也可能导致跳转失败。 Bootloader在跳转到应用程序前未正确切换到内部时钟,也可能导致跳转失败