STM32L系列单片机内部EEPROM的读写

发布者:炫酷骑士最新更新时间:2017-01-18 来源: eefocus关键字:STM32L系列  单片机  内部EEPROM 手机看文章 扫描二维码
随时随地手机看文章

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

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

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

 

  1. #define EEPROM_BASE_ADDR    0x08080000     

  2. #define EEPROM_BYTE_SIZE    0x0FFF  

#define EEPROM_BASE_ADDR	0x08080000	
#define EEPROM_BYTE_SIZE	0x0FFF

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

 

    

  1. /*------------------------------------------------------------ 

  2.  Func: EEPROM数据按字节读出 

  3.  Note: 

  4. -------------------------------------------------------------*/  

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

  6. {  

  7.     uint8 *wAddr;  

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

  9.     while(Length--){  

  10.         *Buffer++=*wAddr++;  

  11.     }     

  12. }  

/*------------------------------------------------------------
 Func: EEPROM数据按字节读出
 Note:
-------------------------------------------------------------*/
void EEPROM_ReadBytes(uint16 Addr,uint8 *Buffer,uint16 Length)
{
	uint8 *wAddr;
	wAddr=(uint8 *)(EEPROM_BASE_ADDR+Addr);
	while(Length--){
		*Buffer++=*wAddr++;
	}	
}

    

  1. /*------------------------------------------------------------ 

  2.  Func: EEPROM数据读出 

  3.  Note: 

  4. -------------------------------------------------------------*/  

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

  6. {  

  7.     uint32 *wAddr;  

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

  9.     while(Length--){  

  10.         *Buffer++=*wAddr++;  

  11.     }     

  12. }  

/*------------------------------------------------------------
 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进行加锁,以保护数据。

 

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

    

  1. #define PEKEY1  0x89ABCDEF      //FLASH_PEKEYR   

  2. #define PEKEY2  0x02030405      //FLASH_PEKEYR  

#define PEKEY1	0x89ABCDEF		//FLASH_PEKEYR
#define PEKEY2	0x02030405		//FLASH_PEKEYR

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

 

 

  1. /*------------------------------------------------------------ 

  2.  Func: EEPROM数据按字节写入 

  3.  Note: 

  4. -------------------------------------------------------------*/  

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

  6. {  

  7.     uint8 *wAddr;  

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

  9.     DIS_INT  

  10.     FLASH->PEKEYR=PEKEY1;                //unlock   

  11.     FLASH->PEKEYR=PEKEY2;  

  12.     while(FLASH->PECR&FLASH_PECR_PELOCK);  

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

  14.     while(Length--){  

  15.         *wAddr++=*Buffer++;  

  16.         while(FLASH->SR&FLASH_SR_BSY);  

  17.     }  

  18.     FLASH->PECR|=FLASH_PECR_PELOCK;  

  19.     EN_INT  

  20. }  

/*------------------------------------------------------------
 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
}

    

  1. /*------------------------------------------------------------ 

  2.  Func: EEPROM数据按字写入 

  3.  Note: 字当半字用 

  4. -------------------------------------------------------------*/  

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

  6. {  

  7.     uint32 *wAddr;  

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

  9.     DIS_INT  

  10.     FLASH->PEKEYR=PEKEY1;                //unlock   

  11.     FLASH->PEKEYR=PEKEY2;  

  12.     while(FLASH->PECR&FLASH_PECR_PELOCK);  

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

  14.     while(Length--){  

  15.         *wAddr++=*Buffer++;  

  16.         while(FLASH->SR&FLASH_SR_BSY);  

  17.     }  

  18.     FLASH->PECR|=FLASH_PECR_PELOCK;  

  19.     EN_INT  

  20. }  

/*------------------------------------------------------------
 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环境中,两个可以这样定义:

 

    

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

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


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

上一篇:STM32下载方法
下一篇:基于MDK-ARM创建STM32L-DISCOVERY Project

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

51单片机,C语言编程,控制指示灯闪烁的频率
c51单片机,c语言编程,关于指示灯定时闪烁的。 P1.0 P1.1 P1.2 P1.3上面各接有一个指示灯,P2.0接一个外接按键。 要求: 按一下按键P1.0以1Hz的频率闪烁 半周期为500ms 第二次按下按键P1.1以2Hz的频率闪烁 半周期为250ms 第三次按下按键P1.2以3Hz的频率闪烁 半周期为165ms 第四次按下按键P1.3以4Hz的频率闪烁 半周期为125ms 第五次按下按键P1.0以1Hz的频率闪烁 半周期为500ms 如此循环。 单片机外接6MHz晶振,如何写这个程序? 悬赏分:30 本程序有实用价值,在不同的工作状态,以不同的速度闪烁,可表现出不同的紧急程度。 系统的晶振是6MHz,则机器周
[单片机]
51<font color='red'>单片机</font>,C语言编程,控制指示灯闪烁的频率
基于单片机的步进电机控制系统设计
单片机实现的步进电机控制系统具有成本低、使用灵活的特点,广泛应用于数控机床、机器人,定量进给、工业自动控制以及各种可控的有定位要求的机械工具等应用领域。步进电机是数字控制电机,将脉冲信号转换成角位移,电机的转速、停止的位置取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,非超载状态下,根据上述线性关系,再加上步进电机只有周期性误差而无累积误差,因此步进电机适用于单片机控制。步进电机通过输入脉冲信号进行控制,即电机的总转动角度由输入脉冲总数决定,而电机的转速由脉冲信号频率决定。步进电机的驱动电路是根据单片机产生的控制信号进行工作。因此,单片机通过向步进电机驱动电路发送控制信号就能实现对步进电机的控制。 1 系统设计原理
[工业控制]
单片机直流电源控制板设计
 引 言   多单片机直流电源控制板包括A/ D 采集与转换、测量、显示、同步、自动相序判定、移相触发、过流/ 过压保护、缺相检测等部分,与整流变压器,蓄电池,仪表等部件一起构成成套装置。装置有充电、稳流、稳压等工作方式,可供发电厂,变电站,医院,工厂等部门用作控制,操作或照明的直流电源。多单片机电源控制系统硬件电路简单清晰,数字触发脉冲精度高,系统调节速度快、性能指标和可靠性高。   1 系统结构   1. 1 整流变压器及主电路   整流变压器及主电路的电路如图1 所示。多单片机直流电源控制系统的变流主电路是三相桥式全控整流电路,整流变压器一次侧控制保护器件有继电器、控制开关、熔断器、电源指示灯等,一次侧接38
[电源管理]
多<font color='red'>单片机</font>直流电源控制板设计
采用MSP430单片机与DTMF技术设计医院呼叫对讲系统设计
随着科学技术的迅速发展,尤其是电子信息技术的不断更新,医疗卫生事业也逐步深化改革,实现现代化医疗成为医院未来发展的趋势,医院呼叫对讲系统是提高医院的护理水平的重要设备之一,其基本功能就是通过一种简便的途径使护理对象与医护人员达成沟通。16位的MSP430单片机的集成度很高,片内资源丰富,主要的突出特点是低功耗,可以实现长时间的稳定工作,应用到该系统后,性能得到很好的优化,可以提高医护人员的工作效率和降低他们的劳动强度,病人也能得到及时的护理和医疗,可以显着提高医院的服务水平和医疗质量。 1 DTMF呼叫对讲系统介绍 1.1 DTMF技术的介绍 DTMF(Dual Tone Multi Frequency ),即双音
[单片机]
采用MSP430<font color='red'>单片机</font>与DTMF技术设计医院呼叫对讲系统设计
25-基于51单片机的温湿度检测及调节系统
具体实现功能 系统由STC89C52单片机+AT24c02芯片+LCD1602液晶显示屏+继电器模块+按键模块+报警模块构成。 具体实现功能: 1、LCD1602液晶显示,第一行显示当前的温度和湿度,第二行显示相应的冷、热、干、湿; 2、AT24c02芯片掉电存储设置的上下限; 3、四个按键为设置、加、减、确定,实现了温湿度范围的调节; 4、采用温湿度传感器DHT11,温度测量范围0℃--50℃,湿度测量范围20%RH—90%RH; 5、当超过温湿度设置范围时,蜂鸣器响起,相应指示灯闪烁以报警; 6、当温度或湿度超过范围后,报警信号灯点亮同时相应的继电器吸合。 设计背景 温度、湿度和人类的生产、生活
[单片机]
25-基于51<font color='red'>单片机</font>的温湿度检测及调节系统
瑞萨电子宣布完成适用于系统平台开发的安全微控制器系列
瑞萨电子一体化安全MCU:RH850/P1L-C 2016年12月15日,日本东京讯——全球领先的先进半导体解决方案供应商瑞萨电子株式会社(TSE:6723)今日宣布推出四款新型RH850/P1L-C系列微控制器(MCU)。RH850/P1L-C系列芯片设计用于底盘和安全系统,如ABS防抱死制动器,安全气囊系统以及紧凑型电机控制系统。RH850/P1L-C属于 RH850/P1x-C安全系列MCU的低端产品,可一站式满足先进驾驶辅助系统(ADAS)的要求。 随着人们不断努力实现车辆自动驾驶的梦想,驾驶辅助系统的复杂性和性能日益增加,因此,协调与其它车辆控制单元的控制变得至关重要。对底盘系统来说,与ADAS协调的需求促使来自
[汽车电子]
瑞萨电子宣布完成适用于系统平台开发的安全<font color='red'>微控制器</font><font color='red'>系列</font>
51单片机RS485通讯程序仿真与MODBUS RTU静止时间详解
仿真原理图如下 由于MODBUS-RTU 要求每帧信息中的数据间隔时间不得超过1.5字符的静止时间。 因此: (1)、当串口产生接收中断后,立即重装“超时定时器”的初始值。(注:超时定时器的初始值和波特率有关) 问题如下:  (a)、由于要求在串口接收中断中重装超时定时器初始值,那么,该超时定时器就只能采用“溢出模式”,而不能采用“CTC模式” (b)、超时定时器必须在程序初始化时就一直开启。 我的理解对吗? (2)两帧之间的3.5字符的静止时间该如何实现呢? 接收到每个字节的时候,初始化定时器就行,最后一个字节后,定时器就溢出了 利用单独的软件定时器,来判断一帧接收报文结束,可以防止若报文接收不完整,该帧通信任务无
[单片机]
51<font color='red'>单片机</font>RS485通讯程序仿真与MODBUS RTU静止时间详解
MCX A:新的通用MCU和资源丰富的FRDM开发平台
恩智浦正式发布MCX A14x和A15x系列“通用”微控制器。MCX A隶属于MCX产品组合,基于Arm® Cortex®-M33内核平台。 MCX的理念是将主流恩智浦器件的卓越特色与创新功能结合起来,打造下一代智能边缘设备 。 可扩展性是MCX产品组合的一个重要优势。MCX A系列在该产品组合中发挥着重要作用,是各类应用的基础。它面向多个市场的广泛应用,包括: 工业通信 智能计量 自动化与控制 传感器 低功耗/电池供电设备 MCX A14x的工作频率为48MHz,MCX A15x的工作频率为96MHz。器件的封装选项包括32引脚QFN、48引脚QFN和64引脚LQFP。MCX A器件的所有封装类型在IO
[单片机]
MCX A:新的通用<font color='red'>MCU</font>和资源丰富的FRDM开发平台
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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