据我实测: 使用串口DMA接收数据,即使不使用“接收一半数据中断”,在接收一半数据后,也会触发相应的DMA通道中断句柄,全部数据接收完成后,又触发相应的DMA通道中断句柄,通过DMA通道中断句柄,而DMA中断句柄最终还是会调用串口接收中断回调函数,所以最终接收的数据可以通过重载串口接收中断回调函数来处理 在stm32f1xx_it.c中的与串口接收相关的DMA通道中断句柄函数,注意这个中断句柄与接收或发送相对应,也就是说发送和接收是2个不同DMA通道中断句柄。比如使用 HAL_UART_Receive_DMA(&huart1,(uint8_t *)aRxMessage,6) 在下面的代码中,我接收到3个数据就会触发printf("here DMA1_Channel5_IRQHandler") 接收到6个数据,又触发printf("here DMA1_Channel5_IRQHandler"),同时这接收到的6个数据,通过重载串口接收中断回调函数来处理//stm32f1xx_it.c中的DMA中断句柄 void DMA1_Channel5_IRQHandler(void) { /* USER CODE BEGIN DMA1_Channel5_IRQn 0 */ /* USER CODE END DMA1_Channel5_IRQn 0 */ printf("here DMA1_Channel5_IRQHandler"); HAL_DMA_IRQHandler(&hdma_usart1_rx);//串口接收DMA通道 /* USER CODE BEGIN DMA1_Channel5_IRQn 1 */ /* USER CODE END DMA1_Channel5_IRQn 1 */ }复制代码//在main.c中通过重载来处理DMA接收的数据 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ UNUSED(huart); //printf("%c",aRxBuffer[ss]); /* NOTE : This function should not be modified, when the callback is needed, the HAL_UART_RxCpltCallback can be implemented in the user file */ for (i=0;i<100;i++){ printf("%c",aRxMessage); } HAL_UART_Receive_DMA(&huart1,(uint8_t *)aRxMessage,10); //HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF); } /* USER CODE END 4 */复制代码
所在话题
参与活动
-
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16