STM32F103에서 UART DMA 송신 방법이 어떻게 되나요?
HAL 라이브러리를 이용하여 UART DMA 송신을 하기 싶습니다.
예제나 설명 부탁 드립니다.
답변 미리 감사합니다.
안녕하세요 BTC 입니다. 참고가 될만한 설명입니다. 감사합니다.
1. 동작목표
USART를 이용해서 PC에서 전달받은 데이터를 그대로 Echo 한다. 동작모드는 USART DMA 방식을 이용한다.
2. STM32CubeMX 설정
USART2를 비동기 모드로 활성화 한다.PA2/PA3 핀에 Tx/Rx 가 할당된다. FTDI232 USB-Serial의 Tx/Rx 와 Cross 로 연결한다.
PC측 어플리케이션과 동일하게 Baud rate, Word length, Parity, Stop bits 등을 설정한다.
USART 인터럽트 핸들러를 추가한다.
USART2_RX 의 DMA를 활성화 한다. 지속적으로 데이터가 지정한 배열에 업데이트 될 수 있도록 Circular 모드를 선택한다.
USART2_TX의 DMA를 설정한다. TX의 경우에는 계속 반복해서 동일한 데이터를 발송해야 하면 Circular Mode를 활성화 해야겠지만 이번 예제에서는 한번만 전송하기 때문에 Normal 모드를 선택한다.
3. 메인 함수
코드를 보면 While 루프에 앞서 HAL_UART_Receive_DMA 함수를 호출한다. 따라서 rxBuffer로 10바이트의 데이터가 전송되면 HAL_UART_RxCpltCallback 콜백함수가 호출된다. 디버깅을 해보면 DMA에 의해서 rxBuffer는 1바이트 데이터가 들어올 때 마다 업데이트 되고 있기 때문에 Callback 이 호출되기 이전에 rxBuffer를 확인해도 해당 시점까지 수신된 데이터를 확인할 수 있다.
HAL_UART_RxCpltCallback 콜백함수에서는 수신한 데이터를 그대로 HAL_UART_Transmit_DMA 함수를 이용해서 전송한다.
전송이 완료되면 HAL_UART_TxCpltCallback 콜백함수가 호출된다. Tx 콜백함수에서는 txBuffer에 담긴 데이터를 Blocking 모드로 전송한다.안녕하세요.
우선 CubeMX로 사용할 UART port와 통신 설정을 합니다.
설정 방법은 아시리라 생각하고 하기 예제에서 modify 하셔서 확인하시면 됩니다.
baud rate, parity bit 등 통신 설정은 동일해야 합니다.
감사합니다.