ST意法半导体
直播中

卓侨汉

9年用户 1156经验值
擅长:MEMS/传感技术
私信 关注
[问答]

STM32H743 FLASH SWAP实现IAP升级出错了怎么解决?

试了一下将主程序放在第一个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);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;}}

回帖(1)

他在笑

2025-3-13 17:56:26

在使用STM32H743进行IAP(In-Application Programming)升级时,出现程序无法启动、无法仿真、Flash擦除超时等问题,可能是由于以下几个原因导致的。以下是一些可能的原因和解决方案:


1. Flash Swap操作问题



  • 问题分析:STM32H743支持双Bank Flash,通过FLASH_Swap函数可以切换Bank1和Bank2。如果Swap操作失败,可能导致程序无法启动。

  • 解决方案

    • 确保在Swap之前,Bank2中的程序已经正确写入。

    • 在Swap之后,确保系统能够正确地从新的Bank启动。可以通过调试器检查FLASH_OPTCR寄存器的SWAP_BANK位,确认Swap是否成功。

    • 确保在Swap操作之后,正确设置了向量表偏移寄存器(SCB->VTOR),以便系统能够正确找到新的中断向量表。



2. Flash擦除超时



  • 问题分析:Flash擦除超时可能是由于Flash操作过程中出现了错误,或者Flash被锁定。

  • 解决方案

    • 在擦除Flash之前,确保Flash没有被锁定。可以通过HAL_FLASH_Unlock()函数解锁Flash。

    • 确保在擦除Flash时,没有其他中断或任务干扰Flash操作。可以在擦除期间禁用全局中断。

    • 检查Flash擦除函数的参数是否正确,特别是擦除的起始地址和大小。



3. 程序写入问题



  • 问题分析:如果程序写入Flash时出现错误,可能导致程序无法启动。

  • 解决方案

    • 确保在写入Flash之前,Flash已经被正确擦除。

    • 确保写入的程序数据是正确的,并且在写入过程中没有发生数据损坏。可以通过CRC校验或其他方式验证写入的数据。

    • 确保写入的地址和大小没有超出Flash的范围。



4. 启动配置问题



  • 问题分析:如果启动配置不正确,系统可能无法从正确的Bank启动。

  • 解决方案

    • 检查BOOT0BOOT1引脚的配置,确保系统能够从正确的Flash Bank启动。

    • 确保在Swap之后,系统能够正确地从新的Bank启动。可以通过调试器检查FLASH_OPTCR寄存器的SWAP_BANK位,确认Swap是否成功。



5. 仿真器连接问题



  • 问题分析:如果仿真器无法连接,可能是由于Flash被锁定或系统处于错误状态。

  • 解决方案

    • 尝试通过硬件复位或Power-On Reset(POR)重新启动系统。

    • 如果仿真器仍然无法连接,可能需要通过串口或其他方式重新烧录Bootloader或恢复默认设置。



6. 看门狗复位问题



  • 问题分析:如果看门狗在升级过程中复位,可能导致系统无法正常启动。

  • 解决方案

    • 在升级过程中,禁用看门狗或确保看门狗不会在升级过程中复位系统。

    • 确保在升级完成后,重新启用看门狗。



7. 调试和日志



  • 问题分析:如果没有足够的调试信息,可能难以定位问题。

  • 解决方案

    • 在关键步骤中添加调试信息,例如通过串口输出日志,记录Flash操作的状态和结果。

    • 使用调试器逐步执行代码,检查每一步操作是否正确。



8. 硬件问题



  • 问题分析:硬件问题,如电源不稳定或Flash芯片损坏,也可能导致升级失败。

  • 解决方案

    • 检查电源是否稳定,确保系统在升级过程中有足够的电源供应。

    • 如果怀疑Flash芯片损坏,可以尝试更换芯片或使用其他存储介质进行测试。



总结


在STM32H743上进行IAP升级时,Flash Swap操作、Flash擦除和写入、启动配置等步骤都需要特别注意。通过仔细检查每一步操作,确保数据的正确性和系统的稳定性,可以有效避免升级失败的问题。如果问题仍然存在,建议通过调试器和日志进一步分析问题的根源。

举报

更多回帖

×
20
完善资料,
赚取积分