STM8S学习05——EEPROM读写操作C语言程序

发布者:科技小巨人最新更新时间:2019-09-16 来源: eefocus关键字:STM8S  EEPROM  读写操作 手机看文章 扫描二维码
随时随地手机看文章

/*

这两天项目开发中,用到STM8的EEPROM功能,几个数据要掉电保存,在网上也查了一下EEPROM操作,发现网上出现的问题主要有两点:

1、EEPROM读写不成功;

2、EEPROM读写的时间太长;


看了一下ST的库函数,自己测试了一下,没有发现什么问题,比较正常;在读写EEPROM期间,也有动态扫描LED数码管,没有发现数码管有闪烁。


操作过程中:

1、开发平台:STM8S105K4T6 IAR6.3 ST库版本 V2.1.0

2、操作EEPROM,使用到的库函数:

  FLASH_Unlock(FLASH_MEMTYPE_DATA);

  while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);

  FLASH_ProgramByte(FLASH_DATA_START_PHYSICAL_ADDRESS + dLocal_Addr,dLocal_Data);

  FLASH_Lock(FLASH_MEMTYPE_DATA);

  FLASH_ReadByte(FLASH_DATA_START_PHYSICAL_ADDRESS + dLocal_Addr)

3、自己封装了3个函数:测试通过

       void MEEPROM_Init(void);//用于第一次上电及上电初始化

       void MEEPROM_WriteByte(u16 dLocal_Addr,BYTE dLocal_Data);//写一个数据到EEPROM中

       BYTE MEEPROM_ReadByte(u16 dLocal_Addr);//从EEPROM中,读取一个字节的数据

4、整个函数包:一个头文件,一个.C函数体文件

*/



/********************** 系统变量及头文件 *********************************/

#ifndef __A20_EEPROM_CON_H

#define __A20_EEPROM_CON_H



//--EEPROM中存储数据地址的分配----------------------------------------

#define MACOR_EEADDR_SYSINT     0

#define MACOR_EEADDR_DIPMODE    1



void MEEPROM_Init(void);

void MEEPROM_WriteByte(u16 dLocal_Addr,BYTE dLocal_Data);

BYTE MEEPROM_ReadByte(u16 dLocal_Addr);


#endif


/**********************

STM8内部EEPROM读写程序

***********************/

#include "stm8s.h"

#include "A00_main.h"



/********************************************************************

****1.EEPROM数据初始化

*********************************************************************/

void MEEPROM_Init(void)

{

  BYTE dLocal_1;

  FLASH_DeInit();

  dLocal_1 = MEEPROM_ReadByte(MACOR_EEADDR_SYSINT);

  if(dLocal_1 == 0xAA) //EEPROM区有初始化

  {

//时钟显示模式相关初始化

dSYS_DipMode = MEEPROM_ReadByte(MACOR_EEADDR_DIPMODE);

if(dSYS_DipMode == 1) //进入动态显示

{

 dClock_RollNUM = 0;

 dClock_RollTmr = 0;

 str_SysClock.dClock_SetBit = 0;

 MClock_Sec_Dot_OnOff(DISABLE);

    }

else //进入时分显示

{

 MClock_Sec_Dot_OnOff(ENABLE);

 str_SysClock.dClock_SetBit = 3;

    }

  }

  else //初次上电,EEPROM区需要初始化

  {

    //时钟显示模式相关初始化

dSYS_DipMode = 0;

    MClock_Sec_Dot_OnOff(ENABLE);

    str_SysClock.dClock_SetBit = 3;



    MEEPROM_WriteByte(MACOR_EEADDR_SYSINT,0xAA);

    MEEPROM_WriteByte(MACOR_EEADDR_DIPMODE,dSYS_DipMode);

  }

  return;

}



/*******************************************************************************

****2.EEPROM中写入一个字节

****  dLocal_Addr:EEPROM中的地址,从0开始,在函数写时,加入了初始地址 FLASH_DATA_START_PHYSICAL_ADDRESS

****              当前EEPROM空间为:0x4000--0x43FF;该参量的取值范围:0 - 0x3FF

****  dLocal_Data:要写入EEPOM中的数据

*******************************************************************************/

void MEEPROM_WriteByte(u16 dLocal_Addr,BYTE dLocal_Data)

{

  FLASH_Unlock(FLASH_MEMTYPE_DATA);

  while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);

  FLASH_ProgramByte(FLASH_DATA_START_PHYSICAL_ADDRESS + dLocal_Addr,dLocal_Data);

  FLASH_Lock(FLASH_MEMTYPE_DATA);

  return;

}

/*******************************************************************************

****3.从EEPROM中读取一个字节

****  dLocal_Addr:EEPROM中的地址,从0开始,在函数写时,加入了初始地址 FLASH_DATA_START_PHYSICAL_ADDRESS

****              当前EEPROM空间为:0x4000--0x43FF;该参量的取值范围:0 - 0x3FF

*******************************************************************************/

BYTE MEEPROM_ReadByte(u16 dLocal_Addr){

    BYTE dLocal_1;

    dLocal_1 = FLASH_ReadByte(FLASH_DATA_START_PHYSICAL_ADDRESS + dLocal_Addr);

    return dLocal_1;

}

关键字:STM8S  EEPROM  读写操作 引用地址:STM8S学习05——EEPROM读写操作C语言程序

上一篇:STM8S学习04——网关学习
下一篇:STM8S学习02——ADC

推荐阅读最新更新时间:2024-11-09 14:23

51单片机学习:I2C-EEPROM实验
实验名称:I2C-EEPROM实验 接线说明: 实验现象:下载程序后,数码管右4位显示0,按K1键将数据写入到EEPROM内保存, 按K2键读取EEPROM内保存的数据,按K3键显示数据加1,按K4键显示数据清零, 最大能写入的数据是255。 注意事项: ***************************************************************************************/ #include public.h #include 24c02.h #include key.h #include smg.h #define EEPROM_ADDRESS 0 //定义数据存入EEP
[单片机]
STM8S 定时器第一次使用时间不准确的问题
以前用定时器只是提供系统的5ms时基,并没有发现问题,最近做红外遥控器的解码,发现启动定时器TIM2后,第一次总是时间没到就触发中断了,之后也都正常了,也就是说问题出在刚配置好第一次使用的时候 由手册得知,定时器的预分频器PSCR并不是立即生效的,只有触发一次中断事件后,才会写入设定的分频值,系统也提供了EGR寄存器的UG位来主动软件触发中断事件,可以用来解决这个问题
[单片机]
<font color='red'>STM8S</font> 定时器第一次使用时间不准确的问题
STM8S定时器操作
综述 STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的 架构 。此共同的架构使得采用各个定时器设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。 本文只针对STM8S103该芯片进行介绍,该芯片的定时器个数为3个,每个类型的定时器都一个,分别为高级控制型(TIM1)、通用型(TIM2)、基本型定时器(TIM4)。 关于STM8S103手册的TIM简介 每个定时器的功能都有详细介绍,大家可以认真看下。 TIMx详细讲解 3.1 TIM1解析 TIM1_Prescaler    :即预分
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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