0) 실습 목표 및 배경
배경:
이 실습을 하는 이유는,
내가 원하는 값을 UART를 이용해서 입력하고,
Rx측에서 SPI기반 LoRa통신으로 그 값을수신하는 실습을 해보려고
UART 송수신 기능 구현을 우선적으로 해보는 것이다.
목표:
USART 수신 인터럽트를 사용해서
수신 데이터를 링 버퍼에 저장하고, 그 데이터를 읽어 송신하는
Echo동작을 한다.
키워드:
- ring buffer(링 버퍼)
- USART통신
1) Pinout& Configuration 설정
tera term 을 이용해서 출력을 확인 할 때는 보통 Tx출력만 확인하고,
그 때는 Polling방식으로 함
하지만 보내는 데이터를 Polling 방식으로 보내게 되면
1. 수신 데이터 유실
2. 프로그램 구현 시 오류 가능성 상승
등의 어려움이 있다.
Crystal oscillator쓰니까 그에 맞게 HSE, LSE 설정
현재 USART2 패리페럴의 보레이트는
115200 Bits/s로 되어있는 것을 확인했다.
우리는 USART2통신을 통해 teraterm에 연결하고,
거기에서 입력을 interrupt로 받아오는 것이 목표이기 때문에
USART2 global interrupt를 Enable 해준다.
이렇게 하는 이뉴는, USART IRQHandler()에 HAL_UART_IRQHandler() 함수 호출 코드 생성을 없애기 위해서이다.
보강: 왜? 이유는?
나는 이번 프로젝트에서 모두 동일한 clock configuration을 사용한다.
APB1, APB2 프리스케일러의 값을 잘 확인하자.
Code Generation하자.
2) 코드 작성
링 버퍼 라이브러리를 추가한다.
https://cafe.naver.com/androiddaq/180
stm32f4xx.it.c 파일의 위 함수를
바로 위 사진처럼 코딩해 준다.
콜백함수를 main문에 구현해준다.
__HAL_UART_ENABLE_IT()함수를 통해 수신 인터럽트를 활성화한다.
RB_init()함수로 링 버퍼 크기를 정해 주고, 링 버퍼를 초기화한다.
그리고 링 버퍼 크기는 16바이트로 설정했다.
이 함수에서,
RB_isempty()함수는 링 버퍼에 데이터가 있는지를 확인한다.
데이터가 수신되면 링버퍼가 비어있지 않기 때문에, '0'을 반환한다.
이 때 RB_read()함수로 링 버퍼의 데이터를 읽고,
HAL_UART_Transmit()함수를 이용해서
읽은 데이터를 송신하게 되는 코드이다.
3) 빌드 및 실행
프로젝트를 실행한다.
tera term을 켠다.
setup- terminal -
지역 에코 체크해주기
이걸 해야 내 입력을 볼 수 있다.
체크박스를 위와 같이 설정하고, 입력하고자 하는 문자열을 입력하고
제출을 누른다.
'프로젝트 기록 > 23SEMA_Control_STM32' 카테고리의 다른 글
[LoRa] 3편. 통신을 위한 안테나 정리 (0) | 2023.01.11 |
---|---|
[LoRa] 2편. 로라 모듈이 연결된 보드끼리 연결 (0) | 2023.01.11 |
[STM32] teraterm에서 시리얼 입력이 안될 때 (0) | 2023.01.10 |
[STM32 CUBE IDE] 프로젝트에 라이브러리 파일 추가하기 (1) | 2023.01.10 |
[LoRa] 1편. 통신을 위한 준비 (3) | 2023.01.10 |