jqwx2010 发表于 2016-12-27 02:04:51

据我实测:
使用串口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);
   

/* 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 */
页: 1 2 3 [4]
查看完整版本: HAL_UART_Receive_DMA 和 HAL_UART_Transmit_DMA 怎么用 在线等呢.