Louie NRT Story

[펌웨어] STM32F4 강의 - UART 통신 본문

전기차충전기

[펌웨어] STM32F4 강의 - UART 통신

hyeok0724.kim@gmail.com 2020. 12. 6. 16:42
반응형

Index

1. UART 설정

2. 간단한 테스트

3. printf 설정

4. float 변수 출력

5. UART 인터럽트 설정

6. 인터럽트 코드 생성

7. 배열로 수신 인터럽트 코드 생성

 

1. UART 설정

동기식
- 데이터를 클럭에 동기화 시켜서 한비트씩 보냄
- 물리적 클럭 전송라인 필요함
비동기식
- 시간간격으로 비트를 보냄
- 초당비트 전송 보레이트가 동
- 둘다 보레이트가 일치해야 함
- 9600 baudrate는 1초에 9600개의 Symbol(ex. 8bit - ASCII 코드)를 보낼 수 있음

- UART를 비동기식으로 설정하여 사용 할 수 있도록 설정함

- 통신의 설정들을 확인

 

2. 간단한 테스트

- 데이터가 들어오면 1byte씩 'a'라는 변수에 넣음

- 'a'라는 변수의 값을 1byte씩 읽어서 전송함

 - 다음과 같이 시리얼 터미널을 통해 "Hello"를 보내면 다시 "Hello"가 터미널에서 받아짐

 

3. printf 설정

- 표준입출력을 가져와서 출력할 때 UART4로 하도록 재설정함

 

4. float 변수 출력

- 프로젝트 설정

- 코드 작성

※ 표준입출력의 printf는 많이 무겁기 때문에 stm 라이브러리 Tiny printf를 사용함. 디버깅할때 printf 사용하지만 Release버전에는 printf를 사용하지 않음

 

5. UART 인터럽트 설정

- 글로벌 인터럽트를 enable 함.

- NVIC 코드를 생성하도록 함

 

6. 인터럽트 코드 생성

- 인터럽트 코드를 따라가면 다음과 같이 몸체가 나타남

  UART4_IRQHandler -> HAL_UART_IRQHandler -> UART_Receive_IT -> HAL_UART_RxCpltCallback

- 함수 앞에 "__weak"는 사용자가 재정의 하여 사용하라는 의미임. 실제 인터럽트의 몸체로 사용자가 다시 정의하면 됨

- 인터럽트로 1byte 씩 받아서 Transmit 하는 것임

- 위에 다음과 같이 선언을 해주어야함. 이유는 rx4_data에 1byte가 차면 위에서 선언한 함수를 수행하겠다는 의미임

 

7. 배열로 수신 인터럽트 코드 생성

- 수신 byte를 10개로 하면 10개의 데이터가 들어오면 "HAL_UART_RxCpltCallback" 이 함수를 수행함

- 정리하면 "UART4_IRQHandler" 함수가 10번 동작하는 동안 "HAL_UART_RxCpltCallback" 함수는 1번 수행한다는 의미

 

Referece:

www.youtube.com/watch?v=_7Ll95FITn4&feature=youtu.be

 

반응형
Comments