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

stm32G4 cubemx串口+DMA接受不定长数据

[复制链接]
STMCU小助手 发布时间:2023-2-24 23:00
串口DMA收不定长数据
主要利用了IDLE空闲中断,然后整体验证采用透传,发送后回传数据。
整体流程
1cubemx配置
2接收发送数组,标志位定义,
3中断使能
4中断函数修改
5回调函数修改

一、cubemx配置


e3d17b81928c4ad6906a4e29616b5d4f.png

波特率随便设置,我设置的是1M,注意你的上位机和串口助手是否选择一致的参数

f0007c213bf8406799a77aabb62c2ad9.png

DMA USART1 TX RX 设置,mode都是normal模式就可以

22092d53b6074b0493b34b0d66a527d8.png


二、程序修改
1.初始数组定义
  1. uint8_t                Rx_Flag = 0;         //接收标志位
  2. uint8_t                RecCount = 0;         //个数
  3. uint8_t                Rx_Buf[256];             //接收缓冲区
  4. uint8_t     Tx_Buf[256];
复制代码

2.中断使能配置
  1. void MX_USART1_UART_Init(void)
  2. {

  3.   /* USER CODE BEGIN USART1_Init 0 */

  4.   /* USER CODE END USART1_Init 0 */

  5.   /* USER CODE BEGIN USART1_Init 1 */

  6.   /* USER CODE END USART1_Init 1 */
  7.   huart1.Instance = USART1;
  8.   huart1.Init.BaudRate = 1000000;
  9.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  10.   huart1.Init.StopBits = UART_STOPBITS_1;
  11.   huart1.Init.Parity = UART_PARITY_NONE;
  12.   huart1.Init.Mode = UART_MODE_TX_RX;
  13.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  14.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  15.   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  16.   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  17.   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  18.   if (HAL_RS485Ex_Init(&huart1, UART_DE_POLARITY_HIGH, 0, 0) != HAL_OK)
  19.   {
  20.     Error_Handler();
  21.   }
  22.   if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  23.   {
  24.     Error_Handler();
  25.   }
  26.   if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }
  30.   if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }
  34.   /* USER CODE BEGIN USART1_Init 2 */
  35.         __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//开启idle中断
  36.           HAL_UART_Receive_DMA(&huart1, Rx_Buf, 256);        //开启dma中断
  37.   /* USER CODE END USART1_Init 2 */

  38. }
复制代码

3.中断函数修改
  1.   */
  2. void USART1_IRQHandler(void)
  3. {
  4.   /* USER CODE BEGIN USART1_IRQn 0 */
  5.        
  6.   /* USER CODE END USART1_IRQn 0 */
  7.   HAL_UART_IRQHandler(&huart1);
  8.   /* USER CODE BEGIN USART1_IRQn 1 */
  9.         //添加idle中断处理
  10.   if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)  //是否发生idle中断
  11.         {
  12.                 __HAL_UART_CLEAR_IDLEFLAG(&huart1);   //清除idle中断
  13.                 HAL_UART_IdleCpltCallback(&huart1);   //用户编写的中断回调函数
  14.         }


  15.   /* USER CODE END USART1_IRQn 1 */
  16. }
复制代码

4.回调函数修改
  1. void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)     //空闲中断函数
  2. {
  3.    Rx_Flag = 1;                                              // 设置接收完成标志
  4.    HAL_UART_DMAStop(huart);                                 // 停止DMA传输

  5.    //发生空闲中断时,已接受的数据等于数据总减去dma中待接收的数据
  6.    RecCount= 256 - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);   

  7.          memcpy(Tx_Buf, Rx_Buf, RecCount);                     //内存复制函数
  8.          memset(Rx_Buf, 0, sizeof(Rx_Buf));                    // 清零接收缓存区
  9.          HAL_UART_Receive_DMA(&huart1,Rx_Buf, sizeof(Rx_Buf));   //重新开启DMA传输
  10.          
  11.        
  12. }
复制代码


————————————————
版权声明:超级馒头神


收藏 评论0 发布时间:2023-2-24 23:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版