본문 바로가기
프로젝트 기록/23SEMA_Control_STM32

[STM32제어] UART 통신, teraterm 이용해서 값 주고받기

by 소요이 2023. 1. 10.
728x90

0) 실습 목표 및 배경

 

배경:

이 실습을 하는 이유는,

내가 원하는 값을 UART를 이용해서 입력하고,

Rx측에서 SPI기반 LoRa통신으로 그 값을수신하는 실습을 해보려고 

UART 송수신 기능 구현을 우선적으로 해보는 것이다.

 

목표:

USART 수신 인터럽트를 사용해서

수신 데이터를 링 버퍼에 저장하고, 그 데이터를 읽어 송신하는 

Echo동작을 한다.

 

 

키워드:

- ring buffer(링 버퍼)

- USART통신 

 

 

 

1) Pinout& Configuration 설정

tera term 을 이용해서 출력을 확인 할 때는 보통 Tx출력만 확인하고,

그 때는 Polling방식으로 함

하지만 보내는 데이터를 Polling 방식으로 보내게 되면

 

1. 수신 데이터 유실

2. 프로그램 구현 시 오류 가능성 상승

등의 어려움이 있다.

 

 

 

RCC에서  HSE, LSE 설정

Crystal oscillator쓰니까 그에 맞게 HSE, LSE 설정

 

 

 

USART Mode and Configuration

현재 USART2 패리페럴의 보레이트는

115200 Bits/s로 되어있는 것을 확인했다.

 

 

 

USART2 인터럽트 설정

우리는 USART2통신을 통해 teraterm에 연결하고,

거기에서 입력을 interrupt로 받아오는 것이 목표이기 때문에

USART2 global interrupt를 Enable 해준다.

 

 

 

NVIC 설정

이렇게 하는 이뉴는, USART IRQHandler()에 HAL_UART_IRQHandler() 함수 호출 코드 생성을 없애기 위해서이다.

보강: 왜? 이유는?

 

 

 

clock configuration

나는 이번 프로젝트에서 모두 동일한 clock configuration을 사용한다.

APB1, APB2 프리스케일러의 값을 잘 확인하자.

 

 

Code Generation하자.

 

 

 

 

 

2) 코드 작성

링 버퍼 라이브러리를 추가한다.

https://cafe.naver.com/androiddaq/180

USART2_IRQHandler(void) 함수
stm32f4xx.it.c 파일 수정

stm32f4xx.it.c 파일의 위 함수를

바로 위 사진처럼 코딩해 준다.

 

 

 

main.c 수정- 변수선언

 

HAL_UART_RxCpltCallback() 함수 구현

콜백함수를 main문에 구현해준다.

 

 

 

USART2 수신 인터럽트 활성화, 링 버퍼 초기화

__HAL_UART_ENABLE_IT()함수를 통해 수신 인터럽트를 활성화한다.

RB_init()함수로 링 버퍼 크기를 정해 주고, 링 버퍼를 초기화한다.

 

그리고 링 버퍼 크기는 16바이트로 설정했다.

 

이 함수에서,

RB_isempty()함수는 링 버퍼에 데이터가 있는지를 확인한다.

데이터가 수신되면 링버퍼가 비어있지 않기 때문에, '0'을 반환한다.

이 때 RB_read()함수로 링 버퍼의 데이터를 읽고,

HAL_UART_Transmit()함수를 이용해서

읽은 데이터를 송신하게 되는 코드이다.

 

 

 

rb_ch 선언
Usercode while 안에 작성한 코드

 

 

3) 빌드 및 실행

프로젝트를 실행한다.

tera term을 켠다.

setup- terminal -

터미널 설정

지역 에코 체크해주기

이걸 해야 내 입력을 볼 수 있다.

 

 

 

체크박스를 위와 같이 설정하고, 입력하고자 하는 문자열을 입력하고

제출을 누른다.