STM8内部EEPROM的使用详解

发布者:vnerwb池塘边最新更新时间:2021-08-31 来源: eefocus关键字:STM8  内部EEPROM  内存映射 手机看文章 扫描二维码
随时随地手机看文章

1 内存映射

STM8S105集成了多达1K的EEPROM(掉电数据不会丢失)最高可以支持30万次的擦写次数,用户可以将一些数据保存在EEPROM中,具体的memory map如下图所示;

在这里内存一页的大小为64 bytes(1 block), DATA EEPROM的内存地址映射如下图所示;


可以看到,EEPROM的起始地址为0x004000,结束地址为0x00427F,这个在下面编程时会用到,当然具体的大小会因为型号不同而有所差异;

2 程序实现

下面程序基于stm8的标准库,进行实现,相应标准库可以在st官网上下载得到;


eeprom_inner.ch


#ifndef EEPROM_INNER_H

#define EEPROM_INNER_H


#include "stm8s.h"


#define EEPROM_BASE_ADDR    0x4000

#define EEPROM_SIZE         0x07FF


union data32_unit_mod {


  uint32_t data32;

  uint8_t  buf[4];

};


typedef union data32_unit_mod data32_unit_mod_t;


union data16_unit_mod {


  uint16_t data16;

  uint8_t  buf[2];

};

typedef union data16_unit_mod data16_unit_mod_t;


/**

    外部函数声明

*/

void eeprom_init(void);

uint8_t eeprom_read_byte(uint16_t addr);

void eeprom_write_byte(uint16_t addr,uint8_t data);


void eeprom_write_data32(uint16_t offset, uint32_t data);

void eeprom_write_data16(uint16_t offset, uint16_t data);

void eeprom_write_data8(uint16_t offset, uint8_t data);


uint32_t eeprom_read_data32(uint16_t offset);

uint16_t eeprom_read_data16(uint16_t offset);

uint8_t eeprom_read_data8(uint16_t offset);


void eeprom_area_clear(void);


#endif


eeprom_inner.c


#include "eeprom_inner.h"

#include "stm8s_clk.h"

#include "stm8s_flash.h"


void eeprom_init(void)

{

    FLASH_DeInit();

    FLASH_Unlock(FLASH_MEMTYPE_DATA);//EEPROM

    FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_TPROG); 

}


inline uint8_t eeprom_read_byte(uint16_t addr)

{    

    return FLASH_ReadByte(addr);

}


inline void eeprom_write_byte(uint16_t addr,uint8_t data)

{

    FLASH_Unlock(FLASH_MEMTYPE_DATA);

    FLASH_ProgramByte(addr, data);

    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

    FLASH_Lock(FLASH_MEMTYPE_DATA);

}


void eeprom_write_data32(uint16_t offset, uint32_t data){

    

    data32_unit_mod_t tmp;

    tmp.data32 = data;

    if(offset+4 > EEPROM_SIZE){

        //error

        return;

    }

    eeprom_write_byte(EEPROM_BASE_ADDR+offset,  tmp.buf[0]);

    eeprom_write_byte(EEPROM_BASE_ADDR+offset+1,tmp.buf[1]);

    eeprom_write_byte(EEPROM_BASE_ADDR+offset+2,tmp.buf[2]);

    eeprom_write_byte(EEPROM_BASE_ADDR+offset+3,tmp.buf[3]);

}


void eeprom_write_data16(uint16_t offset, uint16_t data){

    

    data16_unit_mod_t tmp;

    tmp.data16 = data;

    if(offset+2 > EEPROM_SIZE){

        //error

        return;

    }

    eeprom_write_byte(EEPROM_BASE_ADDR+offset,  tmp.buf[0]);

    eeprom_write_byte(EEPROM_BASE_ADDR+offset+1,tmp.buf[1]);

}


void eeprom_write_data8(uint16_t offset, uint8_t data){

    

    if(offset+1 > EEPROM_SIZE){

        //error

        return;

    }

    eeprom_write_byte(EEPROM_BASE_ADDR+offset,  data);

}


uint32_t eeprom_read_data32(uint16_t offset){

    

    data32_unit_mod_t tmp;

    if(offset+4 > EEPROM_SIZE){

        //error

        return 0xEEEEEEEE;

    }


    tmp.buf[0] = eeprom_read_byte(EEPROM_BASE_ADDR+offset);

    tmp.buf[1] = eeprom_read_byte(EEPROM_BASE_ADDR+offset+1);

    tmp.buf[2] = eeprom_read_byte(EEPROM_BASE_ADDR+offset+2);

    tmp.buf[3] = eeprom_read_byte(EEPROM_BASE_ADDR+offset+3);

    

    return tmp.data32;

}


uint16_t eeprom_read_data16(uint16_t offset){

    

    data16_unit_mod_t tmp;

    if(offset+2 > EEPROM_SIZE){

        //error

        return 0xEEEE;

    }

    tmp.buf[0] = eeprom_read_byte(EEPROM_BASE_ADDR+offset);

    tmp.buf[1] = eeprom_read_byte(EEPROM_BASE_ADDR+offset+1);

    

    return tmp.data16;

}


uint8_t eeprom_read_data8(uint16_t offset){


    if(offset+1 > EEPROM_SIZE){

        //error

        return 0xEE;

    }

    

    return eeprom_read_byte(EEPROM_BASE_ADDR+offset);

}


void eeprom_area_clear(void){


    uint16_t index = 0;

    for( ; index < EEPROM_SIZE; index+=2 ){

        eeprom_write_data16(index,0xFFFF);

    }

}

关键字:STM8  内部EEPROM  内存映射 引用地址:STM8内部EEPROM的使用详解

上一篇:飞思卡尔MC9S12系列单片机地址影射以及分页问题
下一篇:【STM8S】 FLASH与EEPROM读写操作

推荐阅读最新更新时间:2024-11-04 15:02

**解决STLINK V2烧过JLINK OB,恢复后不能识别STM8**
我手上的stlink v2是在正点原子那买开发板一块买的,这个是他们自己做的,不和官方的完全一样,实际使用时不能识别STM32L4系列的片子,后来发现拆机刷成JLINK OB的可以用了,但只能在ST家芯片上用SWD模式,速度4mhz,完全够用了;刷成CMSIS-DAP也可以用,还可以支持其他家的ARM,速度低些只有1mhz。指示灯好像都不正常,但这都不是事 后来有项目用STM8S的片子,这个只能用SWIM口调试,所以准备刷回来,看到有官方的恢复软件“STLinkReflash.exe”,所以没拆机(问题就在这),刷了后在stm32上一切正常,但是就是不识别STM8的片子,通过官方软件“ST-LinkUpgrade.exe”升级固
[单片机]
**解决STLINK V2烧过JLINK OB,恢复后不能识别<font color='red'>STM8</font>**
新版IAR调试查看寄存器问题 STM8代码大小优化问题
今天写两个后台问的较多的问题,如标题所示: 1.新版IAR调试查看寄存器问题; 2.STM8代码大小优化问题; 1新版IAR调试查看寄存器问题 从去年上半年开始,IAR将各开发环境逐渐进行了大升级,首先是将EWARM从V7升级到了V8。然后,陆续将EW430、EWAVR等进行了升级。 什么是新版IAR?图标是黑色那种,如EWARM V8.2、 EWSTM8 V3.1。如下图: 老版本IAR,扳手工具图标。如下图: 许多小伙伴安装了新版的IAR,不管是EWARM、EW430还是EWSTM8,都出现了一个问题:调试时,“不能”查看外设寄存器了。 如下面动画,查看了各主菜单,以及View视图各个子菜单,都没有
[单片机]
新版IAR调试查看寄存器问题 <font color='red'>STM8</font>代码大小优化问题
stm8用ST-Link下载时出现Connection error
错误信息:Connection error (usb://usb): gdi-error : can't access configuration database 解决办法: win7解决方法:重新安装Program Files (x86)/STMicroelectronics/st_toolset/stvd/dao/ST Toolset.msi 在管理员权限下安装 在百度知道上找到的解决方案:http://zhidao.baidu.com/link?url=_ft7AOwaWeKLK2bQNO76lP9g9L7PzLeIItpb-aJ_kkZ132KMvtKdhXQLPHQSNsNFxlpMDUNjGeMA9a
[单片机]
一个关于STM8中断应用异常的话题
某日一工程师跟我反映,他在使用STM8S芯片开发产品,用到某ADC通道,使用连续采集模式,开启ADC转换结束中断。整个中断程序执行时间大概200多us,因为连续采集转换,在这个ISR处理过程中可能会有新的EOC标志产生。 他发现一个奇怪的现象,ADC中断服务程序能够不停的自己嵌套自己,仿佛进入了递归嵌套,最后导致堆栈溢出跑飞而令系统复位。在调试过程中也的确能发现ADC中断服务程序有连续多次入栈的情况。 后来他发现这个异常跟在ADC ISR中首尾分别加了一句关中断和开中断语句有关。即在ISR的开头加了disableInterrupt(); ISR结尾部分加了 enableInterrupt(); 如果拿掉首尾那2句开关
[单片机]
一个关于<font color='red'>STM8</font>中断应用异常的话题
STM8S单片机的内部eeprom编程
简介:STM8S单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。EEPROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。 当然如果有外部EEPROM,自然是不会使用到内部的EEPROM的。但小东西也有大用途,例如做无线应用时,减少成本的情况下,还能保存一些特定设置,如:休眠时间,工作频率,输出功率,密码等。 EEPROM的3种编程模式: l字节编程(没有擦除操作) 可对EEPROM的数据区域进行逐字地编程。应用程序直接向目标地址写入数据。 l字编程 EEPROM允许字
[单片机]
基于STM8的IIC协议--协议篇
1. 综述   I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。   它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU和被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。但在STM8中,400kHZ已经是最快速度了。 2.关于STM8S103手册的I2C简介 芯片手册中只对I2C的特点进行了简单的讲解,但并未深入解析其中的过程。 3. I2C详细解析   I2C总共由五个核心函数,分别为:①起始信号②停止信号③应答信号④发送数据⑤接收数据,通过这五个核心基本函数
[单片机]
基于<font color='red'>STM8</font>的IIC协议--协议篇
STM8 中断控制器ITC
简介 中断控制器提供如下功能: ● 硬件中断的管理 ─ 所有I/O 引脚都具有外部中断能力,每一个端口都有独立的中断向量以及独立的标志。 ─ 外设中断能力 ● 软件中断的管理(TRAP) ● 具有灵活的优先级和中断等级管理,支持可嵌套的或同级中断管理: 多达4个软件可编程的嵌套等级 最多有32个中断向量,其入口地址由硬件固定 2 不可屏蔽的事件: RESET, TRAP 1 个不可屏蔽的最高优先级的硬件中断 (TLI) 基于如下资源的中断管理: ● 位I1 和I0 位于CPU的条件代码寄存器(CCR) ● 软件优先级寄存器 (ITC_SPRx) ● 复位向量地址0x00 800
[单片机]
<font color='red'>STM8</font> 中断控制器ITC
STM8固件库GPIO学习笔记
1、STM8的寄存器映射 STM8 core采用了哈佛结构,有两条总线分别用于访问Flash和RAM,但Flash,RAM,GPIO and peripheral registers都被映射到了线性的16Mbyte(24位地址)的存储器空间中;stm8s208rb的GPIO and peripheral registers被映射到了0x00 5000 ~ 0x00 57FF地址空间。所以要在C语言中访问外围设备寄存器我们只需要指向这些地址空间的指针即可了。 2、STM8的寄存器的地址 在STM8中,与某个外围设备有关的寄存器在地址上都是顺序排列的;比如与GPIO有关的寄存器有ODR、IDR、DDR、CR1、CR2,与PA口有
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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