STM32单片机内部EEPROM的读写

发布者:Ziyu2022最新更新时间:2018-07-17 来源: eefocus关键字:STM32  单片机  内部EEPROM  读写 手机看文章 扫描二维码
随时随地手机看文章

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();    //系统关全局中断  


关键字:STM32  单片机  内部EEPROM  读写 引用地址:STM32单片机内部EEPROM的读写

上一篇:STM32系统学习——I2C (读写EEPROM)
下一篇:stm32 片上flash用作EEPROM(掉电保存)

推荐阅读最新更新时间:2024-03-16 16:09

STC单片机串口硬件电路的设计
51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。 方案一 分立元件 方案二 集成芯片
[单片机]
STM32学习笔记二:什么是寄存器
芯片架构简图 芯片(这里指内核,或者叫 CPU)和外设之间通过各种总线连接,其中驱动单元有 4个,被动单元也有 4 个。为了方便理解,我们都可以把驱动单元理解成是CPU 部分,被动单元都理解成外设。 系统框图 1、ICode总线:ICode 中的 I 表示 Instruction,即指令。我们写好的程序编译之后都是一条条指令,存放在 FLASH 中,内核要读取这些指令来执行程序就必须通过 ICode 总线,它几乎每时每刻都需要被使用,它是专门用来取指的。 2、驱动单元: (1)DCode 总线:DCode 中的 D 表示 Data,即数据,那说明这条总线是用来取数的。我们在写程序的时候,数据有常量和变量两种,常量就是固
[单片机]
<font color='red'>STM32</font>学习笔记二:什么是寄存器
手持式RFID读写器网络接口设计
  摘要:为适应RFID 读写器在不同应用系统中的要求,开发了一种以MSP430F149 单片机为核心的具有嵌入式以太网网络接口的手持式RFID 读写器。文中介绍RFID 读写器中单片机与以太网控制器RTL8139 组成的网络接口设计方法,实现了手持式RFID 读写器接入Internet 网络进行数据通信。   RFID 技术目前广泛应用于身份识别、防伪应用、供应链应用、公共交通管理、物流管理、生产线自动化与过程控制、容器识别等领域。由于手持式RFID读写器的存储器容量有限,保存在读写器中的数据可以通过USB 等接口传送到计算机中进行处理,但为更方便快捷地将读写器中的数据传送到远程的计算机系统中,将便携设备网络化是解决上述问题
[单片机]
手持式RFID<font color='red'>读写</font>器网络接口设计
8051单片机程序存储器27128所点的地址空间
写出下列图中8051单片机的4片程序存储器27128各自所占的地址空间。 图片1 图片1 答案: (1)0000H~3FFFH (2)4000H~7FFFH (3)8000H~BFFFH (4)C000H~FFFFH
[单片机]
8051<font color='red'>单片机</font>程序存储器27128所点的地址空间
基于单片机的磁致伸缩位移传感器的应用
引言 磁致伸缩位移传感器是根据磁致伸缩原理制造的高精度、长行程绝对位置测量的位移传感器。它采用非接触的测量方式,由于测量用的活动磁环和传感器自身并无直接接触,不至于被磨擦、磨损,因而其使用寿命长、环境适应能力强,可靠性高,安全性好,便于系统 自动化 工作,即使在恶劣的工业环境下(如容易受油溃、尘埃或其他的污染场合),也能正常工作。此外,它还能承受高温、高压和强振动,现已被广泛应用于机械位移的测量、控制中,但这种测量方法存在一些不足之处:①模拟信号抗干扰能力有限,不能远距离传输;②由于电路转换引入噪声,使其测量精度不高;③信号互换性差,还需要昂贵的A/D互换设备等。利用单片机及其外围电路进行较好的处理,实现了多点高精度测量,并
[传感器]
基于<font color='red'>单片机</font>的磁致伸缩位移传感器的应用
STM32应用-简单的串口接收与发送程序
简介:与上位机的串口通信是一个很常用的程序。碧海蓝天在刚刚接触stm32芯片时写的第一个简单程序就是串口通信,现在把程序代码甩出来与大家分享。完整的程序哦。 库版本 :ST3.0.0 文件:mian.c //功能:串口初始化、打开定时器中断,然后一直接收数据状态就好了。发送在中断中实现 #include stm32f10x.h #include usart.h u8 USART_rx_data; int main(void) { RCC_Configuration(); //系统时钟配置 GPIO_Configuration(); //端口初始化 NVIC_Configuration();
[单片机]
如何正规的画一个STM32单片机的原理图
关于STM32F1系列单片机的一个常识: 看上图得知,根据Flash存储器的大小,把STM32F1分为了4种类型,分别是“低密度”“中密度”“高密度”“超高密度”,然后还有一种“互联型”。我们使用的STM32F103VET6的FLASH大小是512K,所以属于“高密度”型的。 我们这次要做的,就是把单片机STM32F103VET6的原理图画出来。 画的时候,要看STM32F103的datasheet。这个datasheet可以在ST的官网上找到。记住,是数据手册,不是参考手册。ST的官网是支持中文的,方便英文不好的朋友浏览。 打开ST的官方网站,看上图第一个红色矩形框里面的路径,依次到这一页。然后点击“数据手册”: 文
[单片机]
如何正规的画一个<font color='red'>STM32</font><font color='red'>单片机</font>的原理图
单片机实现SRAM工艺FPGA的加密应用
摘要:首先对采用SRAM工艺的FPGA的保密性和加密方法进行原理分析,然后提出一种实用的采用单片机产生长伪随机码实现加密的方法,并详细介绍具体的电路和程序。 关键词:静态随机存储器(SRAM) 现场可编程门阵列(FPGA) 加密 在现代电子系统设计中,由于可编程逻辑器件的卓越性能、灵活方便的可升级特性,而得到了广泛的应用。由于大规模高密度可编程逻辑器件多采用SRAM工艺,要求每次上电,对FPGA器件进行重配置,这就使得可以通过监视配置的位数据流,进行克隆设计。因此,在关键、核心设备中,必须采用加密技术保护设计者的知识产权。 1 基于SRAM工艺FPGA的保密性问题 通常,采用SRAM工艺的FPGA芯片的的配置方法主要
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved