OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5998|回复: 7

最近用F429串口DMA加空闲中断实现不定长数据接收一直失败

[复制链接]

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
发表于 2021-6-25 10:07:15 | 显示全部楼层 |阅读模式
10金钱
麻烦哪位大哥有做过得发一下例程

或者哪位大哥抽空实现一下例程

我自己做的 基于cubeMX 实现的  不加DMA是没问题的  但是加上DMA之后  就一直失败 只能接收1个字符  没搞懂问题出在哪

有做过的  麻烦一下啦  

十分感谢!!!

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2021-4-28
在线时间
158 小时
发表于 2021-6-25 10:07:16 | 显示全部楼层
UART_Rec_DMA_IDLE.rar (508.16 KB, 下载次数: 67)
回复

使用道具 举报

6

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2021-4-28
在线时间
158 小时
发表于 2021-6-25 11:22:42 | 显示全部楼层
代码上传下
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-6-25 11:33:40 | 显示全部楼层

static void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);        //使能空闲中断
  HAL_UART_Receive_DMA(&huart1,usart1_rcv_fifo.fifo[usart1_rcv_fifo.head].buf,BLE_RBUF_LENGTH);
//  __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_IDLE);
  /* USER CODE END USART1_Init 2 */

}

static void MX_DMA_Init(void)
{

  /* DMA controller clock enable */
  __HAL_RCC_DMA2_CLK_ENABLE();

  /* DMA interrupt init */
  /* DMA2_Stream2_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 5, 0);
  HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);

}


void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  uint16_t len;
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  
  if( (__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))
  {
           huart1.RxState = HAL_UART_STATE_READY;
           __HAL_UART_FLUSH_DRREGISTER(&huart1);
//          __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_IDLE);  
//          huart1.Instance->SR;
//          huart1.Instance->DR;
          len = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);         //读取DMA剩余传输数量
//          huart1.RxXferCount = 0;
          HAL_UART_DMAStop(&huart1);
          usart1_rcv_fifo.fifo[usart1_rcv_fifo.head].length = BLE_RBUF_LENGTH - len;// huart1.RxXferCount;

          usart1_rcv_fifo_in(&usart1_rcv_fifo);//数据放入缓存区
  }
  /* USER CODE END USART1_IRQn 1 */
}
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-6-25 11:34:05 | 显示全部楼层

工程师CUBEMX生成的
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-6-25 11:35:22 | 显示全部楼层
wwhh 发表于 2021-6-25 11:34
工程师CUBEMX生成的

IDLE中断 进来的时候  DMA只接收到一个字符
回复

使用道具 举报

6

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2021-4-28
在线时间
158 小时
发表于 2021-6-25 12:01:11 | 显示全部楼层
1.png

2.png
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-6-25 12:15:20 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 14:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表