编译环境:我用的是(Keil)MDK4.7.2

stm32库版本:我用的是3.5.0

一、本文不对FLASH的基础知识做详细的介绍,不懂得地方请查阅有关资料。

对STM32 内部FLASH进行编程操作,需要遵循以下流程:

FLASH解锁

清除相关标志位

擦除FLASH(先擦除后写入的原因是为了工业上制作方便,即物理实现方便)

写入FLASH

锁定FLASH

实例:

#define FLASH_PAGE_SIZE ((uint16_t)0x400) //如果一页为1K大小

#define WRITE_START_ADDR ((uint32_t)0x08008000)//写入的起始地址

#define WRITE_END_ADDR ((uint32_t)0x0800C000)//结束地址

uint32_t EraseCounter = 0x00, Address = 0x00;//擦除计数,写入地址

uint32_t Data = 0x3210ABCD;//要写入的数据

uint32_t NbrOfPage = 0x00;//记录要擦除的页数

volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;/*FLASH擦除完成标志*/

void main()

{

/*解锁FLASH*/

FLASH_Unlock();

/*计算需要擦除FLASH页的个数 */

NbrOfPage = (WRITE_END_ADDR - WRITE_START_ADDR) / FLASH_PAGE_SIZE;

/* 清除所有挂起标志位 */

FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);

/* 擦除FLASH 页*/

for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)

{

FLASHStatus = FLASH_ErasePage(WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));

}

/* 写入FLASH*/

Address = WRITE_START_ADDR;

while((Address < WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))

{

FLASHStatus = FLASH_ProgramWord(Address, Data);

Address = Address + 4;

}

/* 锁定FLASH*/

FLASH_Lock();

}

二、FLASH 擦除(以及防止误擦除程序代码)

1、擦除函数

FLASH_Status FLASH_ErasePage(u32 Page_Address)只要()里面的数是flash第xx页中对应的任何一个地址!就是擦除xx页全部内容!

防止误擦除有用程序代码的方法

方法一:首先要计算程序代码有多少,把FLASH存取地址设置在程序代码以外的地方,这样就不会破坏用户程序。原则上从0x0800 0000 + 0x1000 以后的FLASH空间都可以作为存储使用。如果代码量占了 0x3000, 那么存储在 0x0800 0000+ 0x4000 以后的空间就不会破坏程序了。

方法二:先在程序中定义一个const 类型的常量数组,并指定其存储位置(方便找到写入、读取位置),这样编译器就会分配你指定的空间将常量数组存入FLASH中。当你做擦除。读写操作时,只要在这个常量数组所在的地址范围就好。

const uint8_t table[10]__at(0x08010000)= {0x55} ;

MDK3.03A开始就支持关键字 __at() 。

需要加#include

方法三:在程序中定义一个const 类型的常量数组,无需指定其存储位置。只要定义一个32位的变量存储这个数组的FLASH区地址就行。

uint32_t address;//STM32的地址是32位的

const uint8_t imageBuffer[1024] = {0,1,2,3,4,5,6,7};

address = (uint32_t) imageBuffer;/*用强制类型转换的方式,可以把FLASH中存储的imageBuffer[1024]的地址读到RAM中的变量address 里,方便找到写入、读取位置*/

方法四:利用写保护的方式(没研究明白)

上一页

1

2

下一页

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

  1. 【代码分享】TRL微波器件测量去嵌入校准–程序代码

    写在前面 由于研究需要,本人深入学习实践了基于微波测试的器件仿真建模技术,至今九年有余.回顾研究经历,从最简单的直通校准到严格的TRL校准,从普通的SAM焊接接头到精密的V波段免焊接接头,从0603封 ...

  2. 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序

    概述 今天主要分享一个有趣的shell脚本,用来实现抓阄,平时就不用剪刀石头布了. 需求 使用shell编写一个抓阄的程序: 1.执行脚本后,输入英文名字全拼,产生随机数01-99之间的数字,数字越大 ...

  3. c++美发店管理系统设计_急求一份美发店管理系统设计c++程序代码?求大神帮忙,谢谢!!!!...

    1.问题描述定义顾客类,属性有:会员卡号.姓名.性别.电话等信息和相关的对属性做操作的行为.定义员工类:属性有:编号.姓名.性别.电话.美发项目(理发.烫发.洗发)等信息和... 1.问题描述 定义顾 ...

  4. 用keil怎么擦除_用这种方法销毁硬盘数据,即使美国中央情报局也难以恢复

    删除硬盘数据的方法有很多,但那些数据还是有被恢复的可能,这对于想要销毁数据的用户是很苦恼的.如果我们有报废或弃用的硬盘,该怎么彻底删除其数据呢? 一般情况下,想要彻底清除硬盘里的数据,有3种类型的方式 ...

  5. 基于Keil、STM32,用C++编写流水灯程序

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发 ...

  6. stm32 Flash读写[库函数]

    stm32 的内置可编程Flash在许多场合具有十分重要的意义.如其支持ICP特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写:支持IAP特性使得开发 ...

  7. STM32 FLASH的写入与读取

    STM32 FLASH的写入与读取 解释下a = (u16)(add); u16 FLASH_R(u32 add){ //参数1:FLASH地址(32位)u16 a;a = *(u16*)(add); ...

  8. 单片机编程软件很简单(23),keil单片机编程软件调试stm32

    单片机编程软件的使用意义较强,不论是工作还是学习,单片机编程软件都是常被使用的软件之一.本文对于单片机编程软件的介绍将基于如何采用keil单片机编程软件调试stm32,如果你对单片机编程软件抑或本文内 ...

  9. 学习STM32 Flash存储 W25Q64 SPI总线存储模块进行读写数据

    今天学习 Flash 存储芯片进行数据写入和读取方法.了解W25Q64 存储芯片的使用.能够用 STM32 单片机对 W25Q64 进行写入数据,擦除数据,读取数据. w25q64 是什么? W25Q ...

最新文章

  1. 计算机组成原理:输入输出系统
  2. 求满足从1加到m的和大于1000的最小m值
  3. 基于Confluent.Kafka实现的Kafka客户端操作类使用详解
  4. 那些关于区块链革命的事情
  5. .NET Core Community 首个千星项目诞生:CAP
  6. CF25E-Test【AC自动机,bfs】
  7. 在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer(下)
  8. 多机器人路径规划的代码_知荐 | 地平线机器人算法工程师总结六大路径规划算法...
  9. 从0开始架构一个IOS程序—— 02 — 设置启动图标与启动页面
  10. Java多线程基础学习一:线程的6种状态和相互转化
  11. Java Servlet JSP
  12. 计算机学院网络与新媒体,网络与新媒体专业课程描述.PDF
  13. 路飞学城Python-Day42
  14. mysql sql中的一些问题,Null与空字符
  15. java点击登录实现跳转_页面跳转的简单实现(单点登录)
  16. 天眼查企业工商信息查询接口
  17. 【TK精灵】一款界面友好的桌面程序(exe)进程守护管理软件
  18. 如何在工作中形成自己的方法论(待完善)
  19. 我悟出了公众号取名的套路
  20. nginx启动、停止、重启命令

热门文章

  1. SignalR的性能监测与服务器的负载测试
  2. [转]EL函数、自定义EL函数、自定义标签
  3. ArcGIS 10.7如何获取矢量多边形所有折点的坐标(平面坐标和经纬度坐标)?
  4. linux终端常用命令和windows终端常用命令对比
  5. Android之玩转选项卡(TabHost、TabWidget、FrameLayout)
  6. 【iVX 初级工程师培训教程 10篇文拿证】04 画布及我和 iVX 合照
  7. 一个类可以实现多个接口吗_Java入门:基础知识(面向对象:接口)
  8. java 获取接口的注解_java反射注解妙用-获取所有接口说明
  9. asp 强制转换浮点数值_C/C++中浮点数的编码存储
  10. jq取第一个子元素为select_【转】jquery如何获取第一个或最后一个子元素?