• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

STM32L053 HAL DMA串口接收不定长数据

1553430737@qq.com 2017-10-27 浏览量:2325

第一次搞HAL库,百度了下hal库串口接收不定长数据只能串口回调轮询orDMA接收,配置了下DMA初始化一直死机,问下老司机们怎么整的




UART_HandleTypeDef Uart1Handle;
DMA_HandleTypeDef DMA_USART1_rx;
DMA_HandleTypeDef DMA_USART1_tx;

int Rx1_flag;
int Rx1_cnt ;
unsigned char Rx1_buf[129];
unsigned char Tx1_buf[129];

void UART1_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;

	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_USART1_CLK_ENABLE();
	__HAL_RCC_DMA1_CLK_ENABLE();
	
  /* UART TX GPIO pin configuration  */  
  GPIO_InitStruct.Pin       = GPIO_PIN_9;
  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;  
  GPIO_InitStruct.Pull      = GPIO_NOPULL;  
  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;  
  GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* UART RX GPIO pin configuration  */  
  GPIO_InitStruct.Pin = GPIO_PIN_10;
  GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	
  Uart1Handle.Instance        = USART1;
  Uart1Handle.Init.BaudRate   = 115200;
  Uart1Handle.Init.WordLength = UART_WORDLENGTH_8B;
  Uart1Handle.Init.StopBits   = UART_STOPBITS_1;
  Uart1Handle.Init.Parity     = UART_PARITY_NONE;
  Uart1Handle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  Uart1Handle.Init.Mode       = UART_MODE_TX_RX;
	Uart1Handle.Init.OverSampling = UART_OVERSAMPLING_16;
	Uart1Handle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
	Uart1Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if(HAL_UART_Init(&Uart1Handle) != HAL_OK)
  {
    while(1);
  }
	HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(USART1_IRQn);
	__HAL_UART_ENABLE_IT(&Uart1Handle, UART_IT_IDLE);
	
	DMA_USART1_rx.Instance = DMA1_Channel3;
	DMA_USART1_rx.Init.Request = DMA_REQUEST_3;
	DMA_USART1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
	DMA_USART1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
	DMA_USART1_rx.Init.MemInc = DMA_MINC_ENABLE;
	DMA_USART1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
	DMA_USART1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
	DMA_USART1_rx.Init.Mode = DMA_NORMAL;
	DMA_USART1_rx.Init.Priority = DMA_PRIORITY_LOW;
	__HAL_LINKDMA(&Uart1Handle,hdmarx,DMA_USART1_rx);

	if (HAL_DMA_Init(&DMA_USART1_rx) != HAL_OK)
	{
		while(1);
	}
	
	DMA_USART1_tx.Instance = DMA1_Channel2;
	DMA_USART1_tx.Init.Request = DMA_REQUEST_3;
	DMA_USART1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
	DMA_USART1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
	DMA_USART1_tx.Init.MemInc = DMA_MINC_ENABLE;
	DMA_USART1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
	DMA_USART1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
	DMA_USART1_tx.Init.Mode = DMA_NORMAL;
	DMA_USART1_tx.Init.Priority = DMA_PRIORITY_LOW;
	if (HAL_DMA_Init(&DMA_USART1_tx) != HAL_OK)
	{
		while(1);
	}
	__HAL_LINKDMA(&Uart1Handle,hdmatx,DMA_USART1_tx);
	HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);

	HAL_UART_Receive_DMA(&Uart1Handle, Rx1_buf,Rx1_cnt);
}
void USART1_SendStr(unsigned char *Tx,int length)
{
	HAL_UART_Transmit(&Uart1Handle,Tx,length,0xffff);
}
void dma_printf(const char *format, ...)
{
    uint32_t length;
    va_list args;
    va_start(args, format);
    length = vsnprintf((char *)Tx1_buf, sizeof(Tx1_buf), (char *)format, args);
    va_end(args);

    HAL_UART_Transmit_DMA(&Uart1Handle, (uint8_t *)Tx1_buf, length);
}
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&Uart1Handle);
  /* USER CODE BEGIN USART2_IRQn 1 */

  /* USER CODE END USART2_IRQn 1 */
}

串口相关代码,工程在下面

Light_Ctrl.rar

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案

其他答案 数量:3
电子老工程师 回复了  :https://atta.szlcsc.com/upload/public/pdf/source/20190124/C367052_4BCE2F5F48A58DFB2147E525F68966DF.pdf 回复

电子老工程师 回复了  :尾缀"Y”代表汽车级。 回复

电子老工程师 回复了  :支持 回复

相关问题

问题达人换一批

STM32L053 HAL DMA串口接收不定长数据