312011 发表于 2018-6-15 09:05:46

stm32f429 uart dma空闲中断接收不正常

本帖最后由 312011 于 2018-6-15 09:23 编辑

/*
* uart1 dma rx idle intrrupt process
*/
void Addedto_USART1_IRQHandler(void)
{
      if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET) //uart1 dma rx idle intrrupt
      {
                staticuint32_t rxdatanum,temp;
      
                __HAL_UART_CLEAR_IDLEFLAG(&huart1);      //clear uart1 dma rx idle intrrupt flag
                temp =huart1.Instance->SR;
                temp =huart1.Instance->DR;
                temp=huart1.hdmarx->Instance->NDTR;
//                CLEAR_BIT(huart1.Instance->CR3, USART_CR3_DMAR);
//                HAL_DMA_Abort(huart1.hdmarx);
                __HAL_DMA_DISABLE(huart1.hdmarx);
                rxdatanum=UART_DMA_RX_SIZE-(__HAL_DMA_GET_COUNTER(huart1.hdmarx));
               
                /* Enable the DMA transfer for the receiver request by setting the DMAR bit
    in the UART CR3 register */
    SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR);
                /* Enable the Peripheral */
    __HAL_DMA_ENABLE(huart1.hdmarx);
               
                osMessagePut(Queue_EventUart,(rxdatanum +((uint32_t )EVENT_UART1_RX<<16)),0);//send rx event
      }      
      
}

/**
* @brief This function handles USART1 global interrupt.
*/
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 */
      Addedto_USART1_IRQHandler();
/* USER CODE END USART1_IRQn 1 */
}
为什么这样第一次无法正确接收,需要发两次甚至更多次才能收到上一次的数据?中断停在这个空闲中断处理函数里的sMessagePut函数,发现rxdatanum和temp值不正确,什么原因?

电子星辰 发表于 2018-6-15 13:28:55

HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)的Size大了?

feixiang20 发表于 2018-6-16 02:57:57

看是否有缩短延时,检查数组越界和堆栈溢出,设置断点再检查
页: [1]
查看完整版本: stm32f429 uart dma空闲中断接收不正常