硬汉嵌入式论坛

 找回密码
 立即注册
查看: 735|回复: 5
收起左侧

[BOOT/IAP] 在线升级进入hardfault_handler

[复制链接]

19

主题

28

回帖

85

积分

初级会员

积分
85
发表于 2025-1-16 16:49:28 | 显示全部楼层 |阅读模式
最近在写在线升级函数

代码:

                        if(applenth)
                        {
                                printf("开始更新固件...\r\n");       
                       if(((*( __IO uint32_t*)(0x24001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
                              {       
                                      iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码   
                                      printf("固件更新完成!\r\n");                                                       
                              }
                        else
                              {
                                      printf("非FLASH应用程序!\r\n");
                              }
                        }
            
                        else
                        {
                                printf("没有可以更新的固件!\r\n");

                        }       

                                printf("开始执行APP1用户代码!!\r\n");
                        if(((*( __IO uint32_t*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
                        {         
                                iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码         
                                                               
                        }
                        else
                        {
                                printf("非APP1用户应用程序,无法执行!\r\n");   
                        }               

当有if(((*( __IO uint32_t*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.和        if(((*( __IO uint32_t*)(0x24001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.两条语句,程序会进入hardfault_handler函数
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-16 16:58:01 | 显示全部楼层
那就别判断了,毫无意义的判断,你自己写APP,编译时候就知道是否满足了,无需再多余做这种判断。
回复

使用道具 举报

24

主题

365

回帖

437

积分

高级会员

积分
437
发表于 2025-1-16 17:02:44 | 显示全部楼层
(*( __IO uint32_t*)(FLASH_APP1_ADDR+4))  感觉应该以const 属性访问flash的数据
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2025-1-16 17:19:00 | 显示全部楼层
可以检查下编译器的优化等级,最近做的升级时遇到了,AC6 -O0,会导致跳转的地址数据丢失,直接跳转到0x00000000导致hardfault
回复

使用道具 举报

19

主题

28

回帖

85

积分

初级会员

积分
85
 楼主| 发表于 2025-1-16 17:44:35 | 显示全部楼层
eric2013 发表于 2025-1-16 16:58
那就别判断了,毫无意义的判断,你自己写APP,编译时候就知道是否满足了,无需再多余做这种判断。

大佬目前调试,去掉这一行iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码程序可以正常跑起来,我想这是不是applenth没有满足H7系列芯片32字节对齐的原因,但是我写的函数做了对齐:void iap_write_appbin(uint32_t appxaddr,uint8_t *appbuf,uint32_t appsize)
{
        uint32_t t;
        uint16_t i=0;
        uint32_t temp;
        uint32_t fwaddr=appxaddr;//当前写入的地址
        uint8_t *dfu=appbuf;
        for(t=0;t<appsize;t+=4)
        {                                                  
                temp=(uint32_t)dfu[3]<<24;   
                temp|=(uint32_t)dfu[2]<<16;   
                temp|=(uint32_t)dfu[1]<<8;
                temp|=(uint32_t)dfu[0];          
                dfu+=4;//偏移4个字节
                iapbuf[i++]=temp;            
                if(i==512)
                {
                        i=0;
                        STMFLASH_Write(fwaddr,iapbuf,512);
                        fwaddr+=2048;//偏移2048  512*4=2048
                }
        }
          if(i)
                STMFLASH_Write(fwaddr,iapbuf,i);//将最后的一些内容字节写进去.  
}
void STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)       
{
    FLASH_EraseInitTypeDef FlashEraseInit;
    HAL_StatusTypeDef FlashStatus=HAL_OK;
    uint32_t SectorError=0;
        uint32_t addrx=0;
        uint32_t endaddr=0;       
    if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;        //非法地址
   
        HAL_FLASH_Unlock();             //解锁       
        addrx=WriteAddr;                                //写入的起始地址
        endaddr=WriteAddr+NumToWrite*4;        //写入的结束地址
   
    if(addrx<0X1FF00000)
    {
        while(addrx<endaddr)                //扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
                {
                        if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区
                        {   
                                FlashEraseInit.Banks=FLASH_BANK_1;                                                //操作BANK1
                FlashEraseInit.TypeErase=FLASH_TYPEERASE_SECTORS;       //擦除类型,扇区擦除
                FlashEraseInit.Sector=STMFLASH_GetFlashSector(addrx);   //要擦除的扇区
                FlashEraseInit.NbSectors=1;                             //一次只擦除一个扇区
                FlashEraseInit.VoltageRange=FLASH_VOLTAGE_RANGE_3;      //电压范围,VCC=2.7~3.6V之间!!
                if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK)
                {
                    break;//发生错误了       
                }
                SCB_CleanInvalidateDCache();                            //清除无效的D-Cache
                        }else addrx+=4;
            FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1);    //等待上次操作完成
        }
    }
    FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1);       //等待上次操作完成
        if(FlashStatus==HAL_OK)
        {
                while(WriteAddr<endaddr)//写数据
                {
            if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD,WriteAddr,(uint64_t)pBuffer)!=HAL_OK)//写入数据
                        {
                                break;        //写入异常
                        }
                        WriteAddr+=32;
                        pBuffer+=8;
                }
        }
        HAL_FLASH_Lock();           //上锁
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-17 06:23:49 | 显示全部楼层
Luo990619 发表于 2025-1-16 17:44
大佬目前调试,去掉这一行iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码程 ...

32字节对齐是指定的烧写首地址32字节对齐,不是固件大是32对齐。这个是我的,供参考

BSP视频教程第18期:基于NAND,eMMC,SD卡和U盘的BootLoader实战,带CRC完整性校验(2022-06-16)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=113053
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 02:07 , Processed in 0.042188 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表