|
在跑ucosii的时候进行OTA升级擦除失败,关掉系统调度可以擦除成功。单独建立一个裸机工程,跑page擦除程序,Jlink单步调试概率性出现擦除失败,上电一直跑可以擦除成功。这是芯片的限制么,还是flash在擦除的时候有需要注意的点没有注意到。 单步调试有时一进入HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError),就会引起SR寄存器报下面的错误: PGSERR:编程顺序错误 SIZERR:尺寸错误 PGAERR:编程对齐错误 感觉这些不是导致错误出现的主因,而是别的错误发生了从而置位了SR寄存器。下面贴一下我的初始化代码 while(status != HAL_OK) { status = HAL_FLASH_Unlock(); } /* Clear OPTVERR bit set on virgin samples */ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR); while(addr + offset < addr + len) { bank = GetBank(addr + offset); EraseInitStruct.Banks = bank; EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EraseInitStruct.Page = GetPage(addr + offset); //EraseInitStruct.Page = (addr + offset)/FLASH_PAGE_SIZE; EraseInitStruct.NbPages = 1; offset += FLASH_PAGE_SIZE; status = HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError); if (status != HAL_OK) { printf("flash erase fail, addr:0x%x, len:0x%x, errpage:%d, errcode:%d, ret:%d\r\n", \ addr, len, PAGEError, pFlash.ErrorCode, status); ret = -1; goto lock; } } 这段代码就是单步调试会返回错误的程序了,返回的错误就是上述的PGSERR,SIZERR,PGAERR。个人仔细检查了初始化参数,应该是没有问题的。而且工程中并没有看门狗操作,一开始觉得有可能是在flash未解锁情况下操作了flash,后续测试也是排除了这个可能。希望有经验的大哥可以解答一下小弟的困惑。 |
STM32G474RBT6芯片,hal库默认设置为双bank模式,怎样修改为单bnak模式?使用STM32CubeMX工具生成工程时,只能选双bank模式,不能选单bank模式!
STM32G474RBT6使用Keil工程通过仿真器下载程序时,程序量超过64K时,就会下载失败,求教。
STM32G474 HRTIM 推挽模式下 关闭死区 在比较寄存器较小的情况下,存在输出脉宽直接到100%
最近在做单极倍频SPWM
stm32G474RBT3的flash擦除寿命是多少?
stm32g431rbt怎么显示汉字
F103和G474的180°移相區別
STM32G431内部运放1和2输出连接的ADC为什么不是OPAMP?
STM32G431K COMP 比较器下降沿中断
STSPIN32G4内部驱动电压输出问题
微信公众号
手机版
好的,感谢解答,关于这个问题现在重定位向量表和程序到sram空间,如果不能复现那大概率就是这个问题了