资料介绍
一般32位单片机的内部FALSH是不支持字节操作的,有的可以按字节读取,但是不能按字节写入。
而且,一般单片机内部FALSH擦除的最小单位都是页,如果向某页中的某个位置写入数据,恰好这个位置的前面存了其他数据,那么就必须把这页擦除,存的其他数据也会丢失。
实际上就是说内部的FALSH不好做改写的操作,如果有很多数据需要存放,最好是分页存储。这也是FALSH与E2PROM最大的区别,后者支持按字节操作且无需擦除,即使某一个地址写坏了,也不影响其他地址。
下面介绍一种方法让内部FLASH"支持"字节操作,且同一页的其他数据不受影响。
方法原理很简单,下面简单介绍下原理:
1.根据要写入地址,计算出该地址位于哪一页;
2.读出整个页,存入缓存BUF;
3.将要写入的数据按位置更新到BUF中;
4.擦除该页;
5.写入整个BUF。
可以看出这种方法弊端很明显:
1.耗时长 每次写都要读整个BUF,然后还要先把数据存到BUF里,然后再写入整个BUF;
2.FALSH擦写次数增加,降低使用寿命;
下面给出测试代码:
#include#include #include //C语言标准库 #include "flash.h" #define USER_FLASH_START_ADDR 0x01070000 //FLASH最后两个扇区 供用户使用 u32tou8 u32data;//定义一个联合体 //================================================================================== // 获取某个地址所在的页首地址 // addr:FLASH地址 // 返回:该地址所在的页 共128页(0~127) //================================================================================== unsigned int FLASH_GetFlashPage(unsigned int addr) { if (IS_FLASH_ADDRESS(addr)) { return (addr&(~0xFFF));//清0低12位就是该页的起始地址 } } //================================================================================== // 从FLASH中读取 一个字(32位) // addr:读取地址 // 返回: 读到的字数据 //备注: 地址为4字节对齐 //================================================================================== unsigned int FLSAH_ReadWord(unsigned int addr) { return (*(unsigned int *)addr); } //================================================================================== //从FLASH指定地址 读取数据 //备注: 读取数据类型为32位 读取地址为4字节对齐 //================================================================================== void FLASH_Read(unsigned int ReadAddr,unsigned char *pBuffer,unsigned int NumToRead) { unsigned int i; u32tobyte cache; for(i=0; i RO = 0;//去掉所有扇区写保护 //================================================================================== // 判断写入地址是否非法 起始地址或者结束地址不在FALSH范围内则退出 //================================================================================== if(!(IS_FLASH_ADDRESS(startaddr)&& IS_FLASH_ADDRESS(endaddr))) return FLASH_ERROR_PG; while(startaddr remain)//需要写入的数据量大于缓冲buf剩余字节数 { for(i=index;i<4096;i++)//将需要写入FALSH的数据写入缓冲buff { buffer[i]=*(pBuffer++); } NumToWrite-=remain;//需要写入的数据长度-本次已经写入的数据长度 startaddr+=remain;//地址向后偏移本次写入的字节数 } else { for(i=index;i 其中还有个联合体的定义:
typedef union { unsigned int data; unsigned char buf[4]; } u32tou8;FLASH_ErasePage、FLASH_ProgramWord、IS_FLASH_ADDRESS 这三个都是单片机FLASH的库函数
各家单片机不同,但功能基本相同,这里不再提供源码。
最后提供以下两个FLASH接口即可:
FLASH_Write(unsigned int WriteAddr,unsigned char *pBuffer,unsigned int NumToWrite); FLASH_Read(unsigned int ReadAddr,unsigned char *pBuffer,unsigned int NumToRead)演示:
1.为方便查看结果,测试从0x1070FFC的位置开始写入数据,FLASH地址分布如下图所示:
这里展示了FLASH连续两页的地址,首先将这两页全部擦除。
2.接着从1070FFC的位置开始写入56个1,这样就保证了数据跨越了1页。
unsigned char write[]= {"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"}; FLASH_Write(0x01070FFC,write,sizeof(write));
注意:最后的00是因为字符串的结尾字符是“/0”
3.紧接着,在0x1070FFE位置写入新的字符串,也要保证写入长度跨越1页。
unsigned char write2[]={"23456789"}; FLASH_Write(0x01070FFE,write2,sizeof(write2));
可以看出,0x1070FFE~0x1071006的位置被写入了新的字节,但这两页的其他位置数据保持不变。
总结:
1、实际使用时,如果不是受限于成本或者FLASH大小,不建议这样读写内部FLASH,以为stm32内部FLASH也就
10W次寿命,这样频繁擦写会大大降低FLASH寿命。
2、如果保存的数据不多,建议每个数据都单独存1页,这样不用考虑擦除时会把其他数据也一并擦除。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_24835087/article/details/103541322
- STM32单片机内部FLASH使用注意事项 4次下载
- STM32F103:内部Flash模拟EEPROM 31次下载
- STM32开发笔记38: 单片机内部Flash的读写 12次下载
- 单片机内部结构分析 18次下载
- 单片机:内部资源 39次下载
- 单片机内部FLASH的字节操作 9次下载
- MSP430单片机F54系列的单片机内部的ADC转换实例 9次下载
- C8051F35X单片机内部Flash存储器的擦写方法总结 11次下载
- C8051F35X单片机内部Flash存储器的擦写方法详细说明 14次下载
- 使用51单片机内核的汇编操作符笔记 1次下载
- 单片机教程之如何进行单片机内部资源的C51编程 21次下载
- MCS51单片机内部并行口及应用 0次下载
- 宏晶单片机内部EEPROM测试程序 23次下载
- C8051F35X单片机内部Flash存储器的擦写方法 55次下载
- 利用视频来演示AVR单片机内部结构 116次下载
- 什么是51单片机最小系统 1319次阅读
- STC89C52单片机内部结构及基本特性 4786次阅读
- 单片机的扩展技术 742次阅读
- 单片机解密到底是什么 2042次阅读
- 单片机解密技术你知道多少带你详细了解 2035次阅读
- 80C51单片机内部定时器和计数器的结构及原理解析 1.3w次阅读
- STC系列单片机内部AD的应用资料和程序及typedef与define的区别说明 4226次阅读
- 如何防止单片机被恶意攻击技术破解 2079次阅读
- 8051单片机int字节的实现 3150次阅读
- 如何利用51单片机内部定时器实现对时间的操作 3.6w次阅读
- STC12C5A60S2单片机的内部构造及功能详细介绍 2.9w次阅读
- Msp430单片机内部Flash存储器的特点及功能解析 3484次阅读
- 为什么单片机有了Flash还有EEPROM 4601次阅读
- 单片机内部密码破解的常用方法解析 4819次阅读
- PIC单片机学习笔记 2403次阅读
下载排行
本周
- 1ATmega8芯片中文手册
- 2.45 MB | 3次下载 | 1 积分
- 2VGA 转 HDMI 输出的音视频采集卡LCC385数据手册
- 0.34 MB | 2次下载 | 免费
- 3全套DDR、DDR2、DDR3、DDR3L、LPDDR3 和 DDR4 电源解决方案同步降压控制器数据表
- 2.5MB | 1次下载 | 免费
- 4具有过压保护和阻断 FET控制功能的12V电子熔丝TPS25924x数据表
- 1.92MB | 1次下载 | 免费
- 5带自动重试功能的IEEE 802.3af PoE供电设备控制器TPS2375数据表
- 920.76KB | 1次下载 | 免费
- 6稳压5V、300mA高效电荷泵DC-DC转换器TPS6013x数据表
- 1.5MB | 1次下载 | 免费
- 7照明-电源-POE-GEVB评估套件数据手册
- 4.40 MB | 1次下载 | 免费
- 8集成 FET 的 2A 双通道同步降压开关TPS54295数据表
- 1.21MB | 次下载 | 免费
本月
- 1DC-DC电路(Buck)的设计与仿真
- 0.60 MB | 23次下载 | 2 积分
- 2UHD智能显示SoC VS680产品简介
- 0.46 MB | 11次下载 | 免费
- 3ES9038PRO解码芯片的电路原理图介绍
- 0.25 MB | 11次下载 | 5 积分
- 4东芝BiCD集成电路硅单片TB67S109AFNAG数据手册
- 1.93 MB | 6次下载 | 免费
- 5采用 Impedance Track™ 技术的宽量程电量监测计BQ34Z100-G1数据表
- 2.7MB | 6次下载 | 免费
- 616A 输出电流,高可靠、高效率 同步降压转换器PCD3201产品手册
- 0.47 MB | 6次下载 | 免费
- 7电池管理系统(BMS)软硬件介绍
- 0.23 MB | 5次下载 | 2 积分
- 8TDK电容器产品指南
- 11.88 MB | 5次下载 | 1 积分
总榜
- 1matlab软件下载入口
- 未知 | 935085次下载 | 免费
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420048次下载 | 免费
- 3Altium DXP2002下载入口
- 未知 | 233067次下载 | 免费
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191315次下载 | 免费
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183315次下载 | 免费
- 6labview8.5下载
- 未知 | 81567次下载 | 免费
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73786次下载 | 免费
- 8NI LabVIEW中实现3D视觉的工具和技术
- 未知 | 70088次下载 | 免费
评论
查看更多