이 문서를 만든 이유

어느 날 갑자기 dacs1000 의 hex 파일을 플래시에 구울 일이 생겼다.
나는 아무 생각없이, 다음과 같이 실행하였다.

#cd flash_burner
#gmake
#gmake run

결과는 실패였다.

==============================================
             STAPI Demo Software
          Oct 12 2004 at 14:16:49
        Chip STi5517 in board MB382
         CPU Clock Speed = 180000000
==============================================
 
Loading 'C:\STM\flash_burner\arena.hex' into memory, wait .. 3613470 bytes
Converting file in memory, wait .. Invalid address 0x7fe00000
 
Invalid file
STFLASH_Close()=Ok
STFLASH_Term(Bank0)=Ok

주소가 다르다는 것이었다. 음, 그제서야 나는 뭔가 잘못 되었음을 느끼게 되었다.
동시에 전에 이런 문제가 생겼을 때, 어떻게 했다는 문서를 남기지 않은 것을 후회했다. 그래서 지금이라도 이에 대한 문서를 남기기로 했다.

flash_burner 컴파일하기

flash_burner 은 DACS1000, DAC5000 과 달리 컴파일시에 5517ref 에 링크된다. 그래서 간혹가다가, 플래시를 쓰다가 에러가 나거나 컴파일시에 에러가 난다면 5517ref 를 의심해 보아야 한다.

특히, mb382_emi.cfg 의 wait 세팅이 반대로 되어 있다던지 할 수 있기 때문에 반드시 5517ref 를 살펴보기 바란다.
가장 빈번한 에러가 flash 관련 api 함수를 찾을 수 없다고 나오는 것인데, 이때는 5517ref 의 .lib 에서 stflash 가 빠진 경우이다. makefile 을 수정해서 다시 .lib 를 생성하면 된다.

많은 삽질을 통해 알게된 사실이지만, 내가 가지고 있는 flash_burner 은 hex 파일의 첫 주소 번지가 0x7fa00000 로 시작하는 hex 파일만 제대로 구워졌다. 하지만, 제대로 구워졌더라도, 제대로 부팅이 되지 않았다.
내가 생각해도 이상했다. 0x7fe00000 , 0x7f800000 도 아니라니..-_-
해결 방법은 너무도 간단했다.
'c:\stm\5517ref\include\Mb382.h' 파일을 보자!!!

/* FLASH ------------------------------------------------------------------- */
 
/* One ST M58LW064O, 64-Mbit (4M x 16) */
 
/* Base addresses */
#define FLASH_BANK_0_BASE_ADDRESS       0x7Fa00000      /* EMI region 3, bank 5 */    -> 바로 요기닷!!!  0x7Fe00000 으로 수정
 
/* Block size within each FLASH device */
/* The device is configured as 64 blocks, each of 64K x 16 bits */
#define STFLASH_MAIN_SIZE               0x00020000
 
/* Bank offsets: obsolete on this device where they are uniformly spaced */
#define STFLASH_MAIN_0_OFFS             0x00000000
#define STFLASH_MAIN_1_OFFS             (STFLASH_MAIN_0_OFFS + STFLASH_MAIN_SIZE)
 
 
/* Board-specific Shortcuts */

위와 같은 부분이 있다. 저기서 FLASH_BANK_0_BASE_ADDRESS 를 바꾸어준다. 만일 0x7Fe00000 으로 바꾸어주었다면, hex 파일 첫 주소가 역시 0x7Fe00000 이어야 한다. 만일 두 값이 일치하지 않으면, 위와 같은 에러가 날 것이다.

또한 플래시를 0x7Fe00000 으로 해주었더니, 제대로 동작하였다. 그러므로, 반드시 이 주소로 해주어야 한다.

DACS1000 에서는 플래시 용량이 2M 였다. 하지만 DAC5000 으로 넘어오면서 8M 로 바뀌었다. 또한 프로그램 hex 파일 용량도 증가하였는데, 급기하 요즘에는 arena.hex 파일의 용량이 5M 를 넘어섰다.

그전까지만 해도 flash_burner 로 플래시에 정상적으로 write 했었다. 하지만, 늘어난 용량 탓인지, 제대로 수행되지 않았다.
아래의 에러 메세지들이 바로 그것이다.

Loading 'C:\STM\flash_burner\arena.hex' into memory, wait .. enough memory size    --- 1
Loading 'C:\STM\flash_burner\arena.hex' into memory, wait .. 5701580 bytes   
Converting file in memory, wait .. Program Limitation    --- 2

각각의 문제에 대한 해결책을 알아보자! 먼저 1 의 경우는 flash_burner\main.c 파일을 수정해주어야 한다.

/* Definitions ------------------------------------------------------------ */
 
#if defined(UNIFIED_MEMORY)
#define SYSTEM_MEMORY_SIZE 0x0650000 /* 3Mb */   // 이와 같이 값을 늘려준다
#else
#if defined(mb314) || defined(mb282b)
#define SYSTEM_MEMORY_SIZE 0x0800000 /* 8Mb */
#else
#define SYSTEM_MEMORY_SIZE 0x1d00000 /* 30Mb */
#endif
#endif
#define NCACHE_MEMORY_SIZE 0x0080000 /* 0.5Mb */

2의 경우에는 flash_burner\tt_flash.c 파일을 수정해주어야 한다.

//#define NUM_SECTIONS    12
#define NUM_SECTIONS    96          // 이와 같이 값을 늘려준다
#define TOTAL_BLOCKS    (NUM_BANKS * NUM_BLOCKS)
 
#define CR              13
#define LF              10
  • computer/digitalarena/flash_burner.txt
  • Last modified: 4 years ago
  • by likewind