ARMⓇ Cortex™-M0 Mini NuMicro 펌웨어 개발(Ⅲ)
지금까지 ARM 시리즈 Cortex-M0의 개발 환경과 내부 구조, 포팅을 통해 기술을 빠르게 익힐 수 있는 방법에 대해 살펴봤다. 이번 달에는 마지막으로 NuMicro ISP 프로그램 툴과 PAT-DAT-D8NE 타깃 보드에 대해 알아본다.
김형태 (conan@FirmwareBank.com)
NuMicro ISP Program Tool
ISP(In System Program)는 M051의 LDROM 영역에 2K바이트 크기의 부트코드를 미리 올려놓은 후 리셋 후 LDROM부터 부팅하도록 하는 방법이다. 부트코드의 경우, LDROM의 초기 시작에서 시리얼 통신으로 주어진 명령어가 입력되면 APROM의 플래시 영역을 지우고 시리얼 통신으로 들어온 바이너리 또는 HEX 코드를 다시 기록한다.
MPU는 리셋 후 시리얼 포트를 통해 특별한 명령어가 입력되지 않았을 경우 별도의 업데이트를 실행하지 않고 LDROM에서 APROM 영역으로 이동하여 실행을 계속한다. 모두 순식간에 일어나는 일이므로 사용자는 ISP를 실행하는지 알 수 없으며, 애플리케이션 영역만 실행한다고 착각하게 된다.
PC에서 바이너리 코드를 보내주려면 명령어와
코드를 적절히 제어해야 하는데, 이 때 사용하는 프로그램이“NuMicro ISP Program Tool”이라는 소프트웨어이다. 표 1을 참고하여 성공리에 설치하고 익혀보자.
기본 설치 경로는“/Program Files/ Nuvoton Tools/Nuvoton NuMicro ISP Programming
Tool, vx.xx/ NuMicro ISP Programming Tool.exe”이며 윈도우의‘시작/Program/ Nuvoton Tools’항목에 ISP
Programming()을 실행해도 된다.
1. ISP 소프트웨어 설치
NuMicro ISP Programming Tool.exe를 설치한다
2. ISP 프로그램 실행 ISP
Programming()을 실행한다.
실험 및 포팅을 위해 타깃 보드 D8NE와 USB 케이블이 PC와 연결되어 있을 경우, ISP 프로그램을 실행하고 PC COM 포트를 제어판에서 확인한 후 그림 1의 좌측 상단 ①번 ‘Connection Type’에서 COM 포트와 번호를 선택한다.
②번의‘Connection Check/Connect’를 누르고 타깃 보드의 리셋을 누르면, 소프트웨어와 보드가 인터페이스 상태로 된다.
연결됐다면 바이너리 코드를 다운로드할 수 있다. MDKARM에서 생성된 HEX 코드를 APROM 영역에 넣기 위해 경로와 파일 이름을 연결하고, 오른쪽 하단의 ③번‘Start’를 누르면 APROM 영역에 다운로드가 완료되며 보드는 PC와의 연결이 자동 해제된다. 보드 실행은 다시 리셋을 눌러 APROM부터 실행해야 한다.
또한 사용자 조작에 의해 부트코드에 있어서 프로그램이 지워질 경우에 대비하여 LDROM 영역에 Lock을 걸어두었다. 그래서 ‘Program/Config’를 선택하여 Config의 설정을 바꿀 경우 팝업으로 진행할 수 없다는 메시지가 나온다.
3. Hex 코드 생성
(1) 메뉴 실행 : Project/Option for Target/ Output/ Create HEX File
(2) 아이콘 실행() 후 항목 선택
(3) 단축키 실행(ALT+F4) 후 항목 선택
에러 없이 처리됐다면 결과 윈도우에 표 2와 같이 출력된다.
4. 프로젝트에서 Bin 코드 생성
바이너리 코드를 만들기 위해서는 ‘Project/Option for target/Run user Program…….’항목에 다음과 같이 기록하면 아웃풋 경로에 있는 *.axf 파일을 불러와 *.bin의 이미지를 생성한다. 특히 문장의 띄어쓰기에 주의해야 하며“.\”는 현재 프로젝트의 폴더를 나타낸다.
5. Bin 코드 생성(\는 \와 동일)
·메뉴 실행 : Project/Option for target/Run user Program…….
·문장 1 : fromelf --bin --output .\이름.bin .\프로젝트 이름.axf
·문장 2 : fromelf --bin --output .\@L.bin .\@L.axf
·문장 3 : fromelf --bin “. \@L.axf”--output“.\@L.bin”
PAT-DAT-D8NE Target Board
D8NE 타깃 보드의 경우, Cortex-M0를 효율적으로 익히기 위해 회로 설계와 아트웍(Artwork) 그리고 다수의 샘플 프로그램을 저자가 직접 만들었다. PAT-DAT-D8NE Target(이하 D8NE)은 Nuvoton社의 CortexTM-M0, MINI54ZAN(표 3의 밑에서 두 번째) 모델이 사용됐고 CPU와 UART 소자가 붙어 있어 가장 중요한 메인보드에 해당한다. 메인보드에는 5*2 헤드 소켓 4개로 케이블을 통해 슬롯으로 확장할 수 있도록, QFN33핀 거의 대부분을 2.54mm의 헤더 핀에 연결해 놓았다.
그림 7에서 오른쪽은 PC에 연결되고 왼쪽은 타깃에 연결되는 미니 타입 소켓이다. 준비할 USB 케이블 길이는 1.2m정도면 된다.
1. Mini USB Cable
·한쪽은 PC에 연결 A Type
·반대쪽은 Mini 5핀 B Type
만약 없을 경우 다음 사이트를 참고하고, 검색어는‘USB 미니케이블(Mini A type 5핀)’,‘ Mini USB 5P Cable(1m)’로 하면 된다.
·펌웨어뱅크 : www.firmwarebank.com/sub_c1.php?c_code1=15
·엘파츠 : www.wooriparts.com/ shop/item.php?it_id=1236065050
·디바이스마트 : www.devicemart.co.kr
D8NE 보드는 USB를 시리얼로 변환하는 Silicon Labs(www.silabs.com)社의 CP2102 칩을 사용한다. 이 칩은 USB 드라이버가 설치되어 있지 않으므로 다운 받은 파일을 통해 드라이버를 설치해야 한다.(표 4)
D8NE 타깃의 전기적 안정을 위해, 우선 USB 케이블의 미니 5핀 포트를 타깃 보드에 먼저 연결하고 직사각형 모양의 A Type 잭을 PC의 USB에 연결한다. 케이블을 연결하면 USB가 자동 감지되며, 처음에 드라이버가 정확히 설치됐다면 다시 설치할 필요가 없다.
만약 설치가 순조롭지 않다고 판단되면 제어판에서 드라이버를 삭제한 후 다시 진행하고, 성공적으로 설치됐다면 압축을 푼 경로와 파일은 지워도 된다.
정상적으로 설치됐을 경우 XP는“시작/제어판/시스템/하드웨어/장치관리자”에서 USB 디바이스와 COM 포트 번호를 확인할 수 있어야 한다. 그렇지 않을 경우 드라이버를 지운 후 재설치하는 것이 좋다.
드라이버와 COM 포트가 확인됐다면 PC와 연결된 D8NE에 프로그램을 이식하자. 처음부터 프로그램을 만드는 것은 복잡하므로 다운받은 폴더의 프로그램 항목에서“D8NE_Quick_ Start”경로의 프로젝트 파일을 MDK-ARM에서 오픈할 것이다.
2. 샘플 코드
·압축 파일 경로 : D8NE/D8NE_ Program_Vxx
MDK-ARM 통합환경의 메뉴‘Project/Open Project’에서 D8NE. uvproj 파일을 열자(표 5). 반드시 프로젝트로 오픈되어야 한다.
정상적으로 프로젝트를 불러왔다면 Rebuild ()를 이용하여 컴파일과 링크를 실행한다.
컴파일과 링크가 에러 없이 실행됐다면 HEX 코드가 만들어졌으며 포팅 준비가 끝난 것이다. 아웃풋 윈도우를 통해 다음과 같은 사항을 확인할 수 있다.
MDK-ARM 컴파일러의 상세한 사항은 Quick Start/MDK-ARM Compiler에서 다루었으므로 선행학습 차원에서 참고하도록 하자.
Build target‘ NULINK’
assembling startup_MINI51.s...
compiling retarget.c...
compiling DrvSYS.c...
compiling DrvGPIO.c...
compiling system_MINI51.c...
compiling DrvUART.c...
compiling DrvADC.c...
compiling D8NE_Main.C...
linking...
Program Size: Code=5904 RO-data=292
RW-data=64 ZI-data=1216
FromELF: creating hex file...
“D8NE.axf”- 0 Error(s), 0 Warning(s).
지금까지 최종 목적인 D8NE.HEX 코드를 생성했는데, 이를 타깃에 이식하고 Run하면 작성한 소스대로 동작된다.
LDROM 영역에 있는 ISP 부트코드를 사용하려면 HEX 코드를 PC에서 보내주는 프로그램‘NuMicro ISP Program Tool’이 있어야 한다.
사용 방법은 Quick Start의“NuMicro ISP Program Tool”부분을 참고한다.
한번 선택된 경로는 다시 바꾸지 않아도 되므로 그 다음부터는 소스만 수정하고 컴파일하여 특별한 설정 없이 로딩하면 된다.
// ========================================
// D8NE_Main.c
/* Purpose : Cortex-M0 for Mini
Project Name : D8NE
Compiler : MDK ARM Compiler
Document : OHIT_D8NE_History.txt
-------------------------------------
Copyright by www.FirmwareBank.com All Rights Reserved. */
#include“ GLOBAL.H”
// UART
STR_UART_T sParam;
unsigned char get_char;
#define QSIZE 64
struct stQueue{
char data[QSIZE];
unsigned long wp;
unsigned long rp;
}q;
void QueueInit(void);
unsigned char check_pop(void);
void UART0_Int_Handler(uint32_t param){
uint8_t rxdata[1];
if(DrvUART_GetIntStatus(UART_PORT0, DRVUART_ RDAINT)){
DrvUART_Read(UART_PORT0, rxdata, 1); // 1바이트의 데이터를 읽고
q.data[q.wp]=rxdata[0];// RX로 받은 데이터를 Queue에 넣음
q.wp++;
if(q.wp>QSIZE) q.wp=0;
}
}
int main(void){
UNLOCKREG();
//Enable internal 22M Crystal
DrvSYS_Open(OSC22M_CLK);
// Waiting for 22M Xtal stable
while (DrvSYS_GetChipClockSourceStatus(OSC22M_CLK) != 1);
// for UART
DrvSYS_SelectIPClockSource(UART_CLK_SET, 3);
// internal 22M
DrvGPIO_InitFunction(FUNC_UART);
sParam.u32BaudRate = 115200;
sParam.u8cDataBits = DRVUART_DATABITS_8;
sParam.u8cStopBits = DRVUART_STOPBITS_1;
sParam.u8cParity = DRVUART_PARITY_NONE;
sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;
sParam.u8TimeOut = 0; DrvUART_Open(UART_PORT0, &sParam); // Set
UART Configuration
// Install Callback function
DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT|DRVUART_TOUTINT,UART0_Int_Handler);
// UART Start
printf“( \nThis Project UART Communication 115,200BPS at D8NE Target Board\n”);
DrvUART_Write(UART_PORT0,“ UART Function use Interrupt Call Back\n”, 37);
while(1){
if(check_pop()){
(void)DrvUART_Write(UART_PORT0, &get_ char,1);
}
}
} // end main
void QueueInit(void){
q.rp = q.wp = 0;
}
unsigned char check_pop(void){
if(q.rp != q.wp){
get_char=(q.data[q.rp]);
q.rp++;
if(q.rp>QSIZE) q.rp=0;
return(1);
}
return(0);
}
// ========================================
타깃 보드는 실험용 확장을 고려하여 전원을 포함, 10핀의 S1, S2, S3, ICE를 통해 외부로 연결했다.
회로도는 실험 중 절취할 수 있도록 원고 뒷부분에 준비했으니 참고하기 바란다.
3. Target Spec
·MPU : Cortex-M0, MINI54ZAN(APROM 16K, RAM2K)
·Clock : 내부 22MHz
·USB2Serial : CP2102
·LED : Power 4개
·Sensor : 온도센서(25℃ 10kΩ)
·확장 슬롯 : S1, S2, S3, ICE
·크기 : 90mm×35mm
참고자료
1. D8NE 외관과 소켓 신호
그림 13을 참조한다.
2. D8NE 회로도
그림 14를 참조한다.
HEX Code, BIN Code 생성 방법
마이크로프로세서의 실행 파일에 해당하는 *.Hex 코드나 *.Bin 코드를 생성하기 위해서는 다음의 절차를 이용하면된다.
■ 프로젝트에서 Hex 코드생성
Hex 코드는, ‘Project/Option for Target…….’를 실행하여
‘Output’탭에서‘Create HEX File’을 선택하면 컴파일할 때 에러가
발생하지 않았을 경우 C/C++ 소스 코드를 기계어 코드로 변환해준다. 생성 파일이름은‘Name of Executable’에 있는 단어로 HEX
의 확장자를 갖는다. 즉, 컴파일을 거친 뒤 만들어진 *.ELF 파일로
*.HEX가 만들어진다
Copyright ⓒ 첨단 & Hellot.net