历史上的今天
今天是: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个字节。 至于存储在FLASH空间中的程序具体是占用多少空间可以通过查看 user\Debug\List\QF-stm8-master.map 看到 调用 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空间保存数据暂时找不到确切的解决方案
读写结果使用了串口输出的形式进行查看数据存储是否正确 可以查看 串口输出的数据testFlashRW.txt
程序需要的FLASH空间是 1,969 = 1,482 + 158 + 329, 不到2K的FLASH占用
上一篇:STM8汇编代码分析
史海拾趣
|
Stellaris,Beat STM32!!!血战已拉开大幕 呵呵,这个口号我是替TI喊的。 想来TI的人心里应该也是这么想的。 TI收购Luminary之后一直很期待,原本市场上ARM Cortex-M3的基本上就是STM32一花独放,这下可出来个对手了。 & ...… 查看全部问答> |
|
我的Activesync能连接上WINCE,在移动设备中有显示WINCE的内容,也能复制文件到WINCE,但是EVC不能与WINCE通信. 感觉很奇怪,不知道是什么原因引起的,大家指点一下了.搞了一天都没有找到什么原因. 谢谢!… 查看全部问答> |
|
我们在LCD上显示字符,当然是希望每个字符的 长 X 高 是相同点阵的方框字,取相应字模时,偏移量也好计算,但是像office word里,它有些字体单个字符的宽度不一样的,例如M 和I ,它是基于何种思想来处理不现宽度的字符送到LCD显示的? 难到一个字节的ASC ...… 查看全部问答> |
|
友坚6410平台,目录 D:\\WINCE600\\PLATFORM\\SMDK6410\\SRC\\BOOTLOADER\\下有以下几个子目录, \\EBOOT.WHIMORY \\NBL1.IROM_SD \\NBL1.LSB \\NBL2 这几个目录的作用是什么?,先执行哪一个目录? \\EBOOT.WHIMORY 可能是 EBoot, NBoot启开后, ...… 查看全部问答> |
|
正在研究 PE 文件的格式,但是对导入表的结构和用法不太明白。 已经能够从PE文件分析出导入表中的,但是不知道怎么解析系统创建的 调转表和调转地址。 我的代码里调用一个系统函数的时候,反汇编(ARM芯片)得到 ;处理参数等 0001287C EB00033 ...… 查看全部问答> |




