MCU
|
STM32F103(ST)
|
IDE
|
Atollic(TrueSTUDIO), STM32CubeMX
|
목표
|
HAL driver를 사용하여 UART를 2개 열어서 polling mode로 서로 TX-RX를 주고 받게 한다.
|
1. STM32F103C8 - UART 회로도

UART Firmware 작성시 크게 세가지 모드로 구분 할 수 있다.
1. Polling
2. Interrupt
3. DMA
이번 페이지에서는 Polling 모드를 사용
2. STM32CubeMX : UART-Polling 설정
- 'Pinout & Configuration' Tab으로 이동
1) Connectivity 선택
2) USART1 항목 선택
- Mode : Asynchronous, Synchronous 등
- Hardware Flow Control : Disable
- PA9(USART1_TX), PA10(USART1_RX) 자동 할당(녹색 표시)
3) USART2 도 똑같이 설정

- Parameter Settings 확인
1) Baud Rate : 115200 Bits/s
2) Word Length : 8 Bits
3) Parity : None
4) Stop Bits : 1

- GENERATE CODE 클릭
3. ATOLLIC : main.c 수정
- main() : 변수 선언
int main(void)
{
/* USER CODE BEGIN 1 */
HAL_StatusTypeDef status = HAL_ERROR;
int i = 0;
char tx_data[62] = {};
char rx_data[60] = {};
/* USER CODE END 1 */
- main() : 실행 코드
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_RTC_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
for(i = 0 ; i < 60 ; i++)
{
tx_data[i] = i+48;
}
HAL_UART_Transmit(&huart1, &tx_data[0], 1, 1000);
for(i = 0 ; i < 60 ; i++)
{
status = HAL_UART_Receive(&huart2, &rx_data[i], 1, 500);
if(status == HAL_OK)
{
HAL_UART_Transmit(&huart1, &tx_data[i+1], 1, 1000);
}
else
{
__HAL_UART_CLEAR_OREFLAG(&huart2);
}
}
for(i = 0 ; i < 60 ; i++)
{
printf("%c ", rx_data[i]);
}
/* USER CODE END 2 */
- printf()를 사용하기 위해서는 아래 링크를 참조
STM32F103C8 - printf()를 이용하여 UART로 문자열 출력
- 일정 사이즈(60)개가 들어와야 인터럽트 발생. 59 or 61개가 들어오면 정상적인 동작을 기대 할 수 없음
- 위와 같이 60개 보내고 60개 받을때는 문제 없이 동작하는 것 처럼 보이나, 내가 컨트롤 할 수 없는 Delay가 발생할때 Overrun Error 발생될 수 있음
'ST > STM32F103C8' 카테고리의 다른 글
STM32F103C8 - UART(DMA) (3) | 2025.08.08 |
---|---|
STM32F103C8 - UART(Interrupt) (1) | 2025.08.08 |
STM32F103C8 - GPIO(EXTI) (2) | 2025.08.08 |
STM32F103C8 - GPIO (0) | 2025.08.08 |
STM32F103C8 - Project 생성 및 기본 설정 (1) | 2025.08.08 |