你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

尝试STM32H743 FLASH SWAP 实现IAP升级,出错了

[复制链接]
曹成良 提问时间:2024-11-19 10:07 / 未解决

试了一下将主程序放在第一个flash中,采用U盘将程序(bin文件添加了crc,用U盘读出来的时候,进行了校验)读取进外部SRAM(0x60000000)中,再将程序写入FLASH2中,再进行FLASH SWAP,然后看门狗重启,结果升级后,程序无法启动,同时也无法进行仿真了,flash下载不了,到擦除的时候就出错了(timeout),跪求大佬能给分析一下:)! flash的过程如下: //获取程序内存缓存地址

Uint32 GetProgramCacheAddr(void)

{

return((Uint32)SampleCur); //返回数据存储的首地址0x60000000 }

HAL_StatusTypeDef Flash_Swap(void)

{

FLASH_OBProgramInitTypeDef OBInit;

HAL_StatusTypeDef status;

// 解锁 Flash

HAL_FLASH_Unlock();

HAL_FLASH_OB_Unlock();

// 获取当前活动 Bank

uint32_t current_bank = (FLASH->OPTSR_CUR & FLASH_OPTSR_SWAP_BANK_OPT) >> FLASH_OPTSR_SWAP_BANK_OPT_Pos;

// 配置选项字节

OBInit.OptionType = OPTIONBYTE_USER;

OBInit.USERType = OB_USER_SWAP_BANK;

OBInit.USERConfig = (current_bank == 1) ? OB_SWAP_BANK_DISABLE : OB_SWAP_BANK_ENABLE;

// 编程选项字节

status = HAL_FLASHEx_OBProgram(&OBInit);

if(status == HAL_OK) {

// 启动选项字节加载

status = HAL_FLASH_OB_Launch();

}

// 锁定 Flash

HAL_FLASH_OB_Lock();

HAL_FLASH_Lock();

return status; }

Uint8 UpdateProgram(void)

{

uint32_t inactive_bank;

HAL_StatusTypeDef status;

Uint32 size;

Uint32 *pldata;

// 确定非活动 Bank

inactive_bank = (FLASH->OPTSR_CUR & FLASH_OPTSR_SWAP_BANK_OPT) ? FLASH_BANK1_BASE : FLASH_BANK2_BASE;

// 擦除非活动 Bank

FLASH_EraseInitTypeDef EraseInit;

EraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;

EraseInit.Banks = (inactive_bank == FLASH_BANK1_BASE) ? FLASH_BANK_1 : FLASH_BANK_2;

EraseInit.Sector = 0; // 从0扇区开始

EraseInit.NbSectors = 3; // 擦除整个 Bank

uint32_t SectorError;

status = HAL_FLASHEx_Erase(&EraseInit, &SectorError);

if(status != HAL_OK)

{

    SysData.Sys_RunFlag.bit.Needupgradef = 0;

    return status;

}

size = USBData.ReadFileLenth+32;

pldata = (Uint32*)GetProgramCacheAddr();

 HAL_FLASH_Unlock();

// 写入新固件

for(uint32_t i = 0; i < size; i += 32) {

status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, 

                         inactive_bank + i,(Uint32)&pldata[i]);

if(status != HAL_OK)

        {               

            RS485_char_to_reg(20,ProgUpDate_Text3,"升级失败,正在重启"); //程序更新提示

            SysData.Sys_RunFlag.bit.Needupgradef = 0;

            return status;              

        }

        IWDG_Feed();

}

HAL_FLASH_Lock(); // 执行 Bank 交换

if(Flash_Swap()==HAL_OK)

{

while(1);               //等待看门狗重启   

}

else

{

SysData.Sys_RunFlag.bit.Needupgradef = 0;

__enable_irq();

return HAL_ERROR;

} }

收藏 评论0 发布时间:2024-11-19 10:07

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版