最近工作上需要对英飞凌XC886这款单片机的Flash进行读写,以下为简要的几点总结:

一、Flash存储器结构:
XC886共有32KFlash,地址映射如下图所示:


共三块P-Flash用来存储程序,两块D-Flash既可用来存储程序也可以存储数据,每块D-Flash映射到两个不同的地址,如Bank1映射到6000-6FFF和B000-BFFF,通常存储程序的时候采用低地址,存储数据的时候采用高地址。此处需注意每个Flash bank虽然映射到了两个地址,但实际在物理上是同一块Flash,不要把两组地址当做两块Flash来操作,否则会相互影响数据。

二、Flash bank的分区如下图所示:

D-Flash分区较为灵活。因为Flash每次擦除要擦除整个扇区(Sector),所以扇区划分越细越有利于我们操作。Flash写之前都需要先擦除,擦除后的状态为全0,写的时候可以从0写为1,不能从1写为0。

三、写Flash:
写Flash的时候每次要写一个字线地址(WL),对于P-Flash来说是64个字节,D-Flash来说是32个字节,下图为手册中给出的字线地址划分:


芯片手册中对于Flash的写给出了如下说明:

对于 P- Flash bank,由于 Flash 单元只能承受一个门干扰,因此已编程的字线在重新编程前必须先擦除。因为不可能单独擦除一条字线,这即意味着包৿该字线的整个扇区必须全部被擦除。
对于 D- Flash bank,由于 Flash 单元能承受两个门干扰,同一条字线在擦除前可编程两次。 这即意味着如果需要编程的数据字节的个数小于 32 字节(最小编程宽度), 用户可选择先编程这些数据字节(x; x 可以是 1-31 之间的任意整数),之后再编程其余字节(32-x)。 不过,由于 D-Flash 的最小编程宽度始终为 32 个字节,因此在每个编程周期中᳾被编程的字节必须写入全 0。

没有能够很透彻地理解它的这段话,但实际试验结果是对于D-Flash来说,一个WL在擦除前可被编程多次,即只要原来为0x00的字节都可以被写入非0值,对于原来已有数据的字节,已经被写入1的数据位不能再被写入0,但如果有某一位没有被写入过1,通常情况下可以被写入1,例如0x80(10000000)可以被写为0x81(10000001),但这并不代表Flash可以按位操作,例如实测0x03(00000011)想写为0x07(00000111)时就会写入失败,原因没有深入研究。

四、Flash模拟EEPROM
因为Flash使用寿命有限,只针对Flash的一个区域进行操作会造成其快速老化,使用效率过低,所以可以通过算法来模拟EEPROM,循环使用Flash的多个Sector,延长寿命,同时也避免存储数据时相互冲突和影响。英飞凌官方提供了三种Flash模拟EEPROM的算法,例程代码和说明见
https://download.csdn.net/download/weixin_42967006/11356942
其中操作Flash的函数是用汇编写的,如下图所示,给出了在C语言中调用的接口。
官方给出的三个算法都略为复杂,我只需存储一个标志位,所以在实际应用的时候自己简单做了个简单的小算法,能够实现标志位的存储,并且循环使用了bank1的每一个sector,把代码贴出来供大家参考。

char selectedLanguage=0; //
unsigned char code * piWLAddress;
unsigned char code * piWLAddressToCover=-1;
char idata ucSectorNumberToRead=0;
char idata ucSectorNumberToErase=-1;
unsigned char data storedLanguage[32]=0;
char code * code iSectorAddress[10]={0xB000,0xB400,0xB800,0xBA00,0xBC00,0xBD00,0xBE00,0xBE80,0xBF00,0xBF80};//查找有效的Sector
SearchSector:piWLAddress=iSectorAddress[ucSectorNumberToRead];
SearchWL:if(*piWLAddress==0x81)//用过,失效{if(piWLAddress==0xBFE0 )//到达最后一个WL{selectedLanguage=0; ucSectorNumberToErase=0;     //  ucSectorNumber无效sector,待擦除写入有效值  piWLAddress=iSectorAddress[ucSectorNumberToErase];goto SearchEnd;}else{piWLAddress+=0x20;if(ucSectorNumberToRead<9 && piWLAddress==iSectorAddress[ucSectorNumberToRead+1])//判断是否到达下一个sector{ucSectorNumberToRead++;goto SearchSector;}else goto SearchWL;}}else if(*piWLAddress==0x80)//有效{selectedLanguage=*(piWLAddress+1);if(selectedLanguage<0||selectedLanguage>2) selectedLanguage=0;if(piWLAddress==0xBFE0)//已经是最后一个WL{ucSectorNumberToErase=0;piWLAddressToCover=piWLAddress;piWLAddress=iSectorAddress[ucSectorNumberToErase];}else{piWLAddressToCover=piWLAddress;piWLAddress+=0x20;if(piWLAddress==iSectorAddress[ucSectorNumberToRead+1])//是否到达下一个sector{ucSectorNumberToErase=ucSectorNumberToRead+1;//擦除下一个sector}}}else//无有效sector{// ucSectorNumber无效sector,待擦除写入有效值                  selectedLanguage=0; ucSectorNumberToErase=ucSectorNumberToRead;       //  ucSectorNumber无效sector,待擦除写入有效值  piWLAddress=iSectorAddress[ucSectorNumberToErase];}
SearchEnd:
……
//写入有效数据
//其中NMISR为单片机NMI状态寄存器,当Flash动作执行完毕后第3位会置1if(piWLAddressToCover!=-1)//将已用WL置为已用{storedLanguage[0]=0x81;FLASH_PROG(piWLAddressToCover,(char data*)storedLanguage);while(0==(NMISR & 0x04));NMISR &= ~(ubyte)0x04;}//erase sectorif(ucSectorNumberToErase!=-1){
//                              lEraseSector=0x00000001<<ucSectorNumberToErase;
//                              FLASH_ERASE((char)(lEraseSector>>16),(char)(lEraseSector>>24),//D-Flash bank 0 sector 0-9
//                                                      (char)lEraseSector,(char)(lEraseSector>>8),//D-Flash bank 1 sector 0-9
//                                                      0,0,0);//P-FlashFLASH_ERASE(0,0,//D-Flash bank 0 sector 0-9(char)(0x0001<<ucSectorNumberToErase),(char)(0x00000001<<(ucSectorNumberToErase-8)),//D-Flash bank 1 sector 0-90,0,0);//P-Flashwhile(0==(NMISR & 0x04));NMISR &= ~(ubyte)0x04;}storedLanguage[0]=0x80;storedLanguage[1]=selectedLanguage;FLASH_PROG(piWLAddress,(char data*)storedLanguage);//存有效数据while(0==(NMISR & 0x04));NMISR &= ~(ubyte)0x04;

以上。其实大部分内容是参考的芯片手册,这里只是将我觉得有用的地方做了记录和提炼,方便日后查询,也欢迎大家交流指正。

英飞凌XC886单片机Flash读写总结相关推荐

  1. c语言中读取flash值的作用,flash读写程序

    原标题:flash读写程序 在电子工程世界为您找到如下关于"flash读写程序"的新闻 msp430F149单片机的flash读写程序 //基于msp430F149单片机的flas ...

  2. 单片机编程php,STC单片机内部FLASH读写程序(最新整理)

    <STC单片机内部FLASH读写程序(最新整理)>由会员分享,可在线阅读,更多相关<STC单片机内部FLASH读写程序(最新整理)(6页珍藏版)>请在人人文库网上搜索. 1.S ...

  3. 华大单片机HC32L136X单片机flash数据读写操作使用

    此款单片机是由有64K的字节flash,一共有128页,一页有512字节,以下是容量划分: 这里使用的是字节位宽的数据读写操作进行演示,其他2种方式大同小异,需要用到自己去研究,首先需要添加对应的fl ...

  4. 单片机flash通用读写库:TZFlash

    单片机flash通用读写库:TZFlash 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 说明 本文发布单片机flash通用读写库TZFlash,有两 ...

  5. 向单片机flash中烧录自定义数据的方法

    自己做项目碰到和总结的一个问题,感觉挺有用的,贴出来,让后来的朋友少走弯路! 关键词:nrf51822   hex文件格式详解   flash读写 hex文件创建和烧录 引言     答题器项目生产时 ...

  6. GD32片内flash读写数据

    GD32现在越来越火,应用也越来越广泛.我们在开发项目的时候,总会有需要掉电存储一些配置信息的时候,但是使用外挂flash.或者EEPROM,或多或少都会占用一些外围接口或增加一定的成本.于是,直接将 ...

  7. STM32CUBEIDE(16)----内部Flash读写

    STM32CUBEIDE(16)----内部Flash读写 概述 视频教学 csdn课程 硬件准备 配置时钟树 串口重定向 FLASH定义 低密度 中密度 高密度 变量定义 演示效果 最后 概述 本例 ...

  8. 基于STM32的flash读写和DAC音频播放

    一.STM32的flash读写 1.利用STM32CUBEMX创建工程 之前有过很多次创建工程的例子,这里大致过程如下: 2.keil中添加代码及修改配置 在flash.c中添加如下代码, 在main ...

  9. STM32之flash读写操作篇

    1.flash概述 flash跟ROM相似,都有断电不会丢失数据的这一特性,可用于存储一些重要的数据.数据是直接存储到内存地址上,所以要写数据时要先了解清楚自己所以芯片的flash地址是从0X0800 ...

最新文章

  1. 数据驱动的算法工程落地!
  2. Nature子刊:干旱条件下土壤细菌网络的稳定性不如真菌网络
  3. 老版本select2设置初始值
  4. xfce4 菜单文件
  5. 史上最全的并发编程学习
  6. 【笔记】iOS开发基础笔记二
  7. 无限级分销系统数据库表设计
  8. 电脑小白和黑客的对白
  9. c语言反序数1234变4321,C语言编程题练习
  10. 物联网产品的平台架构
  11. Linux网页版操作
  12. 全球及中国等离子电视行业市场销售量调研及未来发展展望报告2022-2027年
  13. 揭秘APP软件开发者百万富翁之路:造程序的工厂
  14. 限制p元素之显示2行文字,同时出现省略号。
  15. 【R语言数据科学】(十八):系统聚类和K-Means聚类
  16. freemarker字符串替换操作
  17. python series转置储存到excel_P9:pythonpandas玩转excel文件
  18. CoreImage各种filter
  19. CSS3之其他常用属性
  20. 一起学Netty(六)之 TCP粘包拆包场景

热门文章

  1. Git入门学习和使用
  2. 计算机科学与技术班徽图片,学校运动会入场广播词
  3. 火力篮球游戏源码完整版-带游戏开发文档
  4. 《导航贴》-Android手册,重温移动开发
  5. Echart自定义tooltip带小圆点
  6. 安卓APP源码和设计报告——仿淘宝购物APP
  7. 苹果怎么付费购买内存_对于苹果手机加内存你怎么看?
  8. i5 9300h和i7 7700hq哪个好
  9. Mac上的BG Renderer MAX(ae多线程渲染工具)
  10. Movavi Video Converter,一款来自国外的格式转换神器。