用keil怎么擦除_分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入
编译环境:我用的是(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 擦除(以及防止误擦除程序代码)、写入相关推荐
- 【代码分享】TRL微波器件测量去嵌入校准–程序代码
写在前面 由于研究需要,本人深入学习实践了基于微波测试的器件仿真建模技术,至今九年有余.回顾研究经历,从最简单的直通校准到严格的TRL校准,从普通的SAM焊接接头到精密的V波段免焊接接头,从0603封 ...
- 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序
概述 今天主要分享一个有趣的shell脚本,用来实现抓阄,平时就不用剪刀石头布了. 需求 使用shell编写一个抓阄的程序: 1.执行脚本后,输入英文名字全拼,产生随机数01-99之间的数字,数字越大 ...
- c++美发店管理系统设计_急求一份美发店管理系统设计c++程序代码?求大神帮忙,谢谢!!!!...
1.问题描述定义顾客类,属性有:会员卡号.姓名.性别.电话等信息和相关的对属性做操作的行为.定义员工类:属性有:编号.姓名.性别.电话.美发项目(理发.烫发.洗发)等信息和... 1.问题描述 定义顾 ...
- 用keil怎么擦除_用这种方法销毁硬盘数据,即使美国中央情报局也难以恢复
删除硬盘数据的方法有很多,但那些数据还是有被恢复的可能,这对于想要销毁数据的用户是很苦恼的.如果我们有报废或弃用的硬盘,该怎么彻底删除其数据呢? 一般情况下,想要彻底清除硬盘里的数据,有3种类型的方式 ...
- 基于Keil、STM32,用C++编写流水灯程序
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发 ...
- stm32 Flash读写[库函数]
stm32 的内置可编程Flash在许多场合具有十分重要的意义.如其支持ICP特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写:支持IAP特性使得开发 ...
- STM32 FLASH的写入与读取
STM32 FLASH的写入与读取 解释下a = (u16)(add); u16 FLASH_R(u32 add){ //参数1:FLASH地址(32位)u16 a;a = *(u16*)(add); ...
- 单片机编程软件很简单(23),keil单片机编程软件调试stm32
单片机编程软件的使用意义较强,不论是工作还是学习,单片机编程软件都是常被使用的软件之一.本文对于单片机编程软件的介绍将基于如何采用keil单片机编程软件调试stm32,如果你对单片机编程软件抑或本文内 ...
- 学习STM32 Flash存储 W25Q64 SPI总线存储模块进行读写数据
今天学习 Flash 存储芯片进行数据写入和读取方法.了解W25Q64 存储芯片的使用.能够用 STM32 单片机对 W25Q64 进行写入数据,擦除数据,读取数据. w25q64 是什么? W25Q ...
最新文章
- 计算机组成原理:输入输出系统
- 求满足从1加到m的和大于1000的最小m值
- 基于Confluent.Kafka实现的Kafka客户端操作类使用详解
- 那些关于区块链革命的事情
- .NET Core Community 首个千星项目诞生:CAP
- CF25E-Test【AC自动机,bfs】
- 在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer(下)
- 多机器人路径规划的代码_知荐 | 地平线机器人算法工程师总结六大路径规划算法...
- 从0开始架构一个IOS程序—— 02 — 设置启动图标与启动页面
- Java多线程基础学习一:线程的6种状态和相互转化
- Java Servlet JSP
- 计算机学院网络与新媒体,网络与新媒体专业课程描述.PDF
- 路飞学城Python-Day42
- mysql sql中的一些问题,Null与空字符
- java点击登录实现跳转_页面跳转的简单实现(单点登录)
- 天眼查企业工商信息查询接口
- 【TK精灵】一款界面友好的桌面程序(exe)进程守护管理软件
- 如何在工作中形成自己的方法论(待完善)
- 我悟出了公众号取名的套路
- nginx启动、停止、重启命令
热门文章
- SignalR的性能监测与服务器的负载测试
- [转]EL函数、自定义EL函数、自定义标签
- ArcGIS 10.7如何获取矢量多边形所有折点的坐标(平面坐标和经纬度坐标)?
- linux终端常用命令和windows终端常用命令对比
- Android之玩转选项卡(TabHost、TabWidget、FrameLayout)
- 【iVX 初级工程师培训教程 10篇文拿证】04 画布及我和 iVX 合照
- 一个类可以实现多个接口吗_Java入门:基础知识(面向对象:接口)
- java 获取接口的注解_java反射注解妙用-获取所有接口说明
- asp 强制转换浮点数值_C/C++中浮点数的编码存储
- jq取第一个子元素为select_【转】jquery如何获取第一个或最后一个子元素?