lengrudie 发表于 2024-8-30 18:28

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了!

sesefadou 发表于 2024-9-3 16:05

Bootloader可能试图跳转到一个错误的地址。

caigang13 发表于 2024-9-3 16:07

跳转失败大概率是因为中断向量地址出错

minzisc 发表于 2024-9-3 16:34

Bootloader或操作系统固件可能因存储介质损坏、传输错误或不当操作而损坏。

lengrudie 发表于 2024-9-3 17:09

sesefadou 发表于 2024-9-3 16:05
Bootloader可能试图跳转到一个错误的地址。

是的,实际就是跳转后APP程序的地址没有设对地方

lengrudie 发表于 2024-9-3 17:10

caigang13 发表于 2024-9-3 16:07
跳转失败大概率是因为中断向量地址出错

是的,刚好这个芯片设置APP地址偏移的方法跟其它MCU有点区别

lengrudie 发表于 2024-9-3 17:13

minzisc 发表于 2024-9-3 16:34
Bootloader或操作系统固件可能因存储介质损坏、传输错误或不当操作而损坏。

厉害,大佬看问题比较深,能想到这么多可能的地方

mattlincoln 发表于 2024-9-3 17:16

检查是否有栈溢出或栈损坏的情况。

biechedan 发表于 2024-9-3 18:14

在跳转前,确保所有中断都被正确禁止,否则中断可能会干扰跳转过程。

mollylawrence 发表于 2024-9-3 19:33

电源供应稳定,电压波动可能导致跳转失败。

claretttt 发表于 2024-9-3 21:06

如果地址线或数据线连接松动、短路或接错,会使 Bootloader 无法正确访问应用程序的存储位置。

maqianqu 发表于 2024-9-3 22:39

如果中断向量表没有正确配置,会导致跳转后的应用程序无法正常运行。

51xlf 发表于 2024-9-5 08:42

如果Bootloader和应用程序使用了相同的内存区域,可能会导致冲突。检查内存映射

cashrwood 发表于 2024-9-5 10:16

入口地址错误            

janewood 发表于 2024-9-5 11:51

APP程序的入口点设置正确,并且与bootloader跳转的地址相匹配。如果入口点地址设置错误,bootloader将无法正确跳转到APP程序。

modesty3jonah 发表于 2024-9-5 13:27

如果 Bootloader 在验证应用程序的完整性时发现校验和错误,可能会拒绝跳转。

loutin 发表于 2024-9-5 15:00

地址超出了SRAM的最大可用空间

houjiakai 发表于 2024-9-5 16:51

跳转的目标地址正确无误,目标地址应该是有效的代码入口地址。

abotomson 发表于 2024-9-6 15:01

Bootloader 和应用程序的版本不兼容,也可能导致跳转失败。

jonas222 发表于 2024-9-6 16:36

Bootloader在跳转到应用程序前未正确切换到内部时钟,也可能导致跳转失败
页: [1] 2 3 4
查看完整版本: G32A1445的Bootloader跳转失败原因