IAR STM8 1.2 直接使用__eeprom关键字访问EEPROM
STM8L15X:
#include "stm8l15x_conf.h"
void __eeprom_write_8(unsigned short addr_eep,unsigned char data)
{
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_Unlock(FLASH_MemType_Data);
FLASH_ProgramByte(addr_eep, data);
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_Lock(FLASH_MemType_Data);
}
void __eeprom_write_16(unsigned short addr_eep,unsigned short data)
{
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_Unlock(FLASH_MemType_Data);
FLASH_ProgramByte(addr_eep, data/256);
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_ProgramByte(addr_eep+1, data%256);
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_Lock(FLASH_MemType_Data);
}
void __eeprom_write_32(unsigned short addr_eep,unsigned long data)
{
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_Unlock(FLASH_MemType_Data);
FLASH_ProgramByte(addr_eep, (unsigned char)(data>>24));
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_ProgramByte(addr_eep+1, (unsigned char)(data>>16));
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_ProgramByte(addr_eep+2, (unsigned char)(data>>8));
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_ProgramByte(addr_eep+3, (unsigned char)(data>>0));
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_Lock(FLASH_MemType_Data);
}
void __eeprom_write_many(unsigned short addr_eep,unsigned short size,unsigned short dummy,unsigned short addr_ram)
{
FLASH_WaitForLastOperation(FLASH_MemType_Data);
FLASH_Unlock(FLASH_MemType_Data);
for(unsigned short i=0;i<size;i++)
{
FLASH_ProgramByte(addr_eep+i, *((unsigned char *)(addr_ram)+i));
FLASH_WaitForLastOperation(FLASH_MemType_Data);
}
FLASH_Lock(FLASH_MemType_Data);
}
STM8S:
#include "stm8s_conf.h"
void __eeprom_write_8(unsigned short addr_eep,unsigned char data)
{
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Unlock(FLASH_MEMTYPE_DATA);
FLASH_ProgramByte(addr_eep, data);
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Lock(FLASH_MEMTYPE_DATA);
}
void __eeprom_write_16(unsigned short addr_eep,unsigned short data)
{
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Unlock(FLASH_MEMTYPE_DATA);
FLASH_ProgramByte(addr_eep, data/256);
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_ProgramByte(addr_eep+1, data%256);
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Lock(FLASH_MEMTYPE_DATA);
}
void __eeprom_write_32(unsigned short addr_eep,unsigned long data)
{
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Unlock(FLASH_MEMTYPE_DATA);
FLASH_ProgramByte(addr_eep, (unsigned char)(data>>24));
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_ProgramByte(addr_eep+1, (unsigned char)(data>>16));
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_ProgramByte(addr_eep+2, (unsigned char)(data>>8));
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_ProgramByte(addr_eep+3, (unsigned char)(data>>0));
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Lock(FLASH_MEMTYPE_DATA);
}
void __eeprom_write_many(unsigned short addr_eep,unsigned short size,unsigned short dummy,unsigned short addr_ram)
{
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Unlock(FLASH_MEMTYPE_DATA);
for(unsigned short i=0;i<size;i++)
{
FLASH_ProgramByte(addr_eep+i, *((unsigned char *)(addr_ram)+i));
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
}
FLASH_Lock(FLASH_MEMTYPE_DATA);
}
主程序测试:
volatile __eeprom __no_init char eep_u8;
volatile __eeprom __no_init short eep_u16;
volatile __eeprom __no_init long eep_u32;
void main( void )
{
eep_u8=123;
eep_u16=12345;
eep_u32=123456789;
while(1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我看了官方例程程是:
int __eeprom_wait_for_last_operation(void)
{
FLASH_Status_TypeDef status = FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
return !!(status & ( FLASH_STATUS_SUCCESSFUL_OPERATION
| FLASH_STATUS_END_HIGH_VOLTAGE));
}
void __eeprom_program_byte(unsigned char __near * dst, unsigned char v)
{
FLASH_ProgramByte((u32)dst, (u8)v);
}
void __eeprom_program_long(unsigned char __near * dst, unsigned long v)
{
FLASH_ProgramWord((u32)dst, (u32)v);
}
这三个函数,试了,一下,总有莫名其妙的问题。。。
一周热门 更多>