此处以STM32F030F4P6为例,HAL库版本为Keil.STM32F0xx_DFP.2.1.1

1、解锁:程序下载后,默认Flash空间是保护的,所以要先进行解锁。我想大家都知道,解锁就是对FLASH_KEYR寄存器写两次数据,第一次是0x45670123,第二次是0xCDEF89AB,对应有现成的HAL库函数直接使用,HAL_FLASH_Unlock()。

2、擦除:关于Flash闪存的电气特性:flash编程原理只能将1写成0,不能将0写成1,等同于按位与的关系。比如经过擦除后的存储状态是0xFF(0b11111111),此时写一个数据0x03(0b00000011),也就是0xFF&0x03=0x03,则该空间存储状态即可变为0x03。如果不擦除,再给这个存储空间写0x04(0b00000100),则新的状态至为0x03&0x04=0x03,还是0x03。如果还不擦除,再给这个空间写0x01这个数据,则0x03&0x01=0x01,嗯,这个数是对的了。正是这个电气原理,所以在给Flash空间更新数据时,一定要先擦除再写,才能保证新的数据正确生效。(PS:有一种存储器叫EEPROM是可以将位1覆盖成0,将0覆盖成1,这种存储器写的时候就可以直接覆盖写,不用先擦除)。话太多,网上很多代码用HAL_PageErase()函数,但是STM32F030对应的方法HAL_FLASHEx_Erase:

FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = ADDR_PG15;//这个page地址,实际是目标page所在空间首地址吧,这个ADDR_PG15是我自己定义的宏,对应0x08003F00
EraseInitStruct.NbPages = 1;
    
uint32_t PageError=0;//此处应该是错误跳转函数(地址)的,我直接略
uint32_t temp=0;
while(HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
  {

//while里做什么,你自己定义,我这里怕出错,超时退出
        temp++;
        if(temp>1000000UL)
        {
            break;
        }  
  }

再啰嗦,为什么是擦除页?这也是flash电气原理决定的,falsh擦除是耗时的,几百us至数ms级别,如果你想一个字一个字的改写,那耗时就大了,所以直接设计了一个最小擦除空间,一般以页为单位;还有块空间,或者整个芯片,这样这个程序烧写更新时,擦除也就非常快了。

3、写:注意主Flash只能是16位的写。你可在用户手册中搜索“The main Flash memory can be programmed 16 bits at a time”。如果是8位或者32位都会报错。虽然和FLASH_TYPEPROGRAM相关的宏定义有WORD和DOUBLEWORD,但WORD和DOUBLEWORD并不是给STM32F030F4P6用的,或者说不是给用户使用的。

#define FLASH_TYPEPROGRAM_HALFWORD   (0x01U)  /*!<Program a half-word (16-bit) at a specified address.*/
#define FLASH_TYPEPROGRAM_WORD       (0x02U)  /*!<Program a word (32-bit) at a specified address.*/
#define FLASH_TYPEPROGRAM_DOUBLEWORD (0x03U)  /*!<Program a double word (64-bit) at a specified address*/

所以只能是FLASH_TYPEPROGRAM_HALFWORD:

uint32_t target_addr=0x08003F00;

uint16_t target_data=0x3344;

HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,target_addr,target_date);

4、读,读就是指针读数喽,可以直接读32位的

uint32_t target_addr=0x08003FAA;

uint32_t target_data=0;

target_data=(*(uint32_t *)(target_addr));

STM32F030系列 HAL库FLASH读写(当EEPROM用)相关推荐

  1. stm32 HAL库 Flash操作简介

    stm32 HAL库 Flash操作简介 目录 第一stm32,flash介绍 查看代码段,以判断代码长度 flash的基本操作规则 stm32 HAL库 Flash操作指南 stm32f1xx_ha ...

  2. STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)

    STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...

  3. STM32F1系列HAL库配置系统时钟

    STM32F1系列HAL库配置系统时钟 其实一开始对于时钟我也是知之甚少,在MSP432中我就一直忽视时钟配置,其实也是在STM32学习时落下的病根,现在趁有空补一下. 时钟简单讲解 对于时钟系统,在 ...

  4. STM32系列(HAL库)——F103C8T6通过MFRC522、RFID射频卡、门禁卡模块读取卡片ID(二)

    本文继上一篇:STM32系列(HAL库)--F103C8T6通过MFRC522.RFID射频卡.门禁卡模块读取卡片ID 本文介绍在运用RC522模块时,运用链表结构存储数据的操作 Let's go! ...

  5. STM32F4系列HAL库配置定时器实验——输入捕获

    STM32F4系列HAL库配置定时器实验--输入捕获 输入捕获简单讲解 输入捕获模式可以用来测量脉冲宽度或者测量频率.我们以测量周期和频率为例,用一个简图来说明输入捕获的原理 假定定时器工作在向上计数 ...

  6. STM32系列(HAL库)——F103C8T6通过NRF24L01(2.4G)无线模块进行双机通信

    本文参考:STM32L051C8T6 HAL库 + nRF24L01 收发案例(硬件SPI通讯) 1.软件准备 (1)编程平台:Keil5 (2)CubeMX (3)XCOM(串口调试助手) 2.硬件 ...

  7. GD32F4xx系列的内部FLASH读写以及擦除操作

    GD32F4xx系列的FLASH读写以及擦除操作 1,打开GD32F4用户手册 可以查看到芯片对应的FLASH的大小以及可使用的存储地址. 目前我使用的GD32F407VGT6的FLASH大小为1M, ...

  8. STM32系列(HAL库)——F103C8T6通过SPI方式读写W25Q64—(Flash存储模块)

    1.软件准备 (1)编程平台:Keil5 (2)CubeMX (3)XCOM(串口调试助手) 2.硬件准备 (1)W25Q64模块 (2)F1的板子,本例使用经典F103C8T6 (3)ST-link ...

  9. STM32系列(HAL库)——F103C8T6通过MFRC522、RFID射频卡、门禁卡模块读取卡片ID

    1.软件准备 (1)编程平台:Keil5 (2)CubeMX (3)XCOM(串口调试助手) 2.硬件准备 (1)MFRC-522模块 (2)F1的板子,本例使用经典F103C8T6 (3)ST-li ...

  10. STM32系列(HAL库)——F103C8T6 通过GY906/MLX90614红外测温模块实现温度测量

    1.软件准备 (1)编程平台:Keil5 (2)CubeMX (3)XCOM(串口调试助手) 2.硬件准备 (1)GY-906-BCC红外测温模块 (2)F1的板子,本例使用经典F103C8T6 (3 ...

最新文章

  1. 基于颜色特征,形状特征和纹理特征的数字图像的检索(Digital Image Retrieval)MATLAB GUI实现
  2. Boring counting HDU - 3518 (后缀数组)
  3. 字典-字典和列表组合的应用场景
  4. html5背景图片上放按钮,html5自定义video标签的海报与播放按钮
  5. 234C. Weather
  6. ts 模板库文件_vue与ts的使用模版
  7. 使用javamail 发送邮件
  8. android java pipe_Java-使用Dagger 2进行Android单元测试
  9. MyBatis获取参数值的两种方式以及传参情况
  10. java vo转map_Java后端必备的开发规范
  11. Masonry详解(转)
  12. Win2008 R2 VDI动手实验系列之三:远程桌面会话主机配置
  13. php foreach 时间,PHP利用for,while,foreach遍历时间比较的简单示例
  14. C++ string , int 之间相互转换
  15. linux-2.6.22.6 内核源代码包的文件目录介绍
  16. 湖南省长沙市谷歌高清卫星地图下载
  17. Intouch | 报警延时设定
  18. 中国名人书画展由世界全媒体联盟中国区及广西明星影视文化传媒有限公司联合举办
  19. Trianglify - 生成五彩缤纷的 SVG 背景图案
  20. __stack_chk_fail之栈帧溢出检测技术

热门文章

  1. Camunda 动态增加会签
  2. 家谱处理(30 分)(字符串的处理substr)
  3. 关于maven-jdocbook-plugin插件org.jboss.highlight.XhtmlRendererFactory does not indentify an extern的一个小问题
  4. 计算机集成牌照,车牌识别+证件识别嵌入式识别系统集成
  5. 服务器1U,2U的含义
  6. python爬房源信息_python爬虫获取链家二手房源信息
  7. 基于stm32的减速直流电机PID算法控制
  8. 计算机科学有什么,计算机科学是什么意思
  9. Vmware Workstation 无法连接到虚拟机,请确保您有权运行该程序。
  10. java version什么意思_输入java -version命令后提示结果如下,是什么意思??哪位能看懂,在线等。。。。...