STM8单片机内部EEPROM问题
void EEP_unlock()
{
FLASH->DUKR = 0xAE;
FLASH->DUKR = 0x56;
while(!(FLASH->IAPSR & 0x08));
}
void EEPROM(u16 adress,u32 Data)
{
FLASH->CR2 = 0;
FLASH->CR2 |= 0x40;
FLASH->NCR2 &= 0xBF;
*(unsigned char *)adress = (u8)(Data>>24);
*(unsigned char *)(adress+1) = (u8)(Data>>16);
*(unsigned char *)(adress+2) = (u8)(Data>>8);
*(unsigned char *)(adress+3) = (u8)Data;
while((FLASH->IAPSR & 0x04)==0);
}
把地址改掉就好了
void InitEEPROM(void)
{
do
{
FLASH_DUKR=0xae;
FLASH_DUKR=0x56;
}while((FLASH_IAPSR & 0x08)== 0x00);
}
U8 Stm8sEepromRead(U8 addr)
{
U8 ucReturn;
U8 *p;
p=(U8 *)( 0x4000 + addr*1 );
ucReturn = *p;
return(ucReturn);
}
void Stm8sEepromWrite(U8 addr,U8 date)
{
U8 *p;
p=(U8 *)(0x4000 + addr * 1);
*p = date;
while((FLASH_IAPSR & 0x04)==0);
}
第一,是你理解错了,手册并没有错,DUL为1时解锁.看程序:
do
{
FLASH_DUKR = 0x56;
FLASH_DUKR = 0xAE;
}
while((FLASH_IAPSR & 0x08) == 0);//等待解锁成功
那个While的意思:
如果FLASH_IAPSR 的BIT3位为0,那么,FLASH_IAPSR & 0x08 就会等于0,这个时候,
((FLASH_IAPSR & 0x08) == 0)这个条件就成立,那么就会循环.
相反,如果FLASH_IAPSR 的BIT3位为1,那么,FLASH_IAPSR & 0x08 就会等于0x08,这个时候,
((FLASH_IAPSR & 0x08) == 0)这个条件就不会成立,那么就会退出循环.
所以,DUL位为1才表示解锁,是你自己理解错了.
第二个问题,所有的单片机存储方式分两种,一种是大端,另一种是小端,举例来说:
unsigned short * P = (unsigned short *)0x0000;
unsigned long *Q = (unsigned long *)0x0004;
*P = 0x1234;
*Q = 0x12345678
那么,如果是小端存储,
各个地址存储的内容应该如下:
地址 00 01 02 03 04 05 06 07
0x34 0x12 XXX XXX 0x78 0x56 0x34 0x12
小端比较好理解,如果是大端,各内容应该如下:
地址 00 01 02 03 04 05 06 07
0x12 0x34 XXX XXX 0x12 0x34 0x56 0x78
相信我这样举例子你应该明白了吧?STM8是大端方式,
你向 unsigned int 类型的地址里写 0x55,那么被扩展成 0x0055
如果是小端方式 0x00放在高半段,也就是地址 0x4001上,而0x4000上放0x55
但是STM8是大端方式,所以 把低半段0x55放在高地址0x4001,而把高半段0x00放在低地址0x4000上.
如果你想把0x55放在0x4000上,改一下函数:
void EEPROM_WriteByte(unsigned int StartAddress) //写一个字节到EEPROM地址
{
unsigned int *EEPROM_Address,Address;
Address = StartAddress;
EEPROM_Address = (unsigned int *)Address;
EEPROM_Unlock();
*EEPROM_Address = 0x55;
while((FLASH_IAPSR & 0x04) == 0);
EEPROM_Lock();
}
把那个里面所有的 unsigned int 修改成 unsigned char
禽褚活血: void InitEEPROM(void) {do{FLASH_DUKR=0xae; FLASH_DUKR=0x56;}while((FLASH_IAPSR & 0x08)== 0x00); }U8 Stm8sEepromRead(U8 addr) {U8 ucReturn;U8 *p; p=(U8 *)( 0x4000 + addr*1 );ucReturn = *p; return(ucReturn); }...
恩平市18838569712: STM8单片机内部EEPROM问题 - ?
禽褚活血: 这个问题我来回答你吧. 第一,是你理解错了,手册并没有错,DUL为1时解锁.看程序: do { FLASH_DUKR = 0x56; FLASH_DUKR = 0xAE; } while((FLASH_IAPSR & 0x08) == 0);//等待解锁成功 那个While的意思: 如果FLASH_IAPSR 的BIT3位...
恩平市18838569712: 请教IAR下STM8内部EEPROM的操作问题 - ?
禽褚活血: #include #define uint unsigned int#define uchar unsigned char#define ulong unsigned long#define MASS_KEY1 0xAE#define MASS_KEY2 0x56#define EEP_BASE 0x4000 void delay_ms(uchar ms) { uchar i,j; while(ms--) { for(i=4;i!=0;i--) for(j=...
恩平市18838569712: 请教一个关于片内EEPROM的问题 - ?
禽褚活血: 对于单片机而言,如果有片内EEPROM,就可以通过程序直接读写EEPROM,其内容掉电不丢失,省去了外接EEPROM的麻烦.
恩平市18838569712: 单片机内部e2prom存储格式 - ?
禽褚活血: EEPROM只能存取定点数,不能存放浮点数,要存放的话必须按一定规则转换成定点数,使用的时候再转换成浮点数(小数)使用即可,而字符串的话是按字节存储的,不用转换就可以使用.存-0.12这个小数,可以根据范围 在一定地址范围 内用来存小数,然后这个范围内的数读的时候按照你的规则转换即可,比如你定这个数的范围在-10.00到10.00之间则可以用两个字节来存,第一个字节的最高位用来存符号位,如果为1则为负,为0则为正数.然后后面所有位按照正常的2次幂的方式存储(低8位存小数部分的值,读的时候注意区分,高八位的后七个字节存整数部分的值),依此类推其他范围的值的存储方式也就差不多了.
恩平市18838569712: 单片机程序里如何初设EEPROM? - ?
禽褚活血: 可以在EEPROM中设两组数据,一组是你需要的数据,并且再增加一个校验,例如异或AA,而另一组是改写标志,也要带校验,在改写时,要同时改写这两组.上电后,先看数据那一组,如果校验正确,则采用其中的数据. 如果数据组检验错,则看改写标志组,如果其校验正确,则认为是写数据时出错,你根据自己的需求另行处理;如果改写标志组也校验错,则认为是首次上电,你可以将初值写入,并将改写标志组写好.关键是写完一组要回读,保证至少一组是正确的.大体思路是这样,请参考
恩平市18838569712: 单片机内部EEPROM写之前要擦除吗?擦除的不是单个字节,把别的也擦除了怎么办? - ?
禽褚活血: 看单片机PDF,STC的写之前一定要擦除,因为要为空时才可对其编程,写(因为只有扇区擦除才能把0变为1,若这个扇区原本有0的话你不擦出就不是覆盖了而是混乱!!!).一个扇区可以写很多数据的,但是在每写一个数据之前要把其他的...
恩平市18838569712: 能帮忙编一个利用51单片机内部eeprom,来保存数码管显示的程序吗.请大虾帮忙,会追分的.先谢谢哈. - ?
禽褚活血: 以下是单片机实践团为您解答:1、从您的描述大概懂您的意思,一般对于某些需要保存某些用户信息数据的场合都是使用EEPROM来实现.比如可以设置报警温度的测温系统,在不同的季节需要不同的报警阈值,所以一般会引入EEPROM用于保存报警温度.2、您描述的采用51单片机内部的EEPROM,不知道您说的是哪一款单片机,请告之具体的型号.就我所知的51内核的带EEPROM的单片机有STC和c8051f系列的.非51内核的很多都带eeprom的,比如stm8.3、如果是使用一般的51芯片的话(比如at89c5x)可以通过外扩EEPROM来实现,推荐AT24C02等根据您的容量来确定型号.4、不明白的hi我,常在线.
恩平市18838569712: 关于单片机控制eeprom的一个问题. - ?
禽褚活血: 这个好办,你在写入的数据中插入一些标识和校验码就可以了.以后开机根据标识和校验码检查eeprom里面这些数据的有效性.
恩平市18838569712: 怎样操作STM8的EEPROM - ?
禽褚活血: 这单片机的EEPROM非常方便,直接读写,看下库怎么实现的就行