이번엔 ARM의 외부 IO핀의 입출력 테스트를 한번 해보겠습니다. 그게 뭐 항상 그렇듯이 거창한건 아늬고...^^... 그냥 스위치는 잘 눌러졌는지, 그래서 ARM은 내가 스위치를 눌렀다는 사실을 잘 알고있는지. 또... ARM은 나한테 기본적 신호를 잘 주고있는지. 그래서 난 그걸 잘 알수있는지만 한번 보겠습니다.

일단, 이전에 쭈욱 이야기했던 데로 설치된 WinARM과 이 이전 글에서 만든 보드를 가지고 테스트를 해보도록 하겠습니다. 그 전에 먼저, 이전에 이야기했지만, 아래 화일들은 모두 같이 있어야합니다.

   AT91SAM7S256.h
   AT91SAM7S256-RAM.ld
   AT91SAM7S256-ROM.ld
   Cstartup.S
   Cstartup_SAM7.c
   lib_AT91SAM7S256.h
   makefile
   OK7S256gcc.h


그리고,  WinARM.xml 화일을 수정해서 자신에게 맞는 경로를 지정해야만 합니다. 그리고, 아직 저는 아무것도 모르는 거랑 비슷한 상태니까...ㅋㅋ... 저 위의 화일들은 그냥 써야만 하는 구나 하고 생각하죠... 그러나 OK7S256gcc.h라는 화일은 한번 열어봐야겠습니다. 그걸 열어보면 각종 정의들이 나열되어 있는 것을 볼 수 있는데요. 그중 제가 연결하지 않은 buzzer나 beep같은 정의와 코드는 삭제했습니다. 그리고,

(코드1)
void LED_on(unsigned int led)   /* LED on */
{ 
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LED2|LED1); // PA1-PA0 = output
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, led);
}

void LED_off(unsigned int led)   /* LED off */
{ 
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LED2|LED1); // PA1-PA0 = output
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, led);
}


와 같이 되어 있는 부분을

(코드2)
void Pin_Clear(unsigned int pin)
{ 
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, pin); 
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, pin);
}

void Pin_Set(unsigned int pin)
{ 
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, pin); 
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, pin);
}



로 변경했습니다. 이유는 윤덕용님의 교재는 PA0와 PA1을 LED에 물려서 사용하고 있지만, 저는 LED를 물려놓지 않고 그 많은 외부핀들의 역활을 아직 설정하지 않아서이지요... 그래서 주 코드에서 편하게 Set/Clear를 할 수 있도록 두었습니다. 또한 LCD관련 정의와 함수들은 아직 LCD를 연결하진 않았지만, 곧 연결하고 싶으니까 그것도 그대로 두도록 하죠..

위의 코드를 보면 AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, pin); 라는 부분은 ATMEL에서 준비해준 lib_AT91SAM7S256.h에 있는 함수입니다. 역활은 해당 핀의 성격을 출력으로 결정하는 겁니다. 그리고 AT91F_PIO_ClearOutput, AT91F_PIO_SetOutput는 문자그대로 해당핀의 출력을 Set/Clear시키는 것입니다.

그리고, OK7S256gcc.h라는 화일을 계속 보면, 몇몇 유용한 함수들이 보입니다. delay문들도 보이구요. 그중 키 입력에 관한 함수 Key_in이 또한 준비되어있네요. 이제, PA7/PA8에 연결된 버튼을 누르면 각각 PA0/PA1이 SET되게 아니면 CLEAR되게 해보죠.

(코드3)
#include "AT91SAM7S256.h"
#include "lib_AT91SAM7S256.h"
#include "OK7S256gcc.h"

int main(void)
{
 unsigned int key;
 
 MCU_initialize();    // initialize AT91SAM7S256

  while(1) {
  key = Key_in();
 
  if(key == 1) {
   Pin_Set(PA0);
   Delay_ms(100);
  }
  else if(key == 2) {
   Pin_Set(PA1);
   Delay_ms(1000);
  }
  else {
   Pin_Clear(PA0|PA1);
  }
 }
}



..예.. 압니다.. 너무 쉽자나요....^^ 뭐 그래도 일단 내맘대로 코딩된것이 처음이니까.. 그 나름대로 가치가 있다고 해두죠....^^
1번키인지 2번키인지 검출합니다.  이제 큰 어려움없이 보드도 가지게 되었고, 외부핀 테스트를 한번 수행해 보았네요... 뭐 그닥 아름다워보이진 않지만, 나머지 모르는건 차차 공부하죠 뭐... 어차피 취미생활로 시작한 ARM인데요...ㅋㅋ 마지막으로 필요한 화일을 압축해서 올립니다. 
   initial_file.zip



저작자 표시 비영리 변경 금지
http://pinkwink.kr/trackback/31 관련글 쓰기