高级会员

- 积分
- 801
- 金钱
- 801
- 注册时间
- 2014-9-30
- 在线时间
- 136 小时
|
分享 STM32L011串口空闲中断+DMA【分包接收数据】
折腾了两天:虽然说是 HAL库 其实有些写法还是不同的。这只能:依靠【 悟性 】,现在 执行结果 总算是正确了。
DMA 配置为 Normal 模式 。利用 串口空闲中断 实现 “分帧”
——固定将每包数据的前 8字节 复制到 OutBuf 输出 (后处理)。
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
uint8_t TmpCnt;
if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET))
{
__HAL_DMA_DISABLE(&hdma_usart2_rx); //关闭DMA_rx
for (TmpCnt=0;TmpCnt<8;TmpCnt++) OutBuf[TmpCnt] = rx_buffer[TmpCnt];
rx_len = 32-(__HAL_DMA_GET_COUNTER(&hdma_usart2_rx));
DMA1_Channel5->CNDTR = 32; //复位DMA指针(缓冲区长度为32字节)
__HAL_DMA_ENABLE(&hdma_usart2_rx); //使能DMA_rx
__HAL_UART_CLEAR_IT(&huart2,UART_FLAG_IDLE); //清除串口空闲中断标志位
__HAL_UART_CLEAR_IDLEFLAG(&huart2); //清除串口空闲标志位谁对??
HAL_UART_Receive_DMA(&huart2,rx_buffer,32); //再次启动接收
recv_end_flag = 1;
}
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
|
|