티스토리 뷰

문서의 목적

이것은 TI의 지그비 칩이 cc2530 상에서 UART 2개를 사용하는 방법에 대한 노트이다. 부족한 글이지만 해당 칩을 개발하는 개발자들에게 조금이나마 도움이 되길 바라는 마음에 적는다.


테스트한 환경

소프트웨어는 TIMAC을 이용했고 하드웨어는 CC Debugger와 CC2530DK_EM을 썼다.




핀 연결

cc2530에는 총 21개의 디지털 I/O 핀이 있는데 이 핀들은 GPIO로 쓰던지 아니면 ADC, 타이머, UART에 연결된 주변 I/O 시그널로 사용될 수 있다. cc2530의 유저가이드 문서를 보면 주변 장치들은 그 장치의 I/O 핀들에 대해 2개의 alternative location들을 갖는다고 써있다. (해석이 딸린다.. 이해바람). I/O 매핑에 관한 설정이 충돌하는 경우 우선순위를 주변 장치 사이들 간에 설정될 수 있단다. (흠.. 뭔말이여???) 


난 I/O 설정이 충돌나는 경우 다른 alternative location을 사용하라는 뜻으로 이해 했다. (누가 좀 가르쳐주면 좋을듯.) 그래서 UART0 의 경우 P0의 P0.2와 P0.3을 쓰고 UART1는 P0과 로케이션이 겹치는 것을 피하기 위해 P1의 P1.6과 P1.7을 사용했다. 이 때 UART1은 AL. 2 이다. 


결국 연결되는 핀은 UART0에 P0.2, P0.3 이고 UART1에 P1.6, P1.7 이다.




빌드 옵션

컴파일 옵션에서 다음과 같이 설정 값을 변경했다. hal_board_cfg.h에서 값을 변경하던지 컴파일러 옵션에서 심볼값을 넣어줘도 된다. UART0은 ISR로 컨트롤하고 UART1은 DMA로 제어하게 된다. 이제 코드를 쬐끔 수정하면 된다.

HAL_UART_DMA  2 

HAL_UART_ISR  1


사진참조 : 구글



코드 추가 및 수정

이미 유아트 1개로 쓰는 코드를 구현했었다면 HalUARTOpen(유아트번호, 설정값) 함수를 써서 유아트0번에 대한 초기화를 진행하였을 것이다. UART1에 대한 초기화도 추가로 넣어주자. HalUARTOpen(HAL_UART_PORT_1, &uartConfiguration); 대략 이런 식이 될 것이다. 아래는 설정에 대한 예제이다.

  halUARTCfg_t uartConfig;

  uartConfig.configured           = TRUE;             

  uartConfig.baudRate             = HAL_UART_BR_57600;

  uartConfig.flowControl          = FALSE;

  uartConfig.flowControlThreshold = 64; 

  uartConfig.rx.maxBufSize        = 128;

  uartConfig.tx.maxBufSize        = 128; 

  uartConfig.idleTimeout          = 100; 

  uartConfig.intEnable            = FALSE;            

  uartConfig.callBackFunc         = my_Cb;

  HalUARTOpen (0x01, &uartConfig);


유아트에 대한 콜백함수나 읽기, 쓰기함수도 유아트0과 유사하다. 함수 호출시 인자값으로 UART1을 넣는것만 다르다.


추가로 볼 것들

맞게 한 것 같은데 잘 안되면 _hal_uart_dma.c 코드의 HalUARTInitDMA() 함수를 잘 설정했는지 확인하자. PxSEL |= HAL_UART_Px_RX_TX; 의 경우 HAL_UART_Px_RX_TX의 값이 0xC0 가 되어야 정상이다.