完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
试了一下将主程序放在第一个flash中,采用U盘将程序(bin文件添加了crc,用U盘读出来的时候,进行了校验)读取进外部SRAM(0x60000000)中,再将程序写入FLASH2中,再进行FLASH SWAP,然后看门狗重启,结果升级后,程序无法启动,同时也无法进行仿真了,flash下载不了,到擦除的时候就出错了(timeout),跪求大佬能给分析一下
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个回答
|
|
|
在使用STM32H743进行IAP(In-Application Programming)升级时,出现程序无法启动、无法仿真、Flash擦除超时等问题,可能是由于以下几个原因导致的。以下是一些可能的原因和解决方案: 1. Flash Swap操作问题
2. Flash擦除超时
3. 程序写入问题
4. 启动配置问题
5. 仿真器连接问题
6. 看门狗复位问题
7. 调试和日志
8. 硬件问题
总结在STM32H743上进行IAP升级时,Flash Swap操作、Flash擦除和写入、启动配置等步骤都需要特别注意。通过仔细检查每一步操作,确保数据的正确性和系统的稳定性,可以有效避免升级失败的问题。如果问题仍然存在,建议通过调试器和日志进一步分析问题的根源。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
stm32mp157的异核通信的rpmsg_sdb的m4固件和a7驱动该如何编写?
1453 浏览 0 评论
stm32f103用freertos对一个采样率为1kHz的传感器,进行采样,数据出差
1502 浏览 0 评论
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
3649 浏览 1 评论
3842 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
2461 浏览 1 评论
STM32H7打开DCache后,出现了串口接收信息为空的现象,是哪里出了问题?
727浏览 5评论
用NANO STM32F103RBT6的开发板烧录不了是哪里出了问题?
663浏览 5评论
710浏览 5评论
外部中断触发类型为双边沿触发,进入中断回调后有什么办法判断该边沿是上升沿还是下降沿?
941浏览 5评论
STM32L071CBT6低温环境下无法正常工作是什么原因引起的?
745浏览 5评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 08:18 , Processed in 0.545063 second(s), Total 43, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2140