STM32 HAL 串口收发
配置 STM32CuveMX
不做解释
关键函数讲解
中断接收数据
在初始化串口后开启中断
// 开启 空闲中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
// 中断接收数据
HAL_UART_Receive_IT(&huart1, rx_buffer, 1);
在串口中断函数中添加
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
// 中断接收模式
uint8_t tmp_flag = __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE); // 判断是否是空闲中断
if ((tmp_flag != RESET)) // 判断空闲中断
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1); // 清除空闲中断
}
// 中断接收模式
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
tmp_flag = (uint16_t)huart1.Instance->DR;
huart1.Instance->DR = tmp_flag;
}
/* USER CODE END USART1_IRQn 1 */
}
发送数据
char run[] = ".";
HAL_UART_Transmit(&huart1, (uint8_t *)run, sizeof(run), 0xFFFF);
DMA收发
全局变量
uint8_t rx_buffer[100];
在初始化串口后开启中断
// 开启 空闲中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
// DMA接收数据
HAL_UART_Receive_DMA(&huart1, rx_buffer, 100);
在串口中断函数中添加
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
uint8_t tmp_flag = __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE); // 获取IDLE状态
if ((tmp_flag != RESET)) // 判断接收是否结束
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1); // 清楚标志位
HAL_UART_DMAStop(&huart1);
uint8_t temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
rx_len = 100 - temp; // 计算数据长度
HAL_UART_Transmit_DMA(&huart1, rx_buffer, rx_len); // 发送数据
HAL_UART_Receive_DMA(&huart1, rx_buffer, 100); // 开启DMA
}
/* USER CODE END USART1_IRQn 1 */
}
发送数据
char run[] = ".";
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)run, sizeof(run));