OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2868|回复: 0

stm32f103rct6 FLASH操作

[复制链接]

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2017-8-25
在线时间
23 小时
发表于 2017-9-11 16:51:59 | 显示全部楼层 |阅读模式
      今天对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才行。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 04:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表