본문으로 바로가기
728x90
반응형

 STM32에 USART를 사용하는 방법을 정리를 해 놓겠다. 아직 STM32를 많이 사용하지 않다보니 일단 기본적인 사용법만 언급한다. 

 IDE는 STM32CubeIDE 1.6.1을 사용하였고 LL 드라이버를 사용하여 진행하였다. 현재 초기 단계에서 사실 사용하기는 HAL 드라이버가 편하기는 하지만 차후 조금더 직접적인 제어를 위해서는 LL 드라이버가 좋다는 판단에 LL 드라이버를 사용했다. 사용 IC는 STM32L151CCT를 사용했는데 뭐 Chip에 따라 다른 점은 없으니 어떤 IC를 사용해도 무방할 것으로 생각된다.

 1. CubeMX에서 Pin을 정의 한다.

 Connectivity에서 USART를 선택 후 모드를 정의하고 흐름제어를 선택한다. 대부분 USART는 비동기를 사용하고 흐름제어가 없이 하는 것이 일반적이니 Asynchronous, Disable를 선택하면 된다.

 선택 하면 오른쪽 "Pinout view"에 핀이 할당된다. 그리고 설정을 해야하는데 TX는 특별한 설정이 필요하지 않지만 RX는 폴링으로 할 경우를 제외하고는 일반적으로는 인터럽트를 사용하므로 "Configuration->NVIC Settings"에서 global interrupt를 Enable 시킨다.

2. CubeMX에서 사용할 통신 설정을 한다.

3. CubeMX에서 사용할 드라이버를 설정한다.

 사용할 드라이버를 설정하고 코드 생성을 한다. 드라이버는 LL을 사용하기로 했으니 LL로 설정한다. 코드 생성은 "Project->Generate Code"를 선택하던지 아님 저장을 하면 코드가 자동으로 생성된다.....정말 편하긴 하다....

 

4. 송신 (TX)

 송신은 간단하다. 위의 설정을 다 했다면 필요한 작업은 다 한 것이고 이에 따른 LL 드라이버 함수를 호출하여 레지스터에 써 주기만 하면 설정된 포트로 신호가 나간다.

 LL_USART_TransmitData8 함수는 1byte의 데이터를 USARTx 포트로 내보내는 함수이다.

 인수는 USARTx에 포트를 기입하고 value에 1byte의 값을 넣으면 USARTx->DR 레지스터에 값이 써지면서 출력된다.

 printf 함수를 구현해서 문자열 형태로 송신하는 방법도 있겠지만 따로 전송함수를 만들어서 송신하는 함수를 만든다.

 사용은 sprintf를 이용하여 배열에 문자열을 넣고 이 문자열을 출력하는 방식을 사용하는데 사실 앞서 말했듯이 printf  함수를 사용하는 것이 사용하기는 더 짧긴하다.

 printf함수는 stdio.h 파일을 include하고 printf가 호출하는 함수를 main에 작성하면 된다. 이 함수는 _write 함수이다.

printf문을 사용할 때 Float를 사용할 때 안되는 현상이 있는데 이부분은 Project->Properties에서 C/C++ Build->Settings->Tool Settings->MCU Settings에서 체크박스를 선택하면 된다.                         

 개인적으로는 printf가 편하기는 하지만 여러 포트인 경우의 확장성을 생각하면 위에 sprintf 형태도 괜찮은 것 같다. 사실 디버깅 용으로 문자열 등을 출력할 때는 printf를 사용하지만 프로토콜로 통신시에는 printf문을 사용하기 힘들기 때문에 적재 적소에 알아서 잘 사용하면 좋겠다.

5. 수신(RX)

 수신은 앞서 언급했듯이 인터럽트를 이용하여 외부에서 송신하여 수신시 인터럽트 루틴에서 변수에 값을 저장하고 완료 후 Main에서 처리하는 방식이다. 앞서 설정을 하였다면 설정할 것은 인터럽트 수신 완료 Flag를 Enable해야 한다.

 수신 완료 Flag는 두가지가 있다. 1byte 송신이 완료되면 Set되는 RXNE와 USART가 idle 상태 즉, 유휴상태에 set되는(Freme 수신 완료) IDLE 두가지를 이용한다. Frame 단위로 데이터 수신시 각 byte 단위는 RXNE가 Set 될 때 마다 1byte씩 변수에 넣어주고 IDLE가 set 될 시 Flag를 set하여 처리해준다. 하지만 IDLE를 사용시에는 IDLE 상태를 수신이 일정시간 안되는 경우가 되므로 Frame이 잠깐 끈겨서 송신시에 Frame이 다 수신이 안되어도 IDLE가 뜰 수 있는 것에 주의한다.

 stm32l1xx_it.c 파일(_it 파일이 인터럽트 파일)에서 USARTx_IRQHandler 함수를 찾아서 처리를 해준다. 해당 내용은 수신 인터럽트 발생시 RXNE가 set 되었는지 확인 후 되었다면 RXNE를 클리어 후 USART1_Data 배열에 1byte를 저장 후 Counter를 증가시키며 이를 반복하여 Data를 저장한다. 그리고 IDLE Flag가 발생하면 IDLE Flag를 클리어 후 Flag를 Set하여 main에서 확인 후 처리한다.

 Main에서는 위와 같이 Flag를 확인 후 Flag가 set되면 Flag를 클리어 후 처리를 한다. 위 처리는 받은 Frame을 다시 송신하는 구문이다.

728x90
반응형