微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM8L探索套件学习笔记-EEPROM(十一)

STM8L探索套件学习笔记-EEPROM(十一)

时间:11-24 来源:互联网 点击:
上节将到官方例程使用EEPROM存储外围电路消耗的电流值,今天我们对STM8L的EEPROM介绍下。STM8L带有的32K的FLASH和1K的EEPROM都可以编程和擦除,编程模式有1、字节byte,2、字word,3、BLOCK和4、编程和擦写完中断。

由于默认是锁定的,所以对FLASH和EEPROM编程首先要解锁,解锁的方式是写如寄存器特定值,0X56 0XAE。在IAR编译器当中,__eeprom用于EEPROM存储空间,控制数据存放,控制指针类型和存放。@用于变量的绝对地址定位。也可以用#pragma location命令。
EEPROM区域数据存储:

用关键字__eeprom控制来存放,__eeprom关键字写在数据类型前后效果一样。
__eeprom unsigned char a;//定义一个变量存放在EEPROM空间
unsigned char __eeprom a;//效果同上
__eeprom unsigned char p[];//定义一个数组存放在EEPROM空间
对于EEPROM空间的变量操作同SRAM数据空间的操作方法一样,编译器会自动
调用__EEPUT(ADR,VAL),__EEGET(VAR, ADR)宏函数来对EEPROM变量的
操作。
EEPROM空间绝对地址定位:
__eeprom unsigned char a @ 0x8;//定义一个变量存放在EEPROM空间
0X08单元
__eeprom unsigned char p[] @ 0x22//定义一个数组存放在EEPROM空间,
开始地址为0X22单元
__eeprom unsigned char a @ 0x08=9;//定义一个常数存放在EEPROM空
间0X08单元
__eeprom unsigned char p[] @0x22={1,2,3,4,5,6,7,8};
//定义一个组常数存放在EEPROM空间开始地址为0X22单元
由于常数在EEPROM空间的地址是已经分配的,读取EEPROM空间值可以用
变量和地址。

需要用户外加三个函数才能使得编译器使用_eeprom变量自动写入EEPROM。
/*
* The user must implement the three extern-declared functions below
* in order for the compiler to be able to automatically write to the
* EEPROM memory when __eeprom variables are assigned to.
*/

/*
* Wait for the last data EEPROM operation to finish.Return 0 if the
* operation failed, otherwise non-zero.You may want to handle
* errors here, since the utility functions below simply ignore
* errors, aborting multi-write operations early.
*/
int __eeprom_wait_for_last_operation(void)
{
FLASH_Status_TypeDef status = FLASH_WaitForLastOperation(FLASH_MemType_Data);
return !!(status & (FLASH_Status_Successful_Operation));
}

/*
* Write one byte to the data EEPROM memory.
*/
void __eeprom_program_byte(unsigned char __near * dst, unsigned char v)
{
FLASH_ProgramByte((u32)dst, (u8)v);
}

/*
* Write one 4-byte long word to the data EEPROM memory.The address
* must be 4-byte aligned.
*/
void __eeprom_program_long(unsigned char __near * dst, unsigned long v)
{
FLASH_ProgramWord((u32)dst, (u32)v);
}

加入了这三个函数后,我们就可以很方便的使用_eeprom的定义变量了
void main(void)
{
uint8_t temp1=a;
//temp1=2;
//temp2=0;
/* Initialize I/Os in Output Mode */
GPIO_Init(LED3_PORT,LED3_PIN,GPIO_Mode_Out_PP_Low_Fast);
//输出低电平-高速10M
GPIO_Init(LED4_PORT,LED4_PIN,GPIO_Mode_Out_PP_Low_Fast);
//输出低电平-高速10M
FLASH_Unlock(FLASH_MemType_Data);
FLASH_ProgramByte(0x1001, temp1);//eeprom memory: address is 0x1001 =temp1
FLASH_WaitForLastOperation(FLASH_MemType_Data);
//temp2=FLASH_ReadByte(0x1000);
if(num==a)
GPIO_SetBits(LED3_PORT,LED3_PIN);
while(1);

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top