试了一下将主程序放在第一个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.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 {
} } |
使用Cubeprogrammer无法连接、连接G431和一块H750的板子可以连上但是连另外一块H750的板子和F407的板子就直接报错,这个应该如何解决。
最近使用STM32H563时用到了遇到程序编译时显示编译错误,原因是空间不够了,在不改变硬件的情况下有什么方法让空间变大吗
STM32H723 IAP跳转进入硬件故障
stm32h5裸机怎么配置lwip呢?
STM32H743一个扇区128K,扇区中间地址写数据,地址前后的数据内容不变,有什么好的方法?
STM32H747I-DISCO开发板无法连接芯片
关于STM32H563的STlink-V3无法识别的问题咨询
I3C 可仲裁头的IBI中断
STM32H7电压
STM32H533RE使用主从定时器产生指定脉冲个数,使用其他定时器进行ETR计数,计数不对?大佬们帮忙看看。