2012년1월18일_LPCXpresso_LPC Link보드(디버거)와 Taget Board(MCU)를 분리하고 간단히 GPIO를 테스트



약 3년간 묵혀 놓은 개발보드를 꺼내 귀차니즘을 타파하고 재미난걸 만들기 위해 공부를 시작하였다.
LPC1114칩은 Datasheet를 보고 프로그래밍하는게 아니라 Manual을 보고 해야한다. 이 점이 ATMEL과 다르다.






우선 LPCXpresso 개발보드를 보면 좌측사진과 같이 심플하고 멋지게 디자인되어 있다. Embed Artist에서 설계해서 그런가 ㅎㅎ
이대로 납땜해서 테스트를 해도 되나 좀 불편했다. 그리고 여분으로 사둔 LPC11XX MCU들로 나만의 시스템을 만들었을 때 필요하니..
디버거와 타겟보드를 분리하기로 하였다.
그런데 시작을 보다시피 오전0시 50분쯤부터 시작하였으니 잠을 자지 못 하였다. (예상외로 어려웠음 ㅠㅠ)
우측사진과 같은 작은 톱을 준비하고 바닥에는 신문지를 깔았다.






잘단해야 하는 부분을 클로즈업하여 찍었다. 2.54mm간격이니 얼마나 좁은지ㄷㄷ
정밀하게 잘라야한다. 전문가들은 어떻게 자르지?
그런데 PCB업체에 의뢰할 때나 아트웍할 때 V-cut을 넣을 수도 있을 건데 없어 불편했다. (뒷면에..)



엄청 오래 자르는 모습...주변 칩과 수동소자들이 상할까 조심조심하느라 매우 힘들었다. (땀땀)
자르는 것으로 끝이 아니고 사진은 없지만..
몰렉스8핀 커넥터를 납땜하고 몰렉스 암컷의 작업을 하느라 시간이 많이 걸려 2시간정도 걸리고..
처음 테스트에 실패해 점프선을 바꾸고 다시 커넥터 작업하고 하니..약 5시간이 소요되었다.. 나 왜 이러니 ㅠㅠ
일단 집에서 간단히 LED점멸 코드를 테스트하니 잘 되서 바로 잠이 들었다가..1시간 후에 일어나 학교갈 준비를 하였다. ㅠㅠ




 

테스트를 위해 브레드보드에 장착하고 LED와 연결한 모습.
단순히 GPIO의 출력을 확인하기 위한 용도이다.
그런데 일부 포트에 LED를 물리면 디버깅이 불가능한 현상이 일어나 사용가능한 아래의 테이블로 정리하였다.
(아직 이 칩에 대해 확실히 알고 있는게 아니니 일단 회피하는 방향으로 추진하고 GPIO에 대해 좀 더 조사/연구하고 실습할 예정)

포트

0

1

2

3

4

5

6

7

8

9

A

B

0

O

O

O

O

O

1

O

O

O

O

O

2

O

O

O

O

O

O

O

O

O

3

O

O

O

O

O

O

   

포트0 - 5개,
포트1 - 5개,
포트2 - 9개,
포트3 - 6개로 총 25개의 핀이 GPIO로 사용가능하다. (사실 더 많으나 자유롭게 사용한 포트를 말함.)


 


LED를 하나씩 켜서 보드를 한 바퀴도는 코드를 실행 중이다. 

● 테스트코드

   1: typedef struct
   2: {
   3:     char cPort;
   4:     char cBit;
   5: }LED;
   6:  
   7: LED aLED[] =
   8: {
   9:         0, 5,
  10:         0, 4,
  11:         1, 9,
  12:         1, 10,
  13:         1, 11,
  14:         2, 3,
  15:         3, 4,
  16:         3, 5,
  17:         2, 6,
  18:         2, 7,
  19:         2, 8,
  20:         2, 9,
  21:         2, 10,
  22:         3, 3,
  23:         3, 2,
  24:         3, 1,
  25:         3, 0,
  26:         0, 6,
  27:         1, 8,
  28:         1, 4,
  29:         0, 11,
  30:         2, 2,
  31:         2, 1,
  32:         2, 0,
  33:         0, 7
  34: };
  35:  
  36:  
  37: for(iCnt = 0 ; iCnt < (sizeof(aLED) / sizeof(LED)) ; ++iCnt)
  38: {
  39:     GPIOSetValue(aLED[iCnt].cPort, aLED[iCnt].cBit, 0);
  40:     delay();
  41:     GPIOSetValue(aLED[iCnt].cPort, aLED[iCnt].cBit, 1);
  42: }

main( )의 핵심코드만 올렸다. 구조체배열을 선언하고 포트와 비트값을 넣는데 보다시피 순서대로가 아니라 뒤죽박죽이다.
AT91SAM7S256보드는 PA0, PA1, PA2,...순서대로 되어 있어 배선하기 쉬울텐데 이건 좀 머리 아프겠다 ㅎㅎ
나만의 시스템을 구현할 꺼면 별 상관없지만 이 보드를 그대로 써서 응용하라면 좀 어렵겠다.
그래도 Cortex-M0는 큰 시스템(임베디드에서)이 아닌 AVR이나 PIC과 같이..
작은 어플리케이션을 위한 MCU니 이런건 큰 문제가 되지 않는다.
3만원에 디버거까지 주는 MCU는 AVR, PIC, 8051, ARM7 TDMI 그 어느 것..어디도 없다.
대신 디버거가 지원하는 칩의 종류가 NXP사로 매우 한정된다. 별 문제 없을듯..NXP사 Cortex M0/M3는 매우 싸다.

GPIO레지스터에 접근하는 방법은 여러가지가 있다..
① 주소를 통한 직접 접근                            *((volatile unsigned int *)0x50003FFC) = 값;
② 구조체를 통한 직접 접근                         LPC_GPIO[0]->DATA = 값;
③ 라이브러리함수를 통한 비트별 간접 접근      GPIOSetValue(0, 7, 1);      // LED를 켠다.

이 중에서 목적에 맞게 3번을 선택하여 코딩.





 

회로도를 보면 알겠지만 주변회로가 매우 깔끔하니 심플하고 쿨하게 설계할 수 있다.
이 점은 큰 장점일듯...AT91SAM7S256은 기능이 많으나 주변회로가 복잡해. 손으로 납땜하기 곤란했었다.
FLASH용량은 32KBytes로 좀 작은 편이나 써본 결과 그다지 작은게 아니다. 오히려 많은게 거추장스럽다. (코스트상승)

”소 잡는데 닭 잡는 칼을 써도 아니되지만..닭 잡는데 소 잡는 칼을 쓰는 안 되는 것이다. 회사 망한다.” – 수만






디버거보드를 클로즈업해서 찍은 것으로 소자의 배치가 매우 아름답다.
일단 회로도는 공개인데 F/W는 잘 모르겠다. 보드가 싸서 클론 만들 이유가 없을듯..
J-Link v8클론을 사용 중인데 JLINK보다 약간 느린데 크게 불편함은 모르겠다.JLINK가 0.5초 걸린다면 LPCXpresso는 1초 걸린다고할까?
2배 차이가 아니라 별 차이 없다는 뜻이다. ㅋㅋ
단, 이클립스기반의 IDE가 매우 무겁다. i7-2세대 CPU와 SSD가 달린 노트북에선 5초안에 컴파일 링크 디버거연결등등이 완료된다면..
학교컴 팬티엄4 시더밀631 삼송저질하드가 달린 데스크탑에선 하루 죙일 걸린다. ㅋㅋ (약 30초)
암튼 개발환경이 좀 무거운편이다.

LPCXpresso는 내부에 GCC와 GDB를 cygwin환경에서 사용하는 것 같다. 에러메세지 내용과 콘솔창을 보면 알 수 있다.
공짜 컴파일러(?)를 사용해서 저질같다고 할지 모르겠는데 나는 그렇게 생각하지 않는다. 이 정도 매우 좋은 개발환경이다.
상용컴파일러가 당연히 좋은 것은 알고 있다. 그러나 GCC로도 뭐든지 다 할 수 있다. (도구를 탓하는 사람은 개발자가 아니다.)
암튼 공짜로 주는 128KBytes까지 코드생성이 가능한 CODE RED의 IDE는 훌륭한 프로그램이다.