stm32f407hal库串口通信接收数据、
时间: 2025-01-04 13:12:31 浏览: 16
### STM32F407 使用 HAL 库实现串口通信接收数据
为了在 STM32F407 上使用 HAL 库实现串口通信并接收数据,可以采用多种方法。下面展示一种常见的方案——通过空闲中断配合 DMA 中断来接收数据[^2]。
#### 配置 UART 和 DMA 初始化函数
首先,在初始化阶段设置好 UART 及其关联的 DMA 通道:
```c
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
static void MX_DMA_Init(void)
{
__HAL_RCC_DMA2_CLK_ENABLE();
hdma_usart1_rx.Instance = DMA2_Stream2;
hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4;
hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart1_rx.Init.Mode = DMA_CIRCULAR; // 循环模式
hdma_usart1_rx.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&huart1, hdmarx, hdma_usart1_rx);
}
```
#### 启动接收过程
接着启动接收流程,并开启相应的中断服务程序(ISR),以便处理接收到的数据帧结束事件:
```c
void StartReceive(void)
{
uint8_t rxBuffer[RECEIVE_BUFFER_SIZE];
/* 开启IDLE线程 */
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
/* 设置回调函数指针 */
huart1.hdmarx->XferMpltCallback = UART_DMARxHalfCpltCallback;
huart1.hdmarx->XferCMpltCallback = UART_DMARxCpltCallback;
/* 开始DMA传输 */
HAL_UART_Receive_DMA(&huart1, rxBuffer, RECEIVE_BUFFER_SIZE);
}
/* IDLE中断处理函数 */
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart1);
}
/* 处理DMA半满完成后的动作 */
void UART_DMARxHalfCpltCallback(DMA_HandleTypeDef *hdma)
{
ProcessReceivedData(hdma);
}
/* 完成全部DMA接收之后的动作 */
void UART_DMARxCpltCallback(DMA_HandleTypeDef *hdma)
{
ProcessReceivedData(hdma);
}
// 用户自定义的数据处理逻辑
void ProcessReceivedData(DMA_HandleTypeDef *hdma)
{
// 对接收到的数据进行解析或其他操作...
}
```
上述代码片段展示了如何配置和启用基于 HAL 的 UART 设备以及与其相连的 DMA 控制器来进行高效可靠的数据接收工作流。当检测到空闲状态时触发 ISR 来停止当前 DMA 流并向应用程序层报告新消息的到来;而每当一半或整个缓冲区被填满时也会调用特定的回调函数让用户有机会及时响应这些变化。
阅读全文