[STM32] STM32 2일차 기초 UART
자료 설명
- UART (비동기식) USART(동기식)
Uart (Universal Sync/Async Receiver Transmitter) 범용 동기 송수신기
데이터를 보낼떄 동기 또는 비동기식으로 전달
동기는 클럭과 동기 맞춰서 전달
비동기식은 시간 관격으로 조절하면 Baudrate 을 일치해야 한다
주로 디버깅 용도로 사용한다
2개의 선만 이용해서 통신이 가능하다
UART 표시할때
8-N-9600-1 8비트 통신 - Parity 비트
보드 스펙
보드에서는 UART 기능 이용해서 사용이 가능하다
소스코드
HAL_UART_Transmit(UART 주소, 전달 변수, 변수 크기, 딜레이)
uint8_t a = 'a';
while (1)
{
if(HAL_UART_Receive(&huart3, &a, 1, 10) == HAL_OK)
{
HAL_UART_Transmit(&huart3, &a, 1, 10);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
Pirntf 사용하기
- 표준 입력 함수 추가하기
- #include “stdio.h” 추가
- printf() 함수 출력 대상을 리데렉션하기
- Private user code – 위치에
int _write(int file, char* p, int len) { HAL_UART_Transmit(&huart3, p, len, 10); return len; }
참고
printf 시 float 형식 사용할려면 -u _printf_float 을 설정해야한다
프로젝트 트리 - 우측클릭 - 특성 -
- Tool Setting - C_linker - Miscellaneous - Other options u _printf_float 입력해준다
참고 2
printf 가 무거운데 tiny_printf 사용할수 있다 프로젝트 우클릭 - 새 프로젝트 - 기타 - library function 에서 사용가능하다
UART Interrupt 사용하기
- UART 사용 포트에 NVIC 기능을 켜준다.
- NVIC (Nested Vector Interrupt Controller)
- 환경설정을 하는데 init 기능을 켜준다
코드 부분
- 유저코드에 아래 코드를 추가해준다. 간단하게 설명하자면 해당 코드는 UART 콜백 함수로 인터럽트 발생시 실행되는 함수이다. 기존에 __weak 앞에 붙어있어서 다른 함수에서 호출해서 쓸수 있게 설계된 함수이다. -> 해당 내용은 정확하지 않음 영상 자료 보고 판단해주세요 ```c uint8_t rx3_data;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef huart) { / Prevent unused argument(s) compilation warning / if(huart->Instance == USART3) { HAL_UART_Receive_IT(&huart3, &rx3_data, 1); HAL_UART_Transmit(&huart3, &rx3_data, 1 ,10); } / NOTE : This function should not be modified, when the callback is needed, the HAL_UART_RxCpltCallback can be implemented in the user file. */ }
- 사용자 함수 시작전 해당 인터럽트 호출 미리 해준다
HAL_UART_Receive_IT(&huart3,&rx3_data,1);
추가 자료
- 배열에 크기를 변경하여 인터럽트를 발생하게 할 수도 있다.
uint8_t rx3_data[10];
if(huart->Instance == USART3)
{
HAL_UART_Receive_IT(&huart3, &rx3_data, 10);
HAL_UART_Transmit(&huart3, &rx3_data, 10 ,10);
}
- 다른 코드에서는 인터럽트 발생시 넣는 방식도 있다. (참고용 - 현재 보드에서는 동작하지 않음)
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint8_t rx_ch = (unsigned char) (huart1.Instance->DR & (uint8_t) 0x00FF);
arr[arr_idx++] = rx_ch;
if (arr[arr_idx-1] == ';')
{
gUartOk = true;
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
출처
-
참고 양상강의 자료 https://www.youtube.com/watch?v=_7Ll95FITn4&list=PLUaCOzp6U-RqMo-QEJQOkVOl1Us8BNgXk&index=4&ab_channel=ChrisWonyeobPark
-
인터럽트 관련 참고 자료 https://how-to-make-a-quadcopter.tistory.com/24
댓글남기기