今天对stm32f103的flash进行操作的时候,发现数据总是无法写到flash里面。 代码如下:
HAL_FLASH_Unlock(); //解锁
__HAL_FLASH_PREFETCH_BUFFER_DISABLE(); //擦除flash的时候禁止数据缓存
FLASH_PageErase(0x08010000); //擦除扇区
while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)==SET) {}; //等待擦除完成
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, 0x08010000, 0x11111111); //写flash
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
HAL_FLASH_Lock();
发现数据死活都写不进0x08010000这个地址,但0x08010000开始的2K扇区已经被擦除了。
于是我把擦除扇区的操作"FLASH_PageErase(0x08010000); "这一句去掉,因为之前的操作使得0x08010000这个地址的2K扇区已经被擦除,所以数据能被写进去。
然后把程序改为:
HAL_FLASH_Unlock(); //解锁
__HAL_FLASH_PREFETCH_BUFFER_DISABLE(); //擦除flash的时候禁止数据缓存
FLASH_PageErase(0x08010000); //擦除扇区
while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)==SET) {}; //等待擦除完成
FLASH->CR &= ~(FLASH_CR_PER); //必须清楚此位
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, 0x08010000, 0x11111111); //写flash
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
HAL_FLASH_Lock();
也就是加多了一句清楚FLASH->CR寄存器的FLASH_CR_PER位,然后就读写、擦除正常了。
具体原因还需要找个时间好好阅读一下datasheet才行。
一周热门 更多>