单片机内部FLASH的字节操作 您所在的位置:网站首页 flash读取数据库 单片机内部FLASH的字节操作

单片机内部FLASH的字节操作

2023-08-17 03:46| 来源: 网络整理| 查看: 265

一般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; iRO = 0;//去掉所有扇区写保护 //================================================================================== // 判断写入地址是否非法 起始地址或者结束地址不在FALSH范围内则退出 //================================================================================== if(!(IS_FLASH_ADDRESS(startaddr)&& IS_FLASH_ADDRESS(endaddr))) return FLASH_ERROR_PG; while(startaddr < endaddr) { //================================================================================== //1.计算起始地址在FALSH哪一页,并获取该页的首地址 //2.计算起始地址在该页的偏移量 //3.计算该页还剩余多少字节没写入数据 //================================================================================== pageaddr = FLASH_GetFlashPage(startaddr);//获取起始地址所在页的页首地址 index = startaddr-pageaddr;//4K缓冲区内偏移地址 remain=4096-index;//缓存区剩余大小 //================================================================================== // 将该页数据读入4K缓冲数组,后面读写都是对该缓冲数组操作 //================================================================================== for(i=0;i remain)//需要写入的数据量大于缓冲buf剩余字节数 { for(i=index;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有