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,
__eeprom_program_byte,
__eeprom_program_long

 

함수가 없다고 에러가 나올수 있다.

 

이때는 아래의 소스를 추가 하면 된다.

 

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 사이즈가 다르기 때문에 선언 했을때 메모리 범위를 주의 해서 선언하고

변수별로 메모리가 중복되지 않도록 해야 한다.

 

 

 

 

 

+ Recent posts