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

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

 

 

 

 

 

STM8S 에서 RAM상주 함수 만들기

 

STM8S에서 IAP 소스상에서 Flash 를 Block 으로 쓰기 위해서 RAM 상주 함수를 만들어서 사용하는데 ,

이유는 Flash를 1byte, 4byte,Block 단위 로 쓸수 있는데, 한번 쓸때 걸리는 시간이 3ms 정도다. 즉 1byte 를 쓰나 Block 단위로

쓰나 시간은 동일하다는 것이다. 문제는 1byte 와 4byte 는 flash 에서 쓸수 있으나 Block 은 RAM 에서만 쓸수 있다고

되어 있다. 시간을 줄이기 위해서는 무조건 Block으로 써야 한다.

 

그래서 IAP 소스를 살펴보니  아래와 같이 선언되어 있고

 

#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)

 

icf 파일에

 

initialize by copy { rw, ro section .tiny.rodata, section FLASH_CODE};

 

로 선언이 되어 있었다.

 

이부분을 예제 파일쪽에서 사용해 보기 위해서 예제 소스의 icf 파일에 아래처럼 되어 있는데

 

// Initialization
initialize by copy { rw section .far.bss,
                     rw section .far.data,
                     rw section .far_func.textrw,
                     rw section .huge.bss,
                     rw section .huge.data,
                     rw section .huge_func.textrw,
                     rw section .iar.dynexit,
                     rw section .near.bss,
                     rw section .near.data,
                     rw section .near_func.textrw,
                     rw section .tiny.bss,
                     rw section .tiny.data,
                     ro section .tiny.rodata};

 

이것을 아래 처럼 수정하고 해당 함수를 소스에 추가 해서 컴파일 했다.

 

// Initialization
initialize by copy { rw section .far.bss,
                     rw section .far.data,
                     rw section .far_func.textrw,
                     rw section .huge.bss,
                     rw section .huge.data,
                     rw section .huge_func.textrw,
                     rw section .iar.dynexit,
                     rw section .near.bss,
                     rw section .near.data,
                     rw section .near_func.textrw,
                     rw section .tiny.bss,
                     rw section .tiny.data,

rw,ro section .tiny.rodata ,section FLASH_CODE };

 

linker 에서 에러가 났다.

그래서 ro section .tiny.rodata ,section FLASH_CODE }; 로 수정했다.

 

그래도 linker 에서 에러가 났다.

 

IAR 메뉴얼에도 정확하게 표기가 안되어 있어서 고민중에 다른 사이트에서 ramfunc keyword를 찾아서 icf 파일은

원래대로 나두고 아래 처럼만 수정 했다.

 

__ramfunc void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)

 

이상 없이 컴파일 잘된다.

 

map 파일을 보면 아래처럼 되어 있다.

 

Mem_ProgramBlock        0x000010   0xd7  Code  Gb  util.o [1]

 

즉 0x000010 번지 (즉 RAM영억) 에 0xd7을 차지하는 Code 가 잡힌다는 것이다.

 

해결....

 

해당내용에 대한 사이트 링크 한다.

 

http://www.embeddedworld.co.kr/atl/view.asp?a_id=5681

 

 

 

 

 

 

 

STM8S 표준 회로도 자료및 컴파일설정 파일 자료

 

회로도/PCB/PARTLIST

 

um0482.zip

 

표준 컴파일 설정 파일 자료

 

 

stm8_stdperiph_lib.vol1.egg

 

stm8_stdperiph_lib.vol2.egg

 

 

 

 

STM8 중 가장큰 80pin 회로도 임

 

 

STM8S 용 RTOS 

 

open source 임 현재 버전은 1.3

 

링크사이트 : http://atomthreads.com/index.php?q=node/1

 

 

atomthreads-1.3.tar.gz

 

공부 해봐도 재미 있을듯 함 ..

STM8 관련 다양한 정리가 되어 있는 사이트

link 형태로 되어 있는데 따로 검색을 안해도 될듯

 

http://www.emcu.it/STM8.html

 

STVP와 ST-LINK 를 이용한 STM8S 양산

 

  • Project>New 를 선택 한다.

  • 신규 프로젝트 디렉토리를 선택하고 만든다. ( (예) STM8S103F3로 함)

  • 프로젝트 옵션을 선택 한다.

  • 프로젝트 옵션을 선택 한다.

  • 프로그램 메모리에 사용할 Hex 파일을 추가 한다.

 

  • 확인을 누르면 프로젝트가 생성 된다.

  • TAB 에서 Option Byte 항목을 에서 ROP 를 Read Out Protection ON 으로 설정 한다.

  • 기능에 따라 Hex 파일을 다운로드 한다.

그림 상의 1번( Program Current Tab or active sectors) 또는 Program > Current tab 의 경우 현재 선택 되어진 Tab 항목만 Writer 한다.

그림 상의 2번( Program All Tabs) 또는 Program > All tabs 의 경우 모든 설정된 Tab 항목을 Writer 한다.

(V3.2.7 은 OPTION BYTE tab 을 선택 하고 동작 해야 다른 Tab도 Writer 된다.)

STM8S 를 무료(?) 개발 환경이 있다.

컴파일러는 따로 깔아야 하는데 별루 인듯 ..

 

같이 깔면 ST Visual Programmer  가 있는데 STlink 를 이용해 양산용으로 사용할수 있다.

 

정식 명칭 STVD 으로 ST Visual develop IDE for developing ST7 and STM8 applications  약자다.

 

홈페이지 : http://www.st.com/internet/evalboard/product/210567.jsp

 

직접 받기 : http://www.st.com/internet/com/SOFTWARE_RESOURCES/TOOL/TOOLSET/sttoolset.zip 

 

직접 받기에서 다운 받을수 있다.

 

 

개발 환경 : Visual develop IDE (STVD)

 

 

 

 

양산용 프로그래머 : ST Visual Programmer (STVP)

 

 

 

 

 

 

+ Recent posts