一 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

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


被折叠的 条评论
为什么被折叠?



