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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版