你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F0C8T6使用空闲中断+DMA,接收数据不正常

[复制链接]
eefeef001 提问时间:2019-8-23 18:57 /
问题是这样的:
        空闲中断接收,复位后,接收大于1个字节,只能收到第一个字节。
                              复位后,单次接收一个字节,第一次正常,第二次数据会出现在接收数组的第二位中,第三次及往后都正常,接收多字节也正常。







  1. void DMA_Usart2Init(uint32_t bound)
  2. {
  3.     UART2_Handler.Instance = USART2;
  4.     UART2_Handler.Init.BaudRate = bound;
  5.     UART2_Handler.Init.StopBits = UART_STOPBITS_1;
  6.     UART2_Handler.Init.Parity = UART_PARITY_NONE;
  7.     UART2_Handler.Init.Mode = UART_MODE_TX_RX;
  8.     UART2_Handler.Init.WordLength = UART_WORDLENGTH_8B;
  9.     UART2_Handler.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  10.     UART2_Handler.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  11. //        UART2_Handler.Init.OneBitSampling =
  12.         UART2_Handler.Init.OverSampling = UART_OVERSAMPLING_16;
  13.     if(HAL_UART_Init(&UART2_Handler) != HAL_OK)
  14.     {
  15.         Error_Handler();
  16.     }
  17.         
  18.     HAL_NVIC_SetPriority(USART2_IRQn,0,0);//第二个数字,对于Core M0无用
  19.     HAL_NVIC_EnableIRQ(USART2_IRQn);
  20.         
  21.         HAL_NVIC_SetPriority(DMA1_Channel4_5_IRQn, 0, 0);
  22.         HAL_NVIC_EnableIRQ(DMA1_Channel4_5_IRQn);
  23.         
  24.         __HAL_UART_ENABLE_IT(&UART2_Handler,UART_IT_IDLE);//使用空闲中断,不用接收中断
  25. //        __HAL_UART_CLEAR_IDLEFLAG(&UART2_Handler);
  26.         HAL_UART_Receive_DMA(&UART2_Handler,USART2_ReceiveBuf,128);
  27. }








  28. /**
  29. * @brief        串口初始化回调函数.
  30. * @param        huart   串口号USART1,USART2         
  31. * @retval        无.
  32. * @note                2019/07/31.
  33. */
  34. void HAL_UART_MspInit(UART_HandleTypeDef *huart)
  35. {
  36.     //GPIO端口设置
  37.     GPIO_InitTypeDef GPIO_InitStruct;
  38.     if(huart->Instance==USART2)
  39.     {
  40.         USART2_RX_GPIO_CLK_ENABLE();                        //使能GPIOA时钟
  41.         USART2_TX_GPIO_CLK_ENABLE();
  42.                 __HAL_RCC_DMA1_CLK_ENABLE();
  43.         USART2_CLK_ENABLE();                        //使能USART2时钟

  44.         GPIO_InitStruct.Alternate = USART2_TX_AF;
  45.         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  46.         GPIO_InitStruct.Pin = USART2_TX_PIN;
  47.         GPIO_InitStruct.Pull = GPIO_PULLUP;
  48.         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  49.         HAL_GPIO_Init(USART2_TX_PORT, &GPIO_InitStruct);

  50.         GPIO_InitStruct.Alternate = USART2_RX_AF;
  51.         GPIO_InitStruct.Pin = USART2_RX_PIN;
  52.         HAL_GPIO_Init(USART2_RX_PORT, &GPIO_InitStruct);

  53. #ifdef DMA_Usart
  54.         /* USART2 DMA Init */
  55.         /* USART2_RX Init */
  56.         hdma_usart2_rx.Instance = DMA1_Channel5;
  57.         hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  58.         hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  59.         hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
  60.         hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  61.         hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  62.         hdma_usart2_rx.Init.Mode = DMA_NORMAL;
  63.         hdma_usart2_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;        
  64.         if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
  65.         {
  66.             Error_Handler();
  67.         }

  68.         __HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);

  69.         /* USART2_TX Init */
  70.         hdma_usart2_tx.Instance = DMA1_Channel4;
  71.         hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  72.         hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  73.         hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
  74.         hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  75.         hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  76.         hdma_usart2_tx.Init.Mode = DMA_NORMAL;
  77.         hdma_usart2_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
  78.         if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
  79.         {
  80.             Error_Handler();
  81.         }
  82.         __HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);
  83. #else
  84. #endif
  85.     }
  86. }














  87. /**
  88. * @brief        USART2中断服务函数.
  89. * @param        无
  90. * @retval        无.
  91. * @note                2019/07/31.
  92. */
  93. void USART2_IRQHandler(void)
  94. {
  95.     uint32_t timeout = 0;
  96.     HAL_UART_IRQHandler(&UART2_Handler);        //调用HAL库中断处理公用函数        该函数会清空中断标志,取消中断使能,并间接调用回调函数

  97.                 if((__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_IDLE) != RESET))
  98.                 {
  99.                         __HAL_UART_CLEAR_IDLEFLAG(&UART2_Handler);
  100.                     __HAL_UART_CLEAR_IT(&UART2_Handler,UART_FLAG_IDLE);        
  101.                         __HAL_DMA_CLEAR_FLAG(hdma_usart2_rx,DMA_FLAG_TC5);
  102.                         USART2->ICR |= 1<<4;
  103.                         HAL_UART_DMAStop(&UART2_Handler); //
  104.                         len = 128 - (__HAL_DMA_GET_COUNTER(&hdma_usart2_rx));
  105.                         HAL_UART_Receive_DMA(&UART2_Handler,USART2_ReceiveBuf,128);
  106.                         if(len <= 128)
  107.                         {
  108.                                 
  109.                         }
  110.                 }
  111. }
复制代码






2dma.rar

下载

844.87 KB, 下载次数: 1, 下载积分: ST金币 -1

收藏 评论1 发布时间:2019-8-23 18:57

举报

1个回答
wenyangzeng 回答时间:2019-8-23 19:06:33
IDLE中断根本没有处理任何接收数据,如果不使用接收中断则无法随时向缓冲区写入接收数据,当IDLE中断到来时数据就不正确。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版