IAR 은 전통적으로 __eeprom 으로 변수를 선언하면 일반 변수처러 eeprom 을 사용할수 있다.
이에 eeprom 사용 법을 설명해 본다.
__eeprom 을 설명하는 방법처럼 사용하기 위해서 컴파일러 버전 1.42 이상을 사용해야 한다고 한다.
이전에는 버그가 있어서 link 파일에서도 수정을 해주어야 한다고 한다.(실험은 안해 봤다.)
eeprom 선언 :
__eeprom __no_init INT8U eep_data[10];
eeprom 사용 :
if(eep_data[0] != 0x01) eep_data[0] = 0x01;
위와 같은 방식으로 선언을 하면
__eeprom_wait_for_last_operation,
함수가 없다고 에러가 나올수 있다.
이때는 아래의 소스를 추가 하면 된다.
void EEPROM_Unlock()
{
/* Unlock data memory */
FLASH->DUKR = FLASH_RASS_KEY2; /* Warning: keys are reversed on data memory !!! */
FLASH->DUKR = FLASH_RASS_KEY1;
}
void EEPROM_Lock()
{
FLASH->IAPSR &= 0xF7;
}
int __eeprom_wait_for_last_operation(void)
{
FLASH_Status_TypeDef status = FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
return !!(status & (FLASH_STATUS_WRITE_PROTECTION_ERROR | FLASH_STATUS_SUCCESSFUL_OPERATION));
}
void __eeprom_program_byte(unsigned char __near * dst, unsigned char v)
{
EEPROM_Unlock();
FLASH_ProgramByte((u32)dst, (u8)v);
EEPROM_Lock();
}
void __eeprom_program_long(unsigned char __near * dst, unsigned long v)
{
EEPROM_Unlock();
FLASH_ProgramWord((u32)dst, (u32)v);
EEPROM_Lock();
}
eeprom 의 번지를 지정하고자 한다면 아래 와 같이 선언 해야 한다.
__eeprom __no_init INT8U eep_data[10] @ 0x4000;
주의 사항으로 link 파일에 보면 아래 처럼 선어 되어 있을것이다.
define region Eeprom = [from 0x4000 to 0x47FF];
STM8종류에 따라 eeprom 사이즈가 다르기 때문에 선언 했을때 메모리 범위를 주의 해서 선언하고
변수별로 메모리가 중복되지 않도록 해야 한다.