历史上的今天
今天是:2024年11月25日(星期一)
2019年11月25日 | STM8L的EEPROM读写原理及例程
2019-11-25 来源:eefocus
STM8L103C6拥有1KB的片上EEPROM,可以用来存储程序需要用到的参数,就不需要额外使用24C02这样的外部存储器了.
同时,和24C02比起来,STM8L的片上EEPROM操作更简单,可以直接对地址进行操作,进行数据读写.
下图是STM8L闪存和EEPROM的地址分配图,可以看到EEPROM的起始地址为0x001000,结束地址为0x0013FF.共1024个地址空间,所以EEPROM的容量为1KB.
EEPROM在上电复位后是写保护的,在向其中写入数据时,需要解锁,关闭写保护.解锁流程为:
①第一次向FLASH_DUKR写入密钥0xAE
②第二次向FLASH_DUKR写入密钥0x56
两次都写入正确后,写保护功能被关闭,可以对EEPROM区域进行写操作.解锁成功后,DUL位会被置位,在写完密钥后,可以读取DUL位来判断有没有解锁成功.
在向EEPROM写数据时,单片机内部会产生高压对EEPROM写操作,如果这个时候被中断打断,会造成单片机异常,所以写操作时,需要关闭总中断,防止意外发生.
本例程,先向EEPROM的四个地址各写入了一个字节的数据,然后从这个四个地址读取出这些数据,和写入数据进行对比.从下图可以看到,读出数据和写入数据完全一致.
/****************************************************************************************
*开发环境:IAR for stm8 v6.5.3
*硬件平台:STM8L-DISCOVERY
*功能说明:本例程,先向EEPROM的四个连续地址写入四个字节数据,然后读取出来,与写入数据对比
*作 者:茗风
****************************************************************************************/
#include"iostm8l152c6.h"
#include"stdint.h"
#define EEPROM_STARTADDR 0x1000
/******************************************************************************************************
*名 称: void EEPROM_WriteByte(uint16_t Addr,uint8_t Data)
*功 能: 向EEPROM指定地址写入一字节数据
*入口参数: Addr:存放数据的偏移地址
* Data:待写入的数据
*出口参数:无
*范 例:
******************************************************************************************************/
void EEPROM_WriteByte(uint16_t Addr,uint8_t Data)
{
uint8_t *Ptr_SegAddr; //Segment pointer
Ptr_SegAddr = (uint8_t *)(EEPROM_STARTADDR+Addr); //Initialize pointer
FLASH_DUKR=0xAE;
FLASH_DUKR=0x56;
while(!FLASH_IAPSR_DUL);//如果DUL没有置位,说明解锁不成功,最好加入超时判断
asm("sim");//关闭中断
*Ptr_SegAddr=Data; //指定地址,写1 字节
while(!FLASH_IAPSR_EOP);//等待写操作完成,最好加入超时判断
asm("rim");//打开中断
FLASH_IAPSR_DUL=0;//上锁,对DATA EEPROM写保护
////////////////////
}
/******************************************************************************************************
*名 称:uint8_t EEPROM_ReadByte(uint8_t Addr)
*功 能:从EEPROM中读取一个字节数据
*入口参数:Addr:存放数据的偏移地址
*出口参数:Data:读回的数据
*说 明:无
*范 例:无
******************************************************************************************************/
uint8_t EEPROM_ReadByte(uint16_t Addr)
{
uint16_t Data=0;
uint8_t *Ptr_SegAddr;
Ptr_SegAddr = (uint8_t *)(EEPROM_STARTADDR+Addr); //Initialize pointer
Data=*Ptr_SegAddr;
return Data;
}
void main(void)
{
static uint8_t t1=0,t2=0,t3=0,t4=0;
EEPROM_WriteByte(0x00,0x40);
EEPROM_WriteByte(0x01,0x41);
EEPROM_WriteByte(0x02,0x42);
EEPROM_WriteByte(0x03,0x43);
t1=EEPROM_ReadByte(0x00);
t2=EEPROM_ReadByte(0x01);
t3=EEPROM_ReadByte(0x02);
t4=EEPROM_ReadByte(0x03);
// asm("rim"); //enable interrupts
while(1)
{
// asm("wfi");
}
}
史海拾趣
|
请问在wince里怎样用wifi发送特定数据 有人说就是socket编程,我没想明白,难道系统会自动调用wifi? 还请各位前辈指点迷津!… 查看全部问答> |
|
想学习一下AD,打算仿真做一个数字电压表,测量0~5V输出0~255,通过数码管显示,AD用的0809,模拟输入采用一个1K滑动变阻器连接到IN0(不知道这种做法是否可行?)现在的问题是,改变滑动变阻器的值,数码管的值有变化,但是并不是有规律地增大或 ...… 查看全部问答> |
|
小弟在研究硬盘电机的驱动,我曾试过用小功率管9013,8050,8550等等来搭成达林顿管子,但是驱动电机的时候发热严重,而且明显有气无力...虽然能转...在网上找了很久,想用场效管IRF540N来驱动,但是不知道电路如何搭建...求各位高手,走过路过的能 ...… 查看全部问答> |
|
针对beaglebone 扩展板,进行Linux驱动的调试! 好久没有发帖子了!今天来分享一下针对beaglebone 扩展板,进行Linux驱动的调试吧! 第二次修正beaglebone板子的外围电路还是比较顺利的! 具体编译内核的过程就不在介绍了!论坛里有很多人写了这方面的教程,Ti官方的文档也提供了较为全面的编译 ...… 查看全部问答> |
|
都到这个点了,真的好瞌睡啊,希望这个文档能对初学的人带来帮助 我也是磕磕绊绊好几周才弄懂了整个开发的流程,希望初学的人来看 看我这篇文档,在开发中少走弯路,不走弯路 我是西安电子科技大学测控技术与仪器专业的学生,欢迎交流,共同进步 ...… 查看全部问答> |
|
晒设计方案+MDK5.0下新建STM32F429i工程步步入门 晒设计方案+MDK5.0下新建STM32F429i工程步步入门 环境说明:1 Keil uVision52 STM32F429I-Discovery_FW_V1.0.1 一 工作目录路径1 在STM32F429I-Discovery_FW_V1.0.1目录下新建自己的总工程文件夹”My_Projects”. 2 为第一个工程试验新建文件夹 ...… 查看全部问答> |




