版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、分享 STM32 FLASH 擦除(以及防止误擦除程序代码) 、写入编译环境:我用的是 (Keil)MDK4.7.2stm32 库版本:我用的是 3.5.0一、本文不对 FLASH 的基础知识做详细的介绍,不懂得地 方请查阅有关资料。对 STM32 内部 FLASH 进行编程操作,需要遵循以下 流程:FLASH 解锁清除相关标志位擦除 FLASH( 先擦除后写入的原因是为了工业上制作方 便,即物理实现方便 )写入 FLASH锁定 FLASH实例:#define FLASH_PAGE_SIZE (uint16_t)0x400) / 如果 一页为 1K 大小#define WRITE_START_
2、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
3、*/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
4、);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
5、_Lock();二、 FLASH 擦除(以及防止误擦除程序代码)1、擦除函数FLASH_Status FLASH_ErasePage(u32 Page_Address)只要()里面的数是 flash 第 xx 页中对应的任何一个地址!就 是擦除 xx 页全部内容!防止误擦除有用程序代码的方法 方法一:首先要计算程序代码有多少,把 FLASH 存取地址 设置在程序代码以外的地方,这样就不会破坏用户程序。原 则上从 0x0800 0000 + 0x1000 以后的 FLASH 空间都可以 作为存储使用。如果代码量占了 0x3000 , 那么存储在 0x0800 0000+ 0x4000 以后的空间
6、就不会破坏程序了。 方法 二:先在程序中定义一个 const 类型的常量数组,并指定其 存储位置(方便找到写入、读取位置) ,这样编译器就会分 配你指定的空间将常量数组存入 FLASH 中。当你做擦除。 读写操作时,只要在这个常量数组所在的地址范围就好。 const uint8_t table10 _at(0x08010000) = 0x55 ;MDK3.03A 开始就支持关键字 _at() 。需要加 #include <absacc.h> 方法三: 在程序中定义 一个 const 类型的常量数组,无需指定其存储位置。只要定 义一个 32 位的变量存储这个数组的 FLASH 区地址
7、就行。 uint32_t address;/STM32 的地址是 32 位的const uint8_t imageBuffer1024 = 0,1,2,3,4,5,6,7;address = (uint32_t) imageBuffer;/* 用强制类型转换的 方式, 可以把 FLASH 中存储的 imageBuffer1024 的地址读 到 RAM 中的变量 address 里,方便找到写入、读取位置 */ 方法四:利用写保护的方式(没研究明白)三、 FLASH 写 入FLASH 的写入地址必须是偶数( FLASH 机制决定的 FLASH 写入的时候只能是偶数地址写入,必须写入半字或 字,也
8、就是 2 个字节或是 4 字节的内容)四、 FLASH 读取方法*(uint32_t *)0x8000000;/ 读一个字*(uint8_t *)0x8000000;/ 读一个字节 ;*(uint16_t *)0x8000000;/ 读半字 ;举例:uint8_t data;data = *(uint8_t *)0x8000000;/ 就是读取 FLASH 中地址0x8000000 处的数据五、几个有用的子函数/*功能:向指定地址写入数据参数说明: addr 写入的 FLASH 页的地址p 被写入变量的地址(数组中的必须是 uint8_t 类型,元素个数必须是偶数)Byte_Num 被写入变量
9、的字节数(必须是偶数)*/void FLASH_WriteByte(uint32_t addr , uint8_t *p , uint16_t Byte_Num)uint32_t HalfWord;Byte_Num = Byte_Num/2;FLASH_Unlock();FLASH_ClearFlag(FLASH_FLAG_BSY |FLASH_FLAG_EOP | FLASH_FLAG_PGERR |FLASH_FLAG_WRPRTERR);FLASH_ErasePage(addr);while(Byte_Num -)HalfWord=*(p+);HalfWord|=*(p+)<<8;FLASH_ProgramHalfWord(addr,HalfWord);addr += 2;FLASH_Lock();例:uint8_t data100;FLASH_WriteByte(0x8000000 , data , 100);/* 数组 data 的数据被写入 FLASH 中 */*功能:从指定地址读取数据参数说明:addr 从 FLASH 中读取的地址p 读取后要存入变量的地址(数组中的必须是 uint8_t 类型)Byte_Num 要读出的字节数*/void FLASH_ReadByte(uint32_t addr ,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届吉林省长春市解放大路中学九年级物理第一学期期末联考试题含解析
- 2026届云南省昭通市巧家县九上物理期中检测试题含解析
- 路由检测协议书
- 进料加工对口合同(标准版)
- 2023年-2024年公共营养师之三级营养师模拟考试试卷B卷含答案
- 注册资产评估师资产评估基础模拟试卷5-真题-无答案
- 美术培训班合作协议书
- 签了两个三方协议书
- 麻豆离婚协议书
- 2023年一级建造师之一建建筑工程实务基础试题库和答案要点
- 2025年下半年江苏盐城市亭湖区城管协管员招考94人易考易错模拟试题(共500题)试卷后附参考答案
- 2025及未来5年中国电子记事本市场调查、数据监测研究报告
- 2025-2026学年上学期高一英语人教新版期中必刷常考题之完形填空
- 忻州市静乐县霍州煤电集团汾源煤业有限公司矿产资源开发利用、地质环境保护与治理恢复、土地复垦方案
- 人教版初中数学七年级上册教学课件多项式
- 弱电智能化工程售后服务方案
- 高三家长会班主任发言稿15篇
- YY/T 0461-2003麻醉机和呼吸机用呼吸管路
- TY/T 2001-2015国民体质测试器材通用要求
- 新人教版五年级上册数学(新插图)练习八 教学课件
- GB/T 2008-1987散装氟石取样、制样方法
评论
0/150
提交评论