
试了一下将主程序放在第一个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.USERConfig = (current_bank == 1) ? OB_SWAP_BANK_DISABLE : OB_SWAP_BANK_ENABLE; // 编程选项字节 status = HAL_FLASHEx_OBProgram(&OBInit); if(status == HAL_OK) {
} // 锁定 Flash HAL_FLASH_OB_Lock(); HAL_FLASH_Lock(); return status; } Uint8 UpdateProgram(void) { uint32_t inactive_bank; HAL_StatusTypeDef status;
// 确定非活动 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)
// 写入新固件 for(uint32_t i = 0; i < size; i += 32) {
} HAL_FLASH_Lock(); // 执行 Bank 交换 if(Flash_Swap()==HAL_OK) {
} else {
} } |
关于STM32H563的STlink-V3无法识别的问题咨询
stn32h725vgh3芯片,配置使用外部时钟必须先下载内部时钟的代码,然后再下载外部时钟的代码才可以正常使用,断电后需要重新这个流程,直接下载HSE外部时钟,功能不能使用。
stm32h563 无法完全整片擦除
STM32H745IGT6 温湿度等级
STM32H745IGT6芯片丝印
STM32H7R7 CubeMX无配置问题
用电器识别项目中nanoedgeAI频域训练及相位影响
有提供 stm32h747 系列的 驱动 ek79007 mipi 的例程吗 ?
型号替代-STM32H5
正点原子阿波罗H743使用DMA2D后普通刷出现问题