STC32G 单片机EEPROM 操作实例

本文详细介绍了STC32G系列单片机内置的EEPROM特性,包括容量、写操作规则、扇区划分和操作流程。并提供了自定义的库函数,简化了与EEPROM的交互,便于程序开发。通过实际程序演示了数据的写入、读取和验证过程。

一  STC32G 单片机EEPROM简介

STC32G系列单片机内部集成了大量的EEPROM,特别是STC32G12K128集成多达128K EEPROM。

STC32G内部EEPROM可擦写10万次,分若干扇区,每个扇区512字节。EEPROM的写操作只能将1写为0。要将0写为1,必须擦除扇区。EEPROM的读写是以字节为单位,擦除是以扇区为单位进行,要修改扇区内容,需要先将整个扇区内容读入内存,然后擦除整个扇区,然后再将内容写入扇区。STC32G的EEPROM操作时间与系统频率相关,设置好IAP_TPS寄存器值后,操作所需时间由硬件自动控制,IAP_TPS寄存器值 = 系统频率 / 1000000,如系统频率是30MHz,IAP_TPS寄存器值设为30.

与EEPROM相关的寄存器如下:

 STC32G12K128的数据寄存器,仅IAP_DATA有效。

操作EEPROM的命令如下:

 STC32G系列单片机仅支持命令CMD0~CMD3.

要操作STC32G EEPROM必须将IAP_CONTR寄存器的IAPEN设为1.在设置完操作地址与操心命令后必须分别向IAP_TRIG分别写入0x5A、0xA5,才能使命令生效。

二 与STC32G 单片机EEPROM 操作相关库函数的编写

EEPROM 的操作离不开操作与EEPROM相关的寄存器,如果不写相关的库函数,每次都直接去写操作寄存器的代码,非常麻烦,且工作量大,我们先写好库函数,后面要用时,调用即可,就会省去很多麻烦,提高效率。下面是我写的库函数。先看下头文件。

/*STC32G_EEPROM.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 07/18/2022
//////////////////////////macro function/////////////////////////////////////
IAP_STANDBY(); 																					//idle,no operation command
IAP_READ();																							//read command
IAP_WRITE();																						//write command
IAP_ERASE();																						//erase section command
IAP_ENABLE();																						//IAP operation enable
IAP_DISABLE();																					//IAP operation disable

//////////////////////////Function////////////////////////////////////////////
EEPROM_Disable();																			 									//Set eeprom operating disable, return void
EEPROM_Trig();																				 									//set INT state,then send eeprom operating trigger signal, resore INT state,return void
EEPROM_SectorErase(u32 EE_address);                    									//erase EEPROM section, return void
EEPROM_Read_nChar(ui32 EE_address,ui8* destData, u16 number);						//read n char from eeprom begine from EE_address,return void
EEPROM_Write_nChar(u32 EE_address,ui8* sourceData,u16 number);				  //write n char to eeprom begine from EE_address, return void
EEPROM_Write_Integer(u32 EE_address,i16 sourceData);										//write integer to eeprom begine from EE_address, return void	
EEPROM_Write_Long(u32 EE_address,i32 sourceData);												//write long to eeprom begine from EE_address, return void	
EEPROM_Write_Float(u32 EE_address,f32 sourceData);											//write float to eeprom begine from EE_address,return void	
EEPROM_Write_Double(u32 EE_address,f64 sourceData);											//write double to eeprom begine from EE_address,return void	
EEPROM_Write_String(u32 EE_address,char* sourceStr);										//read string from eeprom begine from EE_address, return void
EEPROM_Read_Integer(u32 EE_address,i16* destData);											//read integer from eeprom begine from EE_address,return i16
EEPROM_Read_Long(u32 EE_address,i32* destData);													//read long from eeprom begine from EE_address, return i32
EEPROM_Read_Float(u32 EE_address,f32* destData);												//ead float from eeprom begine from EE_address,return f32
EEPROM_Read_Double(u32 EE_address,f64* destData);												//read double from eeprom begine from EE_address, return f64
EEPROM_Read_String(u32 EE_address,char* str);														//read string from eeprom begine from EE_address,return void
EEPROM_Read_StringnChar(u32 EE_address,char* str, ui16 number);					//read string n char from eeprom begine from EE_address, return void

*/

#ifndef	__STC32G_EEPROM_H
#define	__STC32G_EEPROM_H

#include	"config.h"
#include "mtype.h"
#include <STC32G.h>

#define		IAP_STANDBY()	{IAP_CMD = 0x00;}		//idle,no operation command
#define		IAP_READ()		{IAP_CMD = 0x01;}		//read command
#define		IAP_WRITE()		{IAP_CMD = 0x02;}		//write command
#define		IAP_ERASE()		{IAP_CMD = 0x03;}		//erase section command
#define	IAP_ENABLE()		{IAPEN = 1; IAP_TPS = FO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bill66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值