历史上的今天
返回首页

历史上的今天

今天是:2024年08月31日(星期六)

2021年08月31日 | STM8内部EEPROM的使用详解

2021-08-31 来源:eefocus

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);

    }

}

推荐阅读

史海拾趣

Hanghsing Enterprise Co Ltd公司的发展小趣事

HANA Micron公司在电子行业的五个发展故事

故事一:2.5D封装技术的突破

HANA Micron,作为韩国顶尖的后端工艺和外包半导体组装测试(OSAT)公司,近年来在2.5D封装技术领域取得了显著进展。随着高性能人工智能(AI)芯片需求的急剧增长,该公司致力于开发一种能够水平组装不同类型AI芯片的封装技术,如高带宽内存(HBM)。这一技术对于生产像英伟达H100这样的顶级AI加速器至关重要。公司CEO Lee Dong-cheol表示,他们已将未来寄托在HBM和其他AI芯片的先进2.5D封装技术上,并透露公司已生产出原型,尽管全面商业化尚需时日。HANA Micron的这一努力不仅提升了其技术实力,也为公司在全球芯片封装市场的竞争中占据了有利位置。

故事二:越南市场的扩张

为了进一步扩大业务版图,HANA Micron在越南进行了大规模的投资。自2016年在越南北宁省成立公司进军东南亚市场以来,该公司已累计投资高达7000亿韩元(约合5.25亿美元)。其北江省云中工业园的2号制造工厂于2023年正式落成,标志着公司在越南半导体封装和测试领域迈出了重要一步。这一投资不仅提升了公司的产能,还为公司带来了更多的业务机会和市场份额。HANA Micron计划到2025年将月产量提高到2亿个,并预计越南业务的销售额将很快达到万亿韩元。

故事三:多元化产品线的拓展

除了在传统存储芯片封装领域保持领先地位外,HANA Micron还积极拓展多元化产品线。公司目前正在开发针对可穿戴设备和医疗设备的封装技术,以提高这些设备的灵活性和可靠性。这一项目的第一个成果是去年年底开发的针对医疗贴片的心电图传感器模块,该模块允许传感器的功率低于1mA,延迟低于5ms。这一创新不仅展示了公司在封装技术上的深厚积累,也为其在未来医疗和可穿戴设备市场中的发展奠定了坚实基础。

故事四:与国际巨头的合作与竞争

在电子行业的激烈竞争中,HANA Micron不仅与国内同行如三星、SK海力士等展开合作与竞争,还与国际巨头如台积电、英特尔等保持着紧密的联系。公司CEO Lee Dong-cheol透露,台积电已成功研发出英伟达H100的2.5D封装技术,而三星和SK海力士也在积极跟进。在这种背景下,HANA Micron不断加大研发投入,以确保自己在封装技术上的领先地位。同时,公司还通过与国际巨头的合作与交流,不断提升自身的技术水平和市场竞争力。

故事五:应对市场波动与未来展望

面对全球电子市场的波动和不确定性,HANA Micron展现出了较强的抗风险能力和市场适应能力。公司CEO Lee Dong-cheol表示,尽管过去几年存储市场有所放缓,但随着电子产品制造商和AI设备制造商对先进芯片需求的不断增长,预计2024年的业绩将有所改善。为了实现这一目标,公司将继续加大在研发、生产和市场拓展等方面的投入力度。同时,公司还计划将系统芯片的比例提高到50%以上,以降低市场波动对公司业绩的影响。这一战略调整不仅体现了公司对未来的信心和决心,也为公司的可持续发展奠定了坚实基础。

Ememory Technology Inc公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,eMemory始终保持着对新技术和新市场的敏锐洞察力。公司不断推出新的硅智财产品和解决方案,以满足客户不断变化的需求。同时,eMemory还积极拓展国际市场,与全球多家知名芯片设计厂商建立了长期稳定的合作关系。这些努力使得eMemory在电子行业中保持着领先地位,并为其未来的发展奠定了坚实的基础。

EPCOS (TDK)公司的发展小趣事

自成立以来,EPCOS一直致力于技术创新和产品拓展。公司不断投入研发资源,开发出了一系列高性能、高品质的电子元器件产品。这些产品广泛应用于通信、消费、汽车和工业电子等领域,赢得了众多客户的信赖和好评。同时,EPCOS还积极拓展国际市场,与全球众多知名企业建立了长期稳定的合作关系。

Gigarams Semiconductor Device Corp公司的发展小趣事
这可能是由于控制算法复杂或系统响应速度不足导致的。解决方案包括简化控制算法、提高系统响应速度或采用更高效的控制策略。
安普康(AMPCOM)公司的发展小趣事

随着业务的不断发展,安普康开始积极寻求市场拓展和战略合作的机会。公司在香港市场取得了显著的成绩后,决定进一步拓展内地市场。通过设立深圳安普康科技有限公司等分支机构,安普康逐步在内地市场建立了完善的销售网络和服务体系。同时,公司还与多家知名企业建立了长期合作关系,共同开拓市场、分享资源。这些合作不仅提升了安普康的市场地位,也为其未来的发展奠定了坚实的基础。

Hamlin ( Littelfuse )公司的发展小趣事

在电子行业竞争日益激烈的背景下,安普康深知创新是企业发展的核心动力。因此,公司始终将研发投入作为重要战略之一。通过引进先进的生产设备和技术,安普康不断提升产品的品质和性能。同时,公司还积极与国内外知名企业和研究机构合作,共同开展技术研发和创新。这些努力使得安普康在光纤产品、布线产品等领域取得了多项专利,并成功推出了一系列具有市场竞争力的新产品。

问答坊 | AI 解惑

超声波测距学习板套件的完整原理图

赛先生科技(www.schoolboy.com.cn)原创的超声波学习板套件之原理图,详情可以登陆该网站。…

查看全部问答>

读《把时间当作朋友》(六):学习方法真的那么重要吗

原文: 学习方法真的至关重要么 前面已经提到我作为老师经常遇到学生问“老师,这个方法真的有用么?”其 实,我知道学生的问题不止这一个,他们还有更进一步的问题。当然,只有聪明 的人才去关心方法,这没什么不对。然而,学生总是过分关心自 ...…

查看全部问答>

WinCE+PXA270 DMA传输问题!

我用的是WinCE5.0的系统,使用的BVDMAIN的bsp。 在driver里面有一个DMA文件夹,里面有一些使用DMA时相关的函数。还有一个例程代码。 但是我用例程代码调试,总是不成功。 请教一下是什么原因,谢谢 代码如下: #define FPGA_DMA_BUFFER_SI ...…

查看全部问答>

关于WINCE MEDIPLAYER的问题--在线等

本人第1次用CE。。。。 刚装好platform builder时。马上Build了一个NK。BIn 放在目标机上可以好好的运行。目标机上的media player可以打开windows media server编码出来的WMV9的MMS流。 后来我更改了一些东西。。。再BUILd就打不能MMS流了。。连 ...…

查看全部问答>

IO口中断的奇怪问题

本人用F412做仪表,设置一个按键P16来关机,关机后进入LPM4,同时设定IO口中断,结果发现进入休眠以后P1IE莫名其妙地被清零,硬件仿真的时候读出来的P1IE为0,从而导致不能再次开机,修改内存把它改为0x40(BIT6)后才能进入中断唤醒,再次进入休眠 ...…

查看全部问答>

eZ430-RF2500体验之前奏

  今天上午刚刚收到eZ430-RF2500,上传几张照片,作为一个纪念,另外谢谢寄给我东西的那位同学的精心包装,什么话都不说,先上图,呵呵…

查看全部问答>

2011年全国电子设计大赛基本仪器和主要元器件清单

本帖最后由 paulhyde 于 2014-9-15 09:47 编辑 、基本仪器清单 20MHz普通示波器(双通道,外触发输入,有X轴输入) 60MHz双通道数字示波器 低频信号发生器(1Hz~1MHz) 标准高频信号发生器(1MHz~30MHz,可输出1mV小信号) 函数发生器(10 M ...…

查看全部问答>

为什么写了一个简单的软件延时程序无法调试

我在书上抄的一段程序 #include \"io430.h\" #include<msp430x44x.h>#define Const 100vodi SoftDelay(int Factor){int i,j;for(i=0;i<Factor;i++)    for(j=0;j<Const;j++); }void main(void){ _NOP();  SoftDelay ...…

查看全部问答>

msp430LaunchPad风火轮触摸板手册

msp430LaunchPad风火轮触摸板手册   …

查看全部问答>

对比分析几种LED保护电路设计方案心得

白光LED属于电压敏感型的器件,在实际工作中是以20mA的电流为上限,但往往会由于在使用中的各种原因而造成电流增大,如果不采取保护措施,这种增大的电流超过一定的时间和幅度后LED就会损坏。   造成LED损坏的原因主要有:    ...…

查看全部问答>