ST에서 기존 드라이버들에서 Hal 드라이버로 변경한 후 UART 데이터 수신 후 문제가 많았습니다. 물론 틀에 박혀서 사용해야한다는 고정관념 때문이었습니다.
그러다 어떤 분이 올려놓으신 글(당근이)과 아래 사이트를 보면서 아! 꼭 제시해준 방법을 쓰지 않아도 되는구나 기존처럼 사용해도 되는 구나! 하는 것을 알게 되었습니다.
(세상에는 똑똑하신 분들이 많네요. 고정관념 진짜 ㅠㅠ)
https://www.basic4mcu.com/bbs/board.php?bo_table=d1&wr_id=40&page=3
Uart 설정
char Uart1RxData;
/* USART1 */
Uart1Handle.Instance = USART1;
Uart1Handle.Init.BaudRate = 115200;//Baud Rate
Uart1Handle.Init.WordLength = UART_WORDLENGTH_8B;
Uart1Handle.Init.StopBits = UART_STOPBITS_1;
Uart1Handle.Init.Parity = UART_PARITY_NONE;
Uart1Handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
Uart1Handle.Init.Mode = UART_MODE_TX_RX;
Uart1Handle.Init.OverSampling = UART_OVERSAMPLING_16;
/* GPIO */
if(HAL_UART_Init(&Uart1Handle) != HAL_OK)
{
/* Initialization Error */
}
__HAL_UART_ENABLE_IT(&Uart1Handle, UART_IT_RXNE);
/* stm32f4xx_hal_msp.c 내용 */
void HAL_UART_MspInit(UART_HandleTypeDef *huart){
/* Enable GPIO TX/RX clock */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/* Enable USARTx clock */
__HAL_RCC_USART1_CLK_ENABLE();
/*##-2- Configure peripheral GPIO ##########################################*/
/* UART TX GPIO pin configuration */
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* UART RX GPIO pin configuration */
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*##-3- Configure the NVIC for UART ########################################*/
/* NVIC for USART */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
/* stm32f4xx_it.c 내용 */
extern UART_HandleTypeDef Uart1Handle;
extern char Uart1RxData;
void USART1_IRQHandler(void)
{
if ((__HAL_UART_GET_FLAG(&Uart1Handle, UART_FLAG_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&Uart1Handle, UART_IT_RXNE) != RESET)) {
Uart1RxData = (uint8_t)(Uart1Handle.Instance->DR & (uint8_t)0x00FF);/* STM32FL4 에서는 데이터레지스터인 DR를 변경해주어야 합니다. 저도 보드가 없어서 실테스트를 해보지 못해 못 올리겠네요. 하지만 Instance안에서 수신 데이터 레지스터를 확인해서 넣어주면 될 것 같습니다. */
}
__HAL_UART_CLEAR_PEFLAG(&Uart1Handle);
// HAL_UART_IRQHandler(&Uart1Handle); // HAL 드라이버가 제공하는 IRQ 핸들러
}
/* 링버퍼를 사용하려면 Uart1RxData 부분을 배열로 받아가면 됩니다. 다만 버퍼 포인터를 증가 및 초기화 해주는 부분이 추가로 필요하겠죠. */
'초보의 아웅다웅 설계하기 > STM32' 카테고리의 다른 글
변수 선언시 __IO의 사용 (0) | 2018.04.21 |
---|---|
ST에서 지원하는 Low Layer 드라이버 (0) | 2018.04.20 |
IAR에서 Stack 할당 계산 (0) | 2018.04.04 |
ST Micro JTAG 단자를 IO로 사용하기 (0) | 2018.03.15 |
One Elf Section per Function 옵션??? (0) | 2018.02.08 |