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 사이즈가 다르기 때문에 선언 했을때 메모리 범위를 주의 해서 선언하고
변수별로 메모리가 중복되지 않도록 해야 한다.
'공부 > STM8' 카테고리의 다른 글
STM8S 에서 RAM상주 함수 만들기 (2) | 2013.03.05 |
---|---|
STM8S 표준 회로도 자료및 컴파일설정 파일 자료 (0) | 2013.02.05 |
STM8 중 가장큰 80pin 회로도 (0) | 2013.02.05 |
STM8S 용 RTOS (0) | 2013.02.05 |
STM8 관련 다양한 정리가 되어 있는 사이트 (0) | 2013.02.05 |