历史上的今天
返回首页

历史上的今天

今天是:2025年07月17日(星期四)

正在发生

2018年07月17日 | STM32单片机内部EEPROM的读写

2018-07-17 来源:eefocus

STM32L系列单片机内部提供了EEPROM存储区域,但实质上,其FLASH也是EEPROM类型,只不过有一块区域被开放出来专门用作EEPROM操作而已。STM32L的EEPROM使用寿命设计为100000次擦写以上,容量为2K-4K,这对于一般设备的参数存储来说是非常理想的。但从EEPROM使用方式看,其不适用于被反复修改的数据存储使用,一般作为配置参数,其修改次数往往是比较少量的。


STM32L的EEPROM和FLASH是统一编址,操作共用同一个读写电路,所以在EEPROM读写的时候STM32L核对于FLASH的一切访问和操作都将暂停,只有当EEPROM的操作完成后,才继续执行后续代码,在这期间只有EEPROM的读写电路工作,CPU处于挂起状态。


读操作,和FLASH以及内存一样,EEPROM的数据读取直接用总线读周期读出即可,不需要进行额外操作和设置。



#define EEPROM_BASE_ADDR    0x08080000    

#define EEPROM_BYTE_SIZE    0x0FFF  


以上定义EEPROM区的起始位置和大小,给定偏移量之后,可以按字节/半字/字/双字方式读出,但要注意的是最好偏移地址都按四字节对齐,以免产生总线访问错误或是取不正确:

    


/*------------------------------------------------------------ 

 Func: EEPROM数据按字节读出 

 Note: 

-------------------------------------------------------------*/  

void EEPROM_ReadBytes(uint16 Addr,uint8 *Buffer,uint16 Length)  

{  

    uint8 *wAddr;  

    wAddr=(uint8 *)(EEPROM_BASE_ADDR+Addr);  

    while(Length--){  

        *Buffer++=*wAddr++;  

    }     

}  

    


/*------------------------------------------------------------ 

 Func: EEPROM数据读出 

 Note: 

-------------------------------------------------------------*/  

void EEPROM_ReadWords(uint16 Addr,uint16 *Buffer,uint16 Length)  

{  

    uint32 *wAddr;  

    wAddr=(uint32 *)(EEPROM_BASE_ADDR+Addr);  

    while(Length--){  

        *Buffer++=*wAddr++;  

    }     

}  



以上方法使用字节和字方式读出,在后面方法中,在一个字的存储空间内只使用了16个位,另16位不用,这样以避免产生对齐问题。


EEPROM的编程比读操作要复杂的多,本质上来说,擦除操作和写入操作是一样的,擦除只是在相应的地方写入0x00000000,但在STM32L的实现上,根据其手册说明貌似把这种擦除和写入区分开了,当写入0x00或0x0000或0x00000000时,自动执行一次擦除操作,在值为非0时,才执行一次所谓的写入操作。数据的写入过程先要对EEPROM进行解锁,这通过对特殊寄存器写入特殊序列实现,然后在写入之前进行擦除操作,其擦除是按字/ 双字/页进行的,推荐使用页擦除方式进行,先把参数读到内存,并修改,再进行页擦除,最后将参数写回,这种方式比较通用,否则很容易出现地址对齐或长度问题。在数据擦除完成之后,即可进行写入,每写一字节/半字/双字,都需要判断其是否写入完成,这和内部高压擦写电路有关,只有在上次操作完成之后再进行其它操作才有意义。最后,对EEPROM进行加锁,以保护数据。


 

下是手册给出的解锁命令码:



#define PEKEY1  0x89ABCDEF      //FLASH_PEKEYR  

#define PEKEY2  0x02030405      //FLASH_PEKEYR  

    以下分别实现按字节和字方式写入:   


/*------------------------------------------------------------ 

 Func: EEPROM数据按字节写入 

 Note: 

-------------------------------------------------------------*/  

void EEPROM_WriteBytes(uint16 Addr,uint8 *Buffer,uint16 Length)  

{  

    uint8 *wAddr;  

    wAddr=(uint8 *)(EEPROM_BASE_ADDR+Addr);  

    DIS_INT  

    FLASH->PEKEYR=PEKEY1;                //unlock  

    FLASH->PEKEYR=PEKEY2;  

    while(FLASH->PECR&FLASH_PECR_PELOCK);  

    FLASH->PECR|=FLASH_PECR_FTDW;        //not fast write  

    while(Length--){  

        *wAddr++=*Buffer++;  

        while(FLASH->SR&FLASH_SR_BSY);  

    }  

    FLASH->PECR|=FLASH_PECR_PELOCK;  

    EN_INT  

}  

    


/*------------------------------------------------------------ 

 Func: EEPROM数据按字写入 

 Note: 字当半字用 

-------------------------------------------------------------*/  

void EEPROM_WriteWords(uint16 Addr,uint16 *Buffer,uint16 Length)  

{  

    uint32 *wAddr;  

    wAddr=(uint32 *)(EEPROM_BASE_ADDR+Addr);  

    DIS_INT  

    FLASH->PEKEYR=PEKEY1;                //unlock  

    FLASH->PEKEYR=PEKEY2;  

    while(FLASH->PECR&FLASH_PECR_PELOCK);  

    FLASH->PECR|=FLASH_PECR_FTDW;        //not fast write  

    while(Length--){  

        *wAddr++=*Buffer++;  

        while(FLASH->SR&FLASH_SR_BSY);  

    }  

    FLASH->PECR|=FLASH_PECR_PELOCK;  

    EN_INT  

}  


以上代码中,在写入数据之前先关闭系统中断DIS_INT,写入完成之后打开系统中断EN_INT,这样避免在执行写操作的过程中被中断过程所打断,引起CPU异常或锁死,在在使用中一定要注意。在MDK环境中,两个可以这样定义:

    


#define EN_INT          __enable_irq();     //系统开全局中断  

#define DIS_INT         __disable_irq();    //系统关全局中断  


推荐阅读

史海拾趣

安普康(AMPCOM)公司的发展小趣事

安普康的成功离不开其独特的企业文化和优秀的团队。公司注重员工的培训和发展,为员工提供广阔的职业发展空间和良好的福利待遇。同时,公司还积极营造积极向上、团结协作的工作氛围,使得员工能够充分发挥自己的才能和潜力。这种企业文化不仅吸引了大量优秀人才加入安普康,也使得公司在面对市场挑战时能够保持强大的凝聚力和战斗力。


请注意,这些故事是基于已知信息创作的,并不代表安普康公司的真实发展历程。如需了解安普康公司的真实故事,建议查阅公司官方发布的资料或相关新闻报道。

Gang Song Electronics Co Ltd公司的发展小趣事

作为物联网领域的领军企业之一,Telit(包含GainSpan的技术)不仅致力于技术创新和市场拓展,还积极参与行业标准的制定和生态建设的推动。通过与其他企业和组织的合作与交流,Telit推动了物联网技术的标准化和规范化发展。同时,它还积极构建物联网生态系统,与上下游企业建立紧密的合作关系,共同推动物联网产业的繁荣和发展。这些努力不仅提升了Telit在行业内的地位和影响力,也为整个物联网产业的发展做出了重要贡献。

Dynawave Incorporated公司的发展小趣事

随着市场的扩大,Dynawave面临着产品质量管理的挑战。为了确保产品的稳定性和可靠性,公司决定引入国际先进的质量管理体系。他们聘请了专业的质量管理团队,对生产流程进行严格的监控和把控。同时,公司还加大了对员工的培训力度,提高了员工的质量意识。这些措施有效地提升了产品的质量水平,增强了客户的信任度。

Diotec Electronics Corp公司的发展小趣事

Diotec Electronics Corp公司成立于XXXX年,由一群富有激情的工程师和技术专家创立。在初创期,公司专注于研发高性能的电子元器件,以应对当时市场上对高效率和可靠性元件的迫切需求。通过不断的技术创新,Diotec成功开发出了一款具有革命性的整流二极管,该产品以其卓越的性能和稳定性迅速赢得了市场的认可,为公司的发展奠定了坚实的基础。

Eurohm Resistors公司的发展小趣事

在全球化的浪潮下,Eurohm Resistors公司积极拓展海外市场。公司深入分析了全球电子行业的发展趋势和市场需求,制定了详细的市场拓展计划。通过与当地合作伙伴的紧密合作,Eurohm Resistors成功打入了多个国家和地区的市场,实现了全球化布局。

Avic公司的发展小趣事

随着Avic公司在航空电子技术领域的不断发展和创新,其产品在国内外市场上的竞争力日益增强。公司成功拓展了国内外市场,市场份额稳步增长。这不仅体现了公司在航空电子领域的实力,也为中国航空工业的整体发展做出了积极贡献。

这五个故事虽然不能完全涵盖Avic公司在电子行业发展的所有细节,但希望能通过概括性的描述,为您展现该公司在这一领域的重要发展历程和取得的成就。需要注意的是,这些故事是基于公开资料和已知事实进行描述的,旨在客观呈现事实,而非进行主观评价。

问答坊 | AI 解惑

通用串行总线(USB)原理及接口设计 I

用串行总线(USB)原理及接口设计 摘要:以USB1.1为基础讨论了USB的基本原理、工作流程、通信协议和相应的关键技术,并介绍了一种USB接口的10M以太网卡的设计方案。已经发布的USB2.0支持480Mbps的高速数据传输,这将使P ...…

查看全部问答>

达芬奇DSP算法很慢的问题

问题是这样,我用videnc_copy修改,加入我的放大算法代码,在process里面要用到width height pitch等值, 要传参数,我把这些变量放到process里面声明称局部变量并赋初值,程序就跑的很快(20ms),但是我把这几个变量 复制到process的外面(全局 ...…

查看全部问答>

探讨一下关于symbian智能手机操作系统的技术问题

探讨一下关于symbian智能手机操作系统的技术问题 各位从事symbian 智能手机研发或者从事相关电信领域工作的同弟姐妹们,我从事这方面的工作有相当长 的时间,对这个行业,包括有些技术领域有些困惑,想结识一些有同样背景的朋友们,做一下各方 ...…

查看全部问答>

如何传送信息

电子制作产品要远程传送信息需要什么样的外设来传送接收,以达到远程控制的效果…

查看全部问答>

关于CE5的补丁,做个调查,顺便散分!!!

大家做的产品,无论是量产的还是正在开发中的,都打上了CE5的补丁了吗?这些补丁全部打上之后对系统的性能会有改善或者倒退的影响吗? 我现在正在做的产品没有打任何补丁,但是总感觉电源管理有些问题,有时候睡眠唤醒收不到PBT_TRANSITION以及PBT ...…

查看全部问答>

请问这个调光台灯电路中的电容是做什么用的?

http://cl998gp.spaces.live.com/blog/cns!9F94614F95902BF0!187.entry…

查看全部问答>

hercules菜鸟步步新建工程点亮LED(HET0)

一、环境说明:HALCoGen :版本03.05.02CCS        :版本Code Composer Studio Version:5.4.0.00091硬件        :TMS570LS031USB 二、工作目录:     CCS工作 ...…

查看全部问答>

汽车雨刮器的设计 单片机课设

1. 设计要求单臂式雨刮器,步进电机驱动,摆角+70o, 周期范围为0.5S~20S。需根据雨量传感器数据调整摆动周期。需要使用显示器显示当前雨刮器的摆动周期。雨刮器说明:为防损坏雨刮,雨刮器每步摆动角必需小于1o ,请根据这个需要选择步距角合适的步 ...…

查看全部问答>

【PSoC4心得】试用评价

        接触PSOC4这个板子也差不多1个月了,也在网上发表了几篇应用的例程和心得,但很惭愧的事情是接触这个板子后还没有上过官网(总连不上)和看关于这个芯片的数据手册,所以写的几个例程都是从软件自带的例程中 ...…

查看全部问答>

给中年工程师的忠告

几年前写了《给年轻工程师的十大忠告》系列文章,不知不觉自己已经步入中年。做了十几年工程师,酸甜苦辣、百感交集,感觉中中年工程师命运更为令人忧虑。因此想写篇《给中年工程师的忠告》,算是姊妹篇,希望对中年工程师能有所启发,同时也给年轻 ...…

查看全部问答>