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

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, 下载次数: 33)
收藏 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版