c++ - 为什么stm32上的FLASH页没有被清除?
问题描述
我正在对 stm32(l412kb) 进行编程,其中一个函数会清除 FLASH 的一个区域,以供以后覆盖。被清除的闪存区域位于存储的后半部分 - 第 35 页 - 共 6 页。stm32l412kb 有 64 页 2KB 的 flash。
我一直在关注参考手册,第 83 页。
flash 的清除工作了一次,但经过几次尝试后,再也没有,这导致代码更改,所以我现在不确定代码是否正确!当代码工作时,stm IDE 显示内存已重置为 0,但是当代码“失败”时,显示的值是默认的 0xFFFFFFFF,尽管代码运行良好。
代码是:
int clearFlash(uint8_t numberOfPages, uint8_t firstPageNumber){
HAL_FLASH_Unlock();
FLASH->SR &= ~(FLASH_FLAG_PGSERR | FLASH_FLAG_PGAERR |
FLASH_FLAG_WRPERR |FLASH_FLAG_OPERR | FLASH_FLAG_EOP); //Clearing Error Flags
//Looping through clearing enough space. Flash is cleared in 2KB pages.
for (int i = 0; i<numberOfPages; i++){
while(FLASH->SR & FLASH_SR_BSY); //Hold While Busy
while((FLASH->SR & FLASH_SR_PGSERR)); //PGSERR should not be set
FLASH->CR |= FLASH_CR_PER; //Set erase process
FLASH->CR &= ~FLASH_CR_PNB_Msk; //Clear address mask
FLASH->CR |= ((firstPageNumber+i)<<FLASH_CR_PNB_Pos); //place in address
FLASH->CR |= FLASH_CR_STRT; //Start clear
}
HAL_FLASH_Lock();
return 1;
}
变量 firstPageNumber 被传递值 35,numberOfPages 是从文件大小(6 页)中计算出来的。如果对我的错误有任何想法,非常感谢您的贡献。
非常感谢,哈利
解决方案
对于 STM32,擦除/清除状态全为“1”。所以 0xFFFF FFFF 值是擦除内存后要观察的正确值。在您提供的参考手册中,请参阅第 85 页顶部的说明
擦除值 0xFFFF FFFF
推荐阅读
- flutter - 如何从处于状态(flutter_bloc)的对象中获取值
- java - 如何在 WAR 存档中包含应用程序配置文件?
- laravel - 具有 3 组值的 Laravel Yajra Datatables 排序列
- kotlin - 无法在 Kotlin 中将给定对象格式化为数字
- c++ - 如果我已经检查了 typeid,为什么不使用 static_cast 而不是 dynamic_cast?
- sql - Snowflake 查询优化器是否尊重 CTE?
- class - “任意”的实例如何查找树?
- c++ - 支持行和列查找的 C++ 容器
- c# - Core Web Api - 错误:动作从请求正文绑定了多个参数
- mysql - mysql:重试事务指定次数