• 应用平台:STM32F030F4P6
  • ST官方库:STM32Cube_FW_F0_V1.9.0

背景知识

  • 绝大多数的单片机和微控制器(ARM,x86),地址空间都是以字节为单位的,也就是说一个地址是一个字节。
  • Flash存储器有个特点,就是只能写0,不能写1。所以如果原来的地址有数据了,意味着有一些位为0,这些位就相当于无效了。所以必须写之前确保他们都为1,只有擦除才可以。另外每次擦除都必须擦除一个4K大小的扇区,这是flash的特性所决定的。
  • 对Flash操作前必需打开内部振荡器。

参考:stm32的学习—FLASH的操作和使用

STM32F030F4P6的Flash存储简介

STM32F030F4P6硬件配置:  FLASH (16KB)  RAM (4KB) 
(包含4个扇区,1个扇区包含4个页,每页有1Kbyte空间) 
用户可以对Flash进行program 和 erase 操作。

Main Flash memory programming 
The main Flash memory can be programmed 16 bits at a time. 
Flash memory erase 
The Flash memory can be erased page by page or completely (Mass Erase). 

Flash memory addresses Size(byte) Name Description
0x0800 0000 - 0x0800 03FF 1 Kbyte Page 0 Sector 0
0x0800 0400 - 0x0800 07FF 1 Kbyte Page 1 Sector 0
0x0800 0800 - 0x0800 0BFF 1 Kbyte Page 2 Sector 0
0x0800 0C00 - 0x0800 0FFF 1 Kbyte Page 3 Sector 0
0x0800 1000 - 0x0800 13FF 1 Kbyte Page 4 Sector 1
0x0800 1400 - 0x0800 17FF 1 Kbyte Page 5 Sector 1
0x0800 1800 - 0x0800 1BFF 1 Kbyte Page 6 Sector 1
0x0800 1C00 - 0x0800 1FFF 1 Kbyte Page 7 Sector 1
0x0800 2000 - 0x0800 23FF 1 Kbyte Page 8 Sector 2
0x0800 2400 - 0x0800 27FF 1 Kbyte Page 9 Sector 2
0x0800 2800 - 0x0800 2BFF 1 Kbyte Page 10 Sector 2
0x0800 2C00 - 0x0800 2FFF 1 Kbyte Page 11 Sector 2
0x0800 3000 - 0x0800 33FF 1 Kbyte Page 12 Sector 3
0x0800 3400 - 0x0800 37FF 1 Kbyte Page 13 Sector 3
0x0800 3800 - 0x0800 3BFF 1 Kbyte Page 14 Sector 3
0x0800 3C00 - 0x0800 3FFF 1 Kbyte Page 15 Sector 3

STM32F030F4P6的Flash读写参考代码(HAL库)

/* Base address of the Flash sectors */
#define ADDR_FLASH_PAGE_0     ((uint32_t)0x08000000) /* Base @ of Page 0, 1 Kbyte */
#define ADDR_FLASH_PAGE_1     ((uint32_t)0x08000400) /* Base @ of Page 1, 1 Kbyte */
#define ADDR_FLASH_PAGE_2     ((uint32_t)0x08000800) /* Base @ of Page 2, 1 Kbyte */
#define ADDR_FLASH_PAGE_3     ((uint32_t)0x08000C00) /* Base @ of Page 3, 1 Kbyte */
#define ADDR_FLASH_PAGE_4     ((uint32_t)0x08001000) /* Base @ of Page 4, 1 Kbyte */
#define ADDR_FLASH_PAGE_5     ((uint32_t)0x08001400) /* Base @ of Page 5, 1 Kbyte */
#define ADDR_FLASH_PAGE_6     ((uint32_t)0x08001800) /* Base @ of Page 6, 1 Kbyte */
#define ADDR_FLASH_PAGE_7     ((uint32_t)0x08001C00) /* Base @ of Page 7, 1 Kbyte */
#define ADDR_FLASH_PAGE_8     ((uint32_t)0x08002000) /* Base @ of Page 8, 1 Kbyte */
#define ADDR_FLASH_PAGE_9     ((uint32_t)0x08002400) /* Base @ of Page 9, 1 Kbyte */
#define ADDR_FLASH_PAGE_10    ((uint32_t)0x08002800) /* Base @ of Page 10, 1 Kbyte */
#define ADDR_FLASH_PAGE_11    ((uint32_t)0x08002C00) /* Base @ of Page 11, 1 Kbyte */
#define ADDR_FLASH_PAGE_12    ((uint32_t)0x08003000) /* Base @ of Page 12, 1 Kbyte */
#define ADDR_FLASH_PAGE_13    ((uint32_t)0x08003400) /* Base @ of Page 13, 1 Kbyte */
#define ADDR_FLASH_PAGE_14    ((uint32_t)0x08003800) /* Base @ of Page 14, 1 Kbyte */
#define ADDR_FLASH_PAGE_15    ((uint32_t)0x08003C00) /* Base @ of Page 15, 1 Kbyte *//* Private define ------------------------------------------------------------*/
#define FLASH_USER_START_ADDR   ADDR_FLASH_PAGE_15          /* Start @ of user Flash area */
#define FLASH_USER_END_ADDR     ADDR_FLASH_PAGE_15 + FLASH_PAGE_SIZE   /* End @ of user Flash area */#define DATA_32                 ((uint32_t)0x12345678)/*Variable used for Erase procedure*/
static FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t Address = 0;/*** @brief  Main program* @param  None* @retval None*/
int main(void)
{/* STM32F0xx HAL library initialization:- Configure the Flash prefetch- Systick timer is configured by default as source of time base, but usercan eventually implement his proper time base source (a general purposetimer for example or other time source), keeping in mind that Time baseduration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined andhandled in milliseconds basis.- Low Level Initialization*/HAL_Init();/* Configure the system clock to 48 MHz */SystemClock_Config();/* Unlock the Flash to enable the flash control register access *************/HAL_FLASH_Unlock();/* Erase the user Flash area(area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********//* Fill EraseInit structure*/EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK){/*Error occurred while page erase.User can add here some code to deal with this error.PageError will contain the faulty page and then to know the code error on this page,user can call function 'HAL_FLASH_GetError()'*//* Infinite loop */while (1){/* User doing something here */}}/* Program the user Flash area word by word(area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/Address = FLASH_USER_START_ADDR;while (Address < FLASH_USER_END_ADDR){if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, DATA_32) == HAL_OK){Address = Address + 4;}else{/* Error occurred while writing data in Flash memory.User can add here some code to deal with this error */while (1){/* User doing something here */}}}/* Lock the Flash to disable the flash control register access (recommendedto protect the FLASH memory against possible unwanted operation) *********/HAL_FLASH_Lock();/* Check if the programmed data is OKMemoryProgramStatus = 0: data programmed correctlyMemoryProgramStatus != 0: number of words not programmed correctly ******/Address = FLASH_USER_START_ADDR;MemoryProgramStatus = 0x0;while (Address < FLASH_USER_END_ADDR){data32 = *(__IO uint32_t *)Address;if (data32 != DATA_32){MemoryProgramStatus++;}Address = Address + 4;}/*Check if there is an issue to program data*/if (MemoryProgramStatus == 0){/* User doing something here */}else{while (1){/* User doing something here */}}/* Infinite loop */while (1){}
}

STM32:Flash擦除与读写操作(HAL库)相关推荐

  1. 用keil怎么擦除_分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入

    编译环境:我用的是(Keil)MDK4.7.2 stm32库版本:我用的是3.5.0 一.本文不对FLASH的基础知识做详细的介绍,不懂得地方请查阅有关资料. 对STM32 内部FLASH进行编程操作 ...

  2. 嵌入式STM32入门之STM32点灯实践(2)——HAL库

    STM32点灯实践(2) 一.前言: 二.HAL库 三.实验工具 1.STM32cubeMx的安装 2.安装HAL库 四.具体实验 1.keil仿真调试 2.上板即可 3.观察GPIO端口的输出波形 ...

  3. 基于STM32的TFT-LCD触摸屏实验(HAL库)

    前言:TFT-LCD作为显示终端必不可少的设备,目前大部分的TFT-LCD都具备了触摸功能.无论是在MCU亦或是SOC(MPU)中,触摸屏的使用都是十分常见的.触摸屏LCD通常分为2种:电阻触摸屏,电 ...

  4. stm32: 串口空闲中断的实现(HAL库)

    STM32利用串口空闲中断来分包(HAL库) 文章目录 STM32利用串口空闲中断来分包(HAL库) 1. 开发环境 2. 串口中断接收的问题和解决办法 3. 串口空闲中断分包的原理 4. STM32 ...

  5. STM32——FLASH擦除/写入失败的踩坑笔记。(WRPERR)

    踩坑flash 操作失败. 查询标志位发现,是因为 WRPERR (写保护置位) 最后debug慢慢遍历程序找到了原因. 是因为对一个 未初始化的野指针 进行了赋值操作.野指针地址为flash地址.故 ...

  6. 基于飞思卡尔MC9S12XS的Flash擦除和写入操作

    关于Flash的擦除和写入,真的是让我最费力的一部分,网上的相关资料很少,好不容易找到了一点相关代码,却发现程序不能正常的运行,而且更令人无解的是程序本身怎么检查都检查不出错误.好啦,一点一点的说说我 ...

  7. 21. GD32F103C8T6入门教程-flash/fmc连续读写操作

    gd32f103 的flash操作 1.定义扇区大小 /*对于主存储闪存容量不多于512KB的GD32F10x_CL和GD32F10x_HD,只使用了bank0:对 于 GD32F10x_MD , 闪 ...

  8. stm32编码器电机测速(hal库)

    记录一下今天参考别人的代码实现了四个电机的测速. 编码器被广泛应用于电机测速,实现电机闭环控制.所以不论是自己做小车还是后续参加各种比赛,必须要学会编码器测速. 一.参数 编码电机其实就是一个带有编码 ...

  9. STM32+W25QXX实现模拟U盘-HAL库

    材料选取 主控芯片:STM32F103C8T6 储存芯片:W25Q16 线性稳压芯片:3.3V稳压SOT-23-5封装 原理图绘制 电源输入及稳压部分: D+数据线上必须加1K的上拉电阻,否则不能通信 ...

最新文章

  1. 国庆节干什么最有意义
  2. html动态生成榜单信息,排行榜.html
  3. python画曲线图例-python使用matplotlib绘制折线图教程
  4. mfc存储颜色到mysql_mfc存储二进制文件
  5. OS- -文件系统(一)
  6. docker ps 和docker ps -a
  7. 在 CSS 中,width 和 height 指的是内容区域的宽度和高度
  8. mybatis sql linux,通用mapper生成sql及mybatis使用过程
  9. win10删除自定义的背景图片历史记录
  10. axure原型素材模板-手机端蓝色科幻科技动态酷炫游戏大数据手机H5页面模板素材聊天
  11. 淘宝用户行为分析项目——MySQL数据分析+Tableau可视化
  12. Action层, Service层 ,modle层 和 Dao层详解
  13. 选型宝访谈:AI时代,如何重新定义客服软件?
  14. python 打印一定范围的素数(质数)
  15. 问题解决:java.lang.IllegalArgumentException: character to be escaped is missing
  16. 内核该怎么学?Linux进程管理工作原理(代码演示)
  17. Python3下基于bs4和sqlalchemy的爬虫实现
  18. H3C 单臂路由(路由器代替虚拟PC)
  19. 经济学计算机会成本,经济学思维方式之二——机会成本、经济利润
  20. AIGC 未来已来——迈向通用人工智能时代

热门文章

  1. 李开复:不是言AI必称中美,而是欧洲太堂吉诃德
  2. Google图解:Chrome 快是有原因的,科普浏览器架构!
  3. 假笨说-我是如何走上JVM这条贼船的
  4. idea 中 git 修改了文件却无法提交(No Changes detected)
  5. 五问弄懂液冷数据中心
  6. 绿色数据中心保护布线的秘决
  7. mysql设计积分兑换表_积分系统数据库表设计.docx
  8. Py之Seaborn:数据可视化Seaborn库的柱状图、箱线图(置信区间图)、散点图/折线图、核密度图/等高线图、盒形图/小提琴图/LV多框图的组合图/矩阵图实现
  9. NLP之word2vec:利用 Wikipedia Text(中文维基百科)语料+Word2vec工具来训练简体中文词向量
  10. TF之LSTM:利用LSTM算法对Boston(波士顿房价)数据集【13+1,506】进行回归预测(房价预测)