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

STM32L053 DMA串口接收不定长数据初始化问题

[复制链接]
cgz127 提问时间:2017-10-27 09:30 /
项目需求第一次用HAL库,百度了下串口接收不定长数据除了频繁进中断就只能用DMA了,初始化一直死机,大牛们给看看啊

  1. UART_HandleTypeDef Uart1Handle;
  2. DMA_HandleTypeDef DMA_USART1_rx;
  3. DMA_HandleTypeDef DMA_USART1_tx;

  4. int Rx1_flag;
  5. int Rx1_cnt ;
  6. unsigned char Rx1_buf[129];
  7. unsigned char Tx1_buf[129];

  8. void UART1_Init(void)
  9. {
  10.         GPIO_InitTypeDef  GPIO_InitStruct;

  11.         __HAL_RCC_GPIOA_CLK_ENABLE();
  12.         __HAL_RCC_USART1_CLK_ENABLE();
  13.         __HAL_RCC_DMA1_CLK_ENABLE();
  14.        
  15.   /* UART TX GPIO pin configuration  */  
  16.   GPIO_InitStruct.Pin       = GPIO_PIN_9;
  17.   GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;  
  18.   GPIO_InitStruct.Pull      = GPIO_NOPULL;  
  19.   GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;  
  20.   GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
  21.         HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  22.   /* UART RX GPIO pin configuration  */  
  23.   GPIO_InitStruct.Pin = GPIO_PIN_10;
  24.   GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
  25.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  26.        
  27.   Uart1Handle.Instance        = USART1;
  28.   Uart1Handle.Init.BaudRate   = 115200;
  29.   Uart1Handle.Init.WordLength = UART_WORDLENGTH_8B;
  30.   Uart1Handle.Init.StopBits   = UART_STOPBITS_1;
  31.   Uart1Handle.Init.Parity     = UART_PARITY_NONE;
  32.   Uart1Handle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  33.   Uart1Handle.Init.Mode       = UART_MODE_TX_RX;
  34.         Uart1Handle.Init.OverSampling = UART_OVERSAMPLING_16;
  35.         Uart1Handle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  36.         Uart1Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  37.   if(HAL_UART_Init(&Uart1Handle) != HAL_OK)
  38.   {
  39.     while(1);
  40.   }
  41.         HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
  42.         HAL_NVIC_EnableIRQ(USART1_IRQn);
  43.         __HAL_UART_ENABLE_IT(&Uart1Handle, UART_IT_IDLE);
  44.        
  45.         DMA_USART1_rx.Instance = DMA1_Channel3;
  46.         DMA_USART1_rx.Init.Request = DMA_REQUEST_3;
  47.         DMA_USART1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  48.         DMA_USART1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  49.         DMA_USART1_rx.Init.MemInc = DMA_MINC_ENABLE;
  50.         DMA_USART1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  51.         DMA_USART1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  52.         DMA_USART1_rx.Init.Mode = DMA_NORMAL;
  53.         DMA_USART1_rx.Init.Priority = DMA_PRIORITY_LOW;
  54.         __HAL_LINKDMA(&Uart1Handle,hdmarx,DMA_USART1_rx);

  55.         if (HAL_DMA_Init(&DMA_USART1_rx) != HAL_OK)
  56.         {
  57.                 while(1);
  58.         }
  59.        
  60.         DMA_USART1_tx.Instance = DMA1_Channel2;
  61.         DMA_USART1_tx.Init.Request = DMA_REQUEST_3;
  62.         DMA_USART1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  63.         DMA_USART1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  64.         DMA_USART1_tx.Init.MemInc = DMA_MINC_ENABLE;
  65.         DMA_USART1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  66.         DMA_USART1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  67.         DMA_USART1_tx.Init.Mode = DMA_NORMAL;
  68.         DMA_USART1_tx.Init.Priority = DMA_PRIORITY_LOW;
  69.         if (HAL_DMA_Init(&DMA_USART1_tx) != HAL_OK)
  70.         {
  71.                 while(1);
  72.         }
  73.         __HAL_LINKDMA(&Uart1Handle,hdmatx,DMA_USART1_tx);
  74.         HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0);
  75.         HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);

  76.         HAL_UART_Receive_DMA(&Uart1Handle, Rx1_buf,Rx1_cnt);
  77. }
  78. void USART1_SendStr(unsigned char *Tx,int length)
  79. {
  80.         HAL_UART_Transmit(&Uart1Handle,Tx,length,0xffff);
  81. }
  82. void dma_printf(const char *format, ...)
  83. {
  84.     uint32_t length;
  85.     va_list args;
  86.     va_start(args, format);
  87.     length = vsnprintf((char *)Tx1_buf, sizeof(Tx1_buf), (char *)format, args);
  88.     va_end(args);

  89.     HAL_UART_Transmit_DMA(&Uart1Handle, (uint8_t *)Tx1_buf, length);
  90. }
  91. void USART1_IRQHandler(void)
  92. {
  93.   /* USER CODE BEGIN USART2_IRQn 0 */
  94.   /* USER CODE END USART2_IRQn 0 */
  95.   HAL_UART_IRQHandler(&Uart1Handle);
  96.   /* USER CODE BEGIN USART2_IRQn 1 */

  97.   /* USER CODE END USART2_IRQn 1 */
  98. }
复制代码
Light_Ctrl.rar (910.1 KB, 下载次数: 32)
收藏 1 评论6 发布时间:2017-10-27 09:30

举报

6个回答
斜阳__ 回答时间:2017-11-14 10:08:55
一直死机,死在哪个位置?建议你使用cubeMX配置初始化代码

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2017-11-14 10:39:52
是执行完 HAL_DMA_Init 死吗?
没有看到DMA中断入口的处理程序。

建议解决过程:
先测试串口是否已经初始化完成,并且可以发送数据,
再测试DMA是否初始化成功,并且可以接收数据。
还有,建议为while(1),增加超时退出功能。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

power568 回答时间:2017-11-14 13:03:21
本帖最后由 power568 于 2017-11-14 13:08 编辑

串口一般不会导致死机的,建议:1. 检查你的SysTick中断是否打开,有可能死在某个超时等待处;
2. 使用STM32Cube软件生成初始化程序,看是软件问题还是硬件问题,测试稳定后再移植到你的工程中;
3. 使用HAL库的话,SysTick中断一定要打开,库里的很多超时都是基于SysTick的;

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

技术范儿 回答时间:2017-11-14 17:14:21
我很少用DMA,一帧数据 用IDLE中断没有的开个定时器自己模拟一个

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

五哥1 回答时间:2017-11-14 17:25:22
初始化死机正是你用仿真一步一步跟踪的好时机,自己的程序自己来看,自己的问题最终都是自己解决的,

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

xiaoouyang 回答时间:2018-7-17 15:25:18
我都很少用DMA直接用定时器模拟比较好 HAL库DMA的问题太多了 很多坑

评分

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

查看全部评分

所属标签

相似问题

官网相关资源

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