무엇이 문제인가??
앞에서 TBX 를 테스트 하면서, UART 를 사용했었다. 현재 우리의 STB 에서는 시리얼 포트를 지원한다. 왜 시리얼 포트를 지원하는가 에 대해서는 앞의 관련문서에서 설명한 바있다.
TBX 실험결과 UART 는 제대로 동작하였다. 중간에 깨지는 문자도 없었다.
하지만, 듀얼 부팅을 테스트하면서, 문제가 발생되었다. 듀얼 부팅시에 새로운 .hex 파일을 시리얼로 전송받아서 플래시에 구워야 한다.
그런데, 약 3 M 정도되는 .hex 파일을 전송하니, 받는 UART 쪽에서 OVERFLOW 에러가 났다. 아마도 대용량의 데이터를 계속 보냄으로서, 받은 쪽에서 미쳐 처리하지 못하고, 데이터가 도중에 날라가는 것 같았다. 그래서 지금 현재는 1 비트씩 보내고 있다. 내가 듣기로 시간은 약 3분 30초 정도..
나의 생각
모르긴 몰라도, 시리얼 포트로 파일을 전송받아서 플래시에 쓰는 방법은 비효율적인 듯하다. 프로그램 펌웨어를 업그레이드 하는 데, 3분 이상 걸린다는 것은 아무래도 시리얼 포트로는 적합치 않은 것 같다.
요즘 나오는 evolution 보드만 보더라도, 거의 USB 를 사용한다. 아무래도 속도의 차이인 듯 싶다. 시리얼 포트는 디버깅을 위한 도구로만 사용되기 위해 ST 에서 나온 것 같다.
초기화시 문제
예전에 gpio 핀이 콘트롤이 안되는 문제가 있었다. 문제의 원인은 uart 가 init 되면서, 건드리지(?) 말아야 하는 핀까지 건드린 것이 문제였다.
현재 보드에서 총 2개의 시리얼 포트를 사용한다.
- 디버깅 용도(ASC2)
- 프론트 통신 용도(ASC1)
위에서 사용하는 포트 외의 핀들은 uart 에서 init 해 줄 필요가 없다. 그래서 uart_init() 함수를 아래와 같이 수정해 주어야 한다.
/*------------------------------------------------------------------------- * Function : UART_Setup * : * Input : * Output : * Return : Error Code * ----------------------------------------------------------------------*/ ST_ErrorCode_t UART_Setup(void) { ST_ErrorCode_t ST_ErrorCode = ST_NO_ERROR; U8 InitList[] = { SC1_UART_DEV, MODEM_UART_DEV, UART_END_OF_LIST }; U8 index; for ( index = 0; InitList[index] != UART_END_OF_LIST; index++ ) { ST_ErrorCode |= uart_init(InitList[index]); } // ST_ErrorCode = uart_init(3); return ( ST_ErrorCode ); }
디바이스 | 장치명 | 이름 |
SC1_UART_DEV | ASC_DEVICE_1 | 프론트 |
MODEM_UART_DEV | ASC_DEVICE_2 | RS-232C |