历史上的今天
返回首页

历史上的今天

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

2018年09月08日 | stm8单片机内部存储EEPROM字节读写实例解析

2018-09-08 来源:eefocus

EEPROM(Electrically Erasable Programmable Read-Only Memory),电擦除可编程只读存储器。 
它是一种可在线电擦除和电写入、掉电后数据不丢失的存储器,在嵌入式系统中应用特别广泛。 
它在应用中一般存储用户数据,在系统运行过程中可以随时修改,系统复位之后从里面读取的是修改之后的新数据。

FLASH 存储器又称为闪存(FLASH Memory)。 
它结合了 ROM 和 RAM 的优点,既具备EEPROM 可电擦除、掉电不丢失数据的特点, 
又因为可以块读写而具备读写速度快的特点。 
FLASH相对 EEPROM 来言,成本低廉,我们经常使用的 U 盘就是采用 FLASH 作为存储介质。FLASH在嵌入式系统中应用非常广泛,一般作为程序存储器使用,在系统运行过程中不修改存储在里面的数据, 系统复位之后里面存储的还是最初的数据。 FLASH 实质上也是 EEPROM 的一种。 STM8S 单片机片内集成 FLASH 程序存储器和数据 EEPROM,它们由一组通用寄存器来控制,用户可以通过编程来实现对它们的写入、擦除,还可以通过它们来设置写保护、配置低功耗模式。选项字节 OPTION BYTES 也是它们的一部分。

STM8系列的单片机存储器有3种规格 这里使用的207系列是2048Byte的数据存储空间(EEPROM) 
这里写图片描述

测试程序


#include "stm8s.h"

#include "stm8s_clk.h"

#include "led.h"

#include "server.h"

#include "tim1.h"

#include "stm8s_clk.h"

#include "stm8s_flash.h"


void testFlashRW();


int main(void){ 

  testFlashRW();

  while(1);

}


void testFlashRW(){

    u32 add = 0;

    uint8_t Tx_Buffer[1] = {0};


    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

    InitUart1((u32)115200, FALSE);


    FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);

    FLASH_Unlock(FLASH_MEMTYPE_DATA);

    add = 0x4000;

    uint32_t j;

    uint32_t max_size = 2048;//2056;


    /*

    for(j=0; j

      FLASH_ProgramByte(add, j);

      add++;

    }*/

    add = 0x4000;

    for(j=0; j

      Tx_Buffer[0] = FLASH_ReadByte(add);

      Uart1SendData( Tx_Buffer, 1);

      add++;

    }

}

这里写图片描述

这里有反复测试过具体的数据存储空间 测试过一个临界值是2056个字节 但是使用2056发现数据末尾添加的8位出现数据不正确的情况 所以可以得出确切存储空间是2048个字节。 
读写结果使用了串口输出的形式进行查看数据存储是否正确 可以查看 串口输出的数据testFlashRW.txt

至于存储在FLASH空间中的程序具体是占用多少空间可以通过查看 user\Debug\List\QF-stm8-master.map 看到 
程序需要的FLASH空间是 1,969 = 1,482 + 158 + 329, 不到2K的FLASH占用

调用 IS_FLASH_ADDRESS_OK(Address) 接口进行检查地址是否越界也可以看到对应型号的单片机所对应的数据存储器大小

// stm8s_flash.h


#define FLASH_PROG_START_PHYSICAL_ADDRESS ((uint32_t)0x008000)


#if defined (STM8S208) || defined (STM8S207) || defined (STM8AF52Ax) || defined (STM8AF62Ax)

#define FLASH_PROG_END_PHYSICAL_ADDRESS   ((uint32_t)0x027FFF)

#define FLASH_DATA_START_PHYSICAL_ADDRESS ((uint32_t)0x004000)

#define FLASH_DATA_END_PHYSICAL_ADDRESS   ((uint32_t)0x0047FF)

#endif



#define IS_FLASH_ADDRESS_OK(ADDRESS)

((((ADDRESS) >= FLASH_PROG_START_PHYSICAL_ADDRESS) && ((ADDRESS) <= FLASH_PROG_END_PHYSICAL_ADDRESS)) || \

(((ADDRESS) >= FLASH_DATA_START_PHYSICAL_ADDRESS) && ((ADDRESS) <= FLASH_DATA_END_PHYSICAL_ADDRESS)))


可以看出从 FLASH_DATA_START_PHYSICAL_ADDRESS 到 FLASH_DATA_END_PHYSICAL_ADDRESS 

就是从 0x004000 到 0x0047FF 刚好是 2048 字节


尝试使用flash空间进行数据存储 但是当程序运行到flash空间并且没有被应用程序使用到的地址时 

仍然出现保存数据错误的情况 

所以使用flash空间保存数据暂时找不到确切的解决方案


推荐阅读

史海拾趣

Dresden Elektronik公司的发展小趣事

在技术和产品的双重驱动下,Dresden Elektronik公司开始积极拓展市场。他们不仅在国内市场上取得了显著的成绩,还积极开拓国际市场。通过参加国际展会、与跨国企业合作等方式,公司的知名度和影响力逐渐提升,市场份额也不断扩大。

ATO SOLUTION公司的发展小趣事

在电子行业的激烈竞争中,ATO SOLUTION公司通过一项创新性的技术突破,成功引领了市场的新潮流。该公司研发出了一款高效能的半导体芯片,极大地提升了电子设备的性能和能效比。这一技术的问世,迅速获得了行业内外的广泛关注和认可,为公司赢得了大量合作伙伴和客户,奠定了市场领先地位。

Genesys Logic公司的发展小趣事

在20世纪70年代初,一家名为“General Microcircuits”的初创公司(此名称为虚构,以符合问题要求)凭借其在集成电路设计领域的突破性创新迅速崛起。公司创始人李博士带领团队研发出了一种新型低功耗微控制器,该产品在功耗管理上实现了前所未有的效率,极大地延长了便携式电子设备的电池寿命。这一技术创新迅速吸引了市场关注,多家知名电子产品制造商开始采用其芯片,推动了“General Microcircuits”在行业内的知名度与市场份额的快速增长。

BAE Systems公司的发展小趣事

随着全球化的加速,BAE Systems公司积极寻求跨国合作与拓展机会。公司与多家国际知名企业建立了紧密的合作关系,共同开展研发项目和市场拓展。这些合作不仅帮助公司获取了更多的技术和市场资源,也提升了公司在全球电子行业的地位和影响力。通过跨国合作,BAE Systems公司的产品和服务逐渐进入全球市场,为公司的持续发展注入了新的活力。

Herotek Inc公司的发展小趣事

在全球倡导绿色低碳的背景下,Henkel也积极投身于绿色材料的研发和应用中。在电子行业中,Henkel推出了多款环保型粘合剂产品,这些产品不仅具有优异的性能表现,还符合国际环保标准和法规要求。通过推广绿色材料和技术解决方案,Henkel不仅为电子行业的可持续发展做出了贡献,也进一步巩固了其在该领域的领先地位。

以上五个故事展示了Henkel公司在电子行业中的发展历程和成就。凭借其创新的技术、全面的解决方案以及对可持续发展的承诺,Henkel将继续在电子行业中发挥重要作用。

Deltron / DEM Manufacturing公司的发展小趣事

DEM Manufacturing深知品牌对于企业发展的重要性。因此,公司注重品牌塑造和宣传,通过广告、公关等多种手段提升品牌知名度和美誉度。同时,公司还积极参与公益事业和社会活动,履行社会责任,树立了良好的企业形象。

问答坊 | AI 解惑

Stellaris,Beat STM32!!!血战已拉开大幕

呵呵,这个口号我是替TI喊的。 想来TI的人心里应该也是这么想的。         TI收购Luminary之后一直很期待,原本市场上ARM Cortex-M3的基本上就是STM32一花独放,这下可出来个对手了。       & ...…

查看全部问答>

Activesync连接上WINCE问题!

我的Activesync能连接上WINCE,在移动设备中有显示WINCE的内容,也能复制文件到WINCE,但是EVC不能与WINCE通信. 感觉很奇怪,不知道是什么原因引起的,大家指点一下了.搞了一天都没有找到什么原因. 谢谢!…

查看全部问答>

LCDj显示不同宽度ASC字符

我们在LCD上显示字符,当然是希望每个字符的 长 X 高 是相同点阵的方框字,取相应字模时,偏移量也好计算,但是像office word里,它有些字体单个字符的宽度不一样的,例如M 和I ,它是基于何种思想来处理不现宽度的字符送到LCD显示的? 难到一个字节的ASC ...…

查看全部问答>

友坚6410平台,目录的问题.

友坚6410平台,目录 D:\\WINCE600\\PLATFORM\\SMDK6410\\SRC\\BOOTLOADER\\下有以下几个子目录, \\EBOOT.WHIMORY \\NBL1.IROM_SD \\NBL1.LSB \\NBL2 这几个目录的作用是什么?,先执行哪一个目录? \\EBOOT.WHIMORY 可能是 EBoot, NBoot启开后, ...…

查看全部问答>

SD卡驱动问题

目前我在TI的TMS320VC5509A上做一个项目,需要驱动SD卡。5509上自带有SD卡控制器。通过配置应该就能正常使用。 可是现在我遇到的问题是,不能连续进行SD卡读写。比如先读SD卡(查询),接着又写,在写时写命令返回的response不对。只有在读完后加 ...…

查看全部问答>

EVB 打印问题

我编一程序,要在WIN CE系统运行,用EVB做的,现在要实现打印功能,A4纸,有N组数据,数据我存放在一个文本文件里面,有文件头和尾,有些字要用大号,有些用小号字,实在理不出头绪了,请教高手应该怎么处理?打印机可以指定一种,能通用各种打印机最好…

查看全部问答>

谁有16×16汉字的点阵字库吗

从hzk16.h字库中提取出的汉字在液晶中显示单一,想找其它字体的点阵字库. 我在网上找了几个ttf格式的的字库不能用,不知到哪里可以找到。…

查看全部问答>

如何将mc 1000中的文件用程序复制到计算机里呢?

好像用@\"\\windows\\\"+filename 是能识别的!有做过的给点意见!…

查看全部问答>

求教:关于PE文件的导入符号

正在研究 PE 文件的格式,但是对导入表的结构和用法不太明白。 已经能够从PE文件分析出导入表中的,但是不知道怎么解析系统创建的 调转表和调转地址。 我的代码里调用一个系统函数的时候,反汇编(ARM芯片)得到 ;处理参数等 0001287C EB00033 ...…

查看全部问答>