4-2강 UART – STM32CubeMX를 이용한 시리얼통신(ARM 기초 강좌 – Cortex-M3/STM32F1xx) ­

안녕하세요. 로블랙입니다.4-1강에서 STM32CubeMX를 이용해서 기본적인 UART 통신을 수행했습니다. 이번 강의에서는 코드 분석을 하겠습니다. 4-1강을 안보신 분은 먼저 보시고 오시면 이번 강좌 이해에 도움이 되실겁니다.

​아래 그림은 STM32F103의 RM0008 Reference manual에 나와있는 USART 블럭다이어그램 입니다. 빨간색과 파란색으로 네모칸으로 표시한 곳이 데이터를 수신, 송신 하는 부분입니다. 그외 블럭들은 USART의 설정을 위한 레지스터라고 보면 됩니다.

>

​기본 UART 설정은 아래와 같이 했다.Baud Rate: 9600bpsdata Length: 8bitParity: noneStop bits: 1​

>

Data Length: 8bit 이고 Parity none 그리고 Stop bits: 1 로 한다. 위 그림처럼 클럭이 발생한다고 보면 된다. 이런 설정을 하기 위해서 코드는 어떻게 작성을 했는지 확인해자.​STM32CubeMX에서 생성한 코드에서 주석은 삭제했다.

내용 중 구조체 코드가 보입니다.

이건 UART 설정을 위한 구조체 전역 변수로 선언했다. 전역변수로 선언한 이유는 huart2가 USART2의 포인터 주소를 가지고 있는 handler 이고 그 주소를 여러 함수에서 사용하기 위해서입니다.

UART 초기화 함수를 콜하고 있습니다. 그 함수를 살펴보면 아래와 같습니다.

Instance는 USART2의 포인터 주소를 가지고 있고 BaudRate, wordLength, Stop bits, Parity 와 같은 설정을 초기화 함수에서 하고 있다. 일반적으로 손댈건 없고 BaudRate 설정만 맞춰줘도 큰 무리는 없다.​

리셋이 되면 처음 Hello를 출력하기 위해 송신 코드를 추가했습니다. buffer 배열에 “Hello\n” 코드를 입력하고 HAL_UART_Transmit(&huart2, buffer, strlen(buffer), 100) ; 함수를 사용해서 송신하고 있습니다.​위 함수 파라미터를 보면 &huart2 핸들러의 주소를 입력하고, 전송하고자 하는 데이터 buffer 주소를 넣었습니다. 그리고 strlen(buffer) 는 전송하는 데이터의 크기를 말합니다. 100은 100ms 로 timeout 을 뜻합니다.

수신 코드를 확인해 보겠습니다. RcvStat변수는 HAL_StatusTypeDef이라는 열거형 변수로 선언되어 있습니다.

&huart2 핸들러의 주소를 입력하고, 입력 배열 inputData 변수의 주소를 넣고, 1byte의 값을 읽어 옵니다. 100ms 의 timeout이 있습니다. 이때 수신결과를 return 하는데 정상 수신을 했을경우 HAL_OK를 리턴하고 RcvStat에 입력을 합니다. 이때 echo 기능을 수행하기 위해 HAL_UART_Transmit(&huart2, inputData, 1, 100) 사용해서 다시 받은 값을 전송하는 프로그램입니다. echo 기능이 무한 반복하고 있습니다.​지금까지 확인해 본 것과 같이 STM32CubeMX를 이용하면 USART 초기화를 간단하게 할수 있었습니다. 초기화에 시간을 적게 보내고 알고리즘 만드는데 시간을 많이 쓰라는 뜻인거 같습니다.​다음 강좌에는 printf 사용하는 방법을 알아보도록 하겠습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다