STM32로 UART 통신을 하는 중에 질문이 있습니다.
글쓴이: 익명 사용자 / 작성시간: 목, 2020/10/22 - 10:33오전
NUCLEO-L496ZG-P 보드를 이용하고 있으며,
STM32CubeMX와 STM32CubeIDE를 통해 작성하였습니다.
우선은 간단한 기능들부터 테스트 해 보려고
HAL_UART_Tranmit부터 시험해 봤는데,
아무리 해 봐도 Tera Term에 아무것도 찍히지 않더라고요.
그래서 아래처럼 코드를 작성 후, 보드에 얹어 봤는데
파란 LED(LD2)가 정상적으로 깜빡이기에
일단 HAL_UART_Tranmit가 HAL_OK를 반환하고 있다는 건 확인되었습니다.
그런데도 막상 이를 이용해서 Tera Term에 "Hello, World!"를 찍으려고 하면
왜 아무것도 찍히지 않는 걸까요.
Tera Term에서의 포트 설정도 물론 아래와 같이
Baud Rate 115200
Data 8
stopbit 1
parity none
으로 동일하게 설정했습니다.
#include "main.h" #include <stdio.h> UART_HandleTypeDef huart2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USB_HOST_Init(); MX_USART2_UART_Init(); char data[] = "Hello, World!\r\n"; while (1) { if (HAL_UART_Transmit(&huart2, (uint8_t*)data, 20, 100) == HAL_OK ) { HAL_GPIO_TogglePin(BLUE_LED_GPIO_Port, BLUE_LED_Pin); } HAL_Delay(1000); } } static void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } }
Forums:
UART2가 아니고 UART1이 아닌가요? (PG7
UART2가 아니고 UART1이 아닌가요? (PG7,PG8)
CubeMX에서 USART2로 했습니다
STM32CubeMX에서 기본 보드(NUCLEO-L496ZG-P)를 선택하면,
PG7, PG8은 STLK_Tx, STLK_Rx로 되어 있어서
USART2를 선택해서 PA2, PA3으로 했습니다. (UART이므로 Mode는 Asynchronous 선택)
그래서 main.c 코드에서도
static void MX_USART1_UART_Init(void)
부분에 USART2(huart2)로 자동 생성되어 있습니다.
오타가 났네요.
static void MX_USART2_UART_Init(void)
입니다.
보통 이럴 때는 시리얼포트가 제대로 연결되었는지부터
보통 이럴 때는 시리얼포트가 제대로 연결되었는지부터 확인해야합니다.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
시리얼 포트가 제대로 연결되었는지 확인하려면 어떻게
시리얼 포트가 제대로 연결되었는지 확인하려면 어떻게 해야 할까요?
우선은 Tera Term에는 COM6으로 잡히고, 장치 관리자에서도 똑같이 잡혀 있습니다.
다만, HAL_UART_Transmit을 시험해 봤을 때는
HAL_UART_Transmit(&huart2, (uint8_t*)data, 20, 100)은 분명히 HAL_OK를 리턴하고 있으므로
일단 이 함수가 정상적으로 동작하지만, 데이터는 PC로 전송되지 않는 모양이고...
HAL_UART_Receive를 시험해 봤을 때는 PC로부터 아무런 데이터를 전송받지 못하는 모양이더라고요.
(Tera Term의 명령 전송 기능을 통해 시험하였습니다.)
제가 시리얼 통신은 이제 막 배우기 시작해서 차근차근 해 보려고
비슷한 예제들을 그대로 따라해 봤는데 생각대로 되지 않으니 답답하네요(...)
(https://blog.psangwoo.com/avr_arm/stm32/2017/11/01/nucleo_f103rb_serial-1.html)
처음이시니까... 다음의 두 가지 가능성이 있겠네요
처음이시니까... 다음의 두 가지 가능성이 있겠네요
1. nucleo와 연결은 usb cable만 있을 때
---> UART1으로 연결 해 보세요
2. UART2을 연결하기 위한 "Serial to USB"같은 보드를 이용하여 추가 USB 연결
---> PA2,PB10이 header에서 UART_A로 표현 되어 있는데... 바꿔 보는 것도...
---> PC(teraterm) 쪽에는 nucleo의 VCOM과 추가 보드의 VCOM이 두개가 생기는데 헷갈리지 않게 잘 연결 하시길..
보드의 TX, RX와 PC에 연결한 시리얼포트
보드의 TX, RX와 PC에 연결한 시리얼포트(USBtoSerial이든 진짜 시리얼 포트든)의 RX, TX를 연결해야 합니다. 그라운드도 맞추고요.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
오실로스코프가 있으면 보드의 uart1, 2의 TX
오실로스코프가 있으면 보드의 uart1, 2의 TX 라인을 한번 찍어 보세요. 어떤 pin에서 신호가 나오는지 확인할 수 있습니다. 신호 크기도 한번 보시고요.
답변해 주셔서 감사합니다
많은 분들이 답변해 주셨는데 아직 명확하게 알지를 못해서
우선은 좀 더 공부해 보고 시도해 보려고 합니다.
댓글 달기