STM 32 노트 01 편: HAL 기반 직렬 데이터 수신
4529 단어 STM32
첫 번 째 부분: 사용자 정의 데이터 구조:
#define UART_RECV_BUF_SIZE_TEMPORARY (64) //
typedef struct
{
unsigned int uart_recv_len_temporary;//
unsigned int uart_recv_len_formal;//
unsigned char uart_recv_buf_temporary[UART_RECV_BUF_SIZE_TEMPORARY];//
unsigned char uart_recv_buf_formal[UART_RECV_BUF_SIZE_TEMPORARY * 2];//
}ts_uart_recv;
두 번 째 부분: 사용자 정의 전역 함수:
/**
* This function enable uart interrupt and reset uart receive buff.
* @param uart_handle
* @param uart_recv
*/
void init_uart_interrupt(UART_HandleTypeDef* uart_handle, ts_uart_recv* uart_recv)
{
memset(uart_recv, 0, sizeof(ts_uart_recv));// Reset serial receiving memory.
__HAL_UART_ENABLE_IT(uart_handle, UART_IT_RXNE);// Enable UART_IT_RXNE.
__HAL_UART_ENABLE_IT(uart_handle, UART_IT_IDLE);// Enable UART_IT_IDLE.
__HAL_UART_CLEAR_IDLEFLAG(uart_handle);// Reset UART_FLAG_IDLE.
}
/**
* This function will be called in the interrupt function.
* @param uart_handle
* @param uart_recv
*/
void uart_interrupt_recv_callback(UART_HandleTypeDef* uart_handle, ts_uart_recv* uart_recv)
{
if(__HAL_UART_GET_FLAG(uart_handle, UART_FLAG_RXNE) != RESET)
{
unsigned char ch = uart_handle->Instance->DR;// Read a byte.
if(uart_recv->uart_recv_len_temporary < sizeof(uart_recv->uart_recv_buf_temporary))
{
uart_recv->uart_recv_buf_temporary[(uart_recv->uart_recv_len_temporary)++] = ch;// Store data in temporary cache.
}
__HAL_UART_CLEAR_FLAG(uart_handle, UART_FLAG_RXNE);// Reset UART_FLAG_RXNE.
}
if(__HAL_UART_GET_FLAG(uart_handle, UART_FLAG_IDLE) != RESET)
{
if (uart_recv->uart_recv_len_formal < sizeof(uart_recv->uart_recv_buf_formal))
{
memcpy(&uart_recv->uart_recv_buf_formal[uart_recv->uart_recv_len_formal],
uart_recv->uart_recv_buf_temporary,
uart_recv->uart_recv_len_temporary);// Save data from temporary cache to the end of formal cache.
uart_recv->uart_recv_len_formal += uart_recv->uart_recv_len_temporary;// Calculate data length in formal cache.
}
memset(uart_recv->uart_recv_buf_temporary, 0, uart_recv->uart_recv_len_temporary);// Reset temporary cache space.
uart_recv->uart_recv_len_temporary = 0;// Reset data length of temporary cache space.
/* Reset UART_FLAG_IDLE */
unsigned long temp;
temp = uart_handle->Instance->SR;// Must
temp = uart_handle->Instance->DR;// Must
__HAL_UART_CLEAR_IDLEFLAG(uart_handle);
}
}
세 번 째 부분: 하드웨어 초기 화 및 정적 변수 정의
static UART_HandleTypeDef huart2;// uart2 handle.
static ts_uart_recv uart_recv_2;// uart2 receive cache.
/**
* This function is to configure UART2 hardware.
*/
void init_uart_2(void)
{
/* Enable clock*/
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/* Configure GPIO */
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Configure NVIC */
HAL_NVIC_SetPriority(USART2_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
/* Configure UART */
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;
HAL_UART_Init(&huart2);
/* Enable uart interrupt */
init_uart_interrupt(&huart2, &uart_recv_2);
}
네 번 째 부분: 인 터 럽 트 서비스 함수 설정
/**
* This function is uart2 interrupt server function.
*/
void USART2_IRQHandler(void)
{
uart_interrupt_recv_callback(&huart2, &uart_recv_2);
HAL_UART_IRQHandler(&huart2);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
STM32CubeIDE를 사용해 보자 How To STM32CubeIDE 일본어판 (11) I2C를 사용해 보자 4 Si7020+ssd1306편STM32CubeIDE를 사용해 보자 How To STM32CubeIDE 일본어판 (10) I2C를 사용해 보자 3 ssd1306편의 계속입니다. Nucleo 보드와 Si7020, SSD1306을 연결합니다. 이번에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.