메뉴 방식 사용자 인터페이스는 직관적인 인터페이스를 가지므로 굳이 사용법을 배우지 않더라도 쉽게 사용할 수 있다.그러나, 원하는 기능을 수행하기 위해서는 여러 단계를 거쳐야 하고, 또다른 기능을 수행하기 위해서는 최상위 단계까지 나온 다음 새로운 단계로 들어가야 한다. 즉, 사용법은 쉽지만 절차가 복잡하다는 단점이 있다.이와 다르게 이번에 설명할 CLI 기능은 명령어 방식을 적용하여 필요한 기능을 즉시 수행할 수 있도록 해준다. 특히 임베디드 시스템의 개발 단계에서 필요한 기능을 시험할 때 유용하게 사용할 수 있으므로 알아두면 도움이 될것 같다.CLI의 단점은 자주 사용하는 명령어는 문제 없지만 가끔씩 사용하는 명령어는 사용법을 기억하지 못하여 문서를 만들어 두거나 소스를 분석해야 하는 경우가 있다. 이..
앞에서 설명한 글들에서는 사용자로부터 입력을 받는 방법에 대해서 설명하였다.이번 글에서는 앞의 내용들을 응용하여 사용자의 입력을 받아들이고, 사용자가 원하는 기능을 수행해 보는 방법중 하나인 메뉴 방식 사용자 입력에 대해서 설명하도록 하겠다. extern void root_menu(char *); void loop(void) { root_menu("Just4fun Online Market"); } loop() 함수에서 root_menu()를 불러 메뉴 방식 인터페이스를 시작하도록 한다. static int get_menu_num(void) { int num; char *cmd = wait_command(); num = strtol(cmd, NULL, 0); return num; } static void ..
일반적인 C 프로그램은 다음과 같은 코드로부터 시작 한다.C 프로그램은 반드시 main() 함수로부터 시작 되며, main() 함수의 argument는 int argc, char *argv[]를 가진다. 때로는 세번째 argument로 char *envp[]를 가질수도 있지만 대부분의 경우 사용하지 않는다.argc와 argv는 쉘에서 프로그램을 실행할 때 실행파일 뒤에 연달아 입력되는 문자열의 개수와 각각의 문자열에 대한 포인터값을 알려주기 위하여 사용된다. #include int main(int argc, char *argv[]) { int i; printf("Number of Arguments: %u\n", argc); for (i=0; i
이번 글에서는 실제로 사용자가 하나씩 입력하는 문자를 버퍼에 저장하였다가, 사용자가 엔터키를 누르게 되었을 때 저장해 둔 문자열을 리턴해 주는 코드를 만드는 방법에 대해서 설명하도록 하겠다.#define CTRL_B 2 #define CTRL_C 3 #define CTRL_F 6 #define EOL '\0' #define ENTER '\r' #define BS '\b' #define ESC 0x1B #define ESC2 '[' #define DELIMIT '~' #define DELETE 0x7F #define UP_ARROW 'A' #define DN_ARROW 'B' #define RI_ARROW 'C' #define LE_ARROW 'D' static char command_buf[BD_CMD_..
많은 임베디드 시스템은 사람의 개입없이 자동으로 미리 설정된 조건에 따라 동작되도록 만들어져 있다. 그러나, 또다른 많은 임베디드 시스템은 사람의 직접적인 조작을 필요로 하기도 한다.임베디드 시스템에 적용할 수 있는, 사용자의 입력을 받아 들이는 방법과 결과를 알려주는 방법은 셀 수 없이 많겠지만, 그 중에서도, 임베디드 시스템 개발 단계에서 가장 쉽고 유용하게 선택할 수 있는 기능인 UART를 통한 사용자 인터페이스에 대한 설명을 진행해 보도록 하겠다.지금까지는 주로 보드의 동작 상태를 확인하거나 디버거 메시지를 출력하기 위하여 UART를 사용하였다면, 앞으로 설명할 내용들은 사용자의 입력을 어떤 방식으로 처리할 것인지에 대한 내용을 다룰 것이므로 알아두면 유용하게 활용할 수 있을 것이다.먼저 확인할 ..
VS1003 자체적으로 제공하는 테스트 모드를 이용하여 sine파를 생성 시키는데 문제 없음을 확인한 다음, 실제 mp3파일 일부분을 추출해서 스피커로 재생시켜 보도록 하겠다. const unsigned char MP3_DATA[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0..
앞의 글에서 vs1003이 정상적으로 동작될 수 있는지 확인해 보기 위하여 특정 sine파를 생성해 보았다. 또한 적절한 음량 설정이 되는지도 같이 확인해 보았다.이번 글에서는 사용자 입력을 받아서 주파수값과 볼륨 크기를 변경 시켜 보는 기능을 구현해 보기로 하겠다.먼저 UART를 통한 사용자 입력을 제대로 받아들이는지 확인해 보는 코드부터 만든다. void loop(void) { switch (getc()) { case 'v': printf("Volume Down 1\n"); break; case 'V': printf("Volume Up 1\n"); break; case '': printf("Volume Up 10\n"); break; case 'i': printf("FsIdx Down\n"); bre..
VS1003 문서를 보면 몇가지 자체적으로 시험을 해 볼수 있는 기능을 제공하는것을 알 수 있다.이번 글에서는 그중에서 Sine파를 생성 시켜 보는 방법에 대해서 설명하도록 하겠다.테스트 모드로 전환하기 위해서 SCI_MODE 레지스터에 있는 SM_TESTS비트를 1로 만든다. 이 상태에서 SDI 버스로 특정 데이터를 내 보내면 미리 설정된 시험 동작을 수행하게 된다.Sine파를 생성하기 위한 데이터는 0x53 0xEF 0x6E n 0 0 0 0 이다. 여기에서 n은 다음과 같은 표를 참조하여 설정하면 된다.n 바이트 값의 상위 3비트에 해당되는 FsIdx값에 따라 Fs값이 결정된다. 이 값에 n 값의 하위 5비트 값을 곱한다음 128로 나누면 그 값에 해당되는 주파수를 가지는 sine 파가 발생하게 된..
회로를 구성한 후 첫번째로 해야할 일은 vs1003안에 있는 control register를 제대로 읽어오는지 확인해 보는 것이다.먼저, SPI를 비롯하여 vs1003과 연결된 GPIO 핀 설정부터 한다. #define VS1003_RESET GPIO_PIN1 #define VS1003_DREQ GPIO_PIN2 #define VS1003_DCS GPIO_PIN3 #define VS1003_CCS GPIO_PIN4 #define VS1003_SCK GPIO_PIN5 #define VS1003_MISO GPIO_PIN6 #define VS1003_MOSI GPIO_PIN7 static inline void vs1003_enable_ccs(void) { gpio_out_reset(GPIO_PORT_A, VS..
이번 프로젝트에서는 임베디드 시스템에서 MP3 파일을 재생하기 위한 vs1003 칩을 다루어보도록 하겠다.VS1003 칩 제조사 홈페이지에 들어가보면 datasheet 문서와 참고 자료를 다운 받을 수 있으므로, 관련 자료를 다운 받은 후 어떤 내용이 있는지 충분히 이해되도록 여러번 반복해서 읽어 본다.Datasheet 첫번째 페이지에 vs1003의 내부에 어떤것들이 들어있는지와 칩 외부로 나오는 핀들에 대한 설명을 한눈에 볼 수 있는 블럭도가 있다. Datasheet에 보면 reference schematic이 제공되므로 직접 하드웨어를 만들수도 있겠지만, 편의상 비교적 저렴한 가격에 구입할 수 있는 상용 제품을 이용하여 프로젝트를 진행하도록 하겠다.이 프로젝트에서 사용하게 될 모듈은 다음과 같은 제품..