6. 基于HAL实现 UART

6.1 Cube配置

 

 

6.2 Cube生成代码

  1 UART_HandleTypeDef huart1;
  2 DMA_HandleTypeDef hdma_usart1_rx;
  3 DMA_HandleTypeDef hdma_usart1_tx;
  4 
  5 /* USART1 init function */
  6 
  7 void MX_USART1_UART_Init(void)
  8 {
  9 
 10   /* USER CODE BEGIN USART1_Init 0 */
 11 
 12   /* USER CODE END USART1_Init 0 */
 13 
 14   /* USER CODE BEGIN USART1_Init 1 */
 15 
 16   /* USER CODE END USART1_Init 1 */
 17   huart1.Instance = USART1;
 18   huart1.Init.BaudRate = 115200;
 19   huart1.Init.WordLength = UART_WORDLENGTH_8B;
 20   huart1.Init.StopBits = UART_STOPBITS_1;
 21   huart1.Init.Parity = UART_PARITY_NONE;
 22   huart1.Init.Mode = UART_MODE_TX_RX;
 23   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 24   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
 25   if (HAL_UART_Init(&huart1) != HAL_OK)
 26   {
 27     Error_Handler();
 28   }
 29   /* USER CODE BEGIN USART1_Init 2 */
 30 
 31   /* USER CODE END USART1_Init 2 */
 32 
 33 }
 34 
 35 void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
 36 {
 37 
 38   GPIO_InitTypeDef GPIO_InitStruct = {0};
 39   if(uartHandle->Instance==USART1)
 40   {
 41   /* USER CODE BEGIN USART1_MspInit 0 */
 42 
 43   /* USER CODE END USART1_MspInit 0 */
 44     /* USART1 clock enable */
 45     __HAL_RCC_USART1_CLK_ENABLE();
 46 
 47     __HAL_RCC_GPIOA_CLK_ENABLE();
 48     /**USART1 GPIO Configuration
 49     PA9     ------> USART1_TX
 50     PA10     ------> USART1_RX
 51     */
 52     GPIO_InitStruct.Pin = USART1_TX_Pin|USART1_RX_Pin;
 53     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 54     GPIO_InitStruct.Pull = GPIO_NOPULL;
 55     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 56     GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
 57     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 58 
 59     /* USART1 DMA Init */
 60     /* USART1_RX Init */
 61     hdma_usart1_rx.Instance = DMA2_Stream2;
 62     hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4;
 63     hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
 64     hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
 65     hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
 66     hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
 67     hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
 68     hdma_usart1_rx.Init.Mode = DMA_NORMAL;
 69     hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
 70     hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
 71     if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
 72     {
 73       Error_Handler();
 74     }
 75 
 76     __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);
 77 
 78     /* USART1_TX Init */
 79     hdma_usart1_tx.Instance = DMA2_Stream7;
 80     hdma_usart1_tx.Init.Channel = DMA_CHANNEL_4;
 81     hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
 82     hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
 83     hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
 84     hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
 85     hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
 86     hdma_usart1_tx.Init.Mode = DMA_NORMAL;
 87     hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
 88     hdma_usart1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
 89     if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
 90     {
 91       Error_Handler();
 92     }
 93 
 94     __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);
 95 
 96     /* USART1 interrupt Init */
 97     HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
 98     HAL_NVIC_EnableIRQ(USART1_IRQn);
 99   /* USER CODE BEGIN USART1_MspInit 1 */
100 
101   /* USER CODE END USART1_MspInit 1 */
102   }
103 }
104 
105 void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
106 {
107 
108   if(uartHandle->Instance==USART1)
109   {
110   /* USER CODE BEGIN USART1_MspDeInit 0 */
111 
112   /* USER CODE END USART1_MspDeInit 0 */
113     /* Peripheral clock disable */
114     __HAL_RCC_USART1_CLK_DISABLE();
115 
116     /**USART1 GPIO Configuration
117     PA9     ------> USART1_TX
118     PA10     ------> USART1_RX
119     */
120     HAL_GPIO_DeInit(GPIOA, USART1_TX_Pin|USART1_RX_Pin);
121 
122     /* USART1 DMA DeInit */
123     HAL_DMA_DeInit(uartHandle->hdmarx);
124     HAL_DMA_DeInit(uartHandle->hdmatx);
125 
126     /* USART1 interrupt Deinit */
127     HAL_NVIC_DisableIRQ(USART1_IRQn);
128   /* USER CODE BEGIN USART1_MspDeInit 1 */
129 
130   /* USER CODE END USART1_MspDeInit 1 */
131   }
132 }
133 
134 /* USER CODE BEGIN 1 */
135 
136 /* USER CODE END 1 */

6.3 用户自定义代码

 1 #include "bsp_halUart.h"
 2 
 3 uint8_t _receive_buff[128];
 4 
 5 void bsp_halUart_Init( UART_HandleTypeDef *huart )
 6 {
 7     __HAL_UART_ENABLE_IT(huart, UART_FLAG_IDLE);
 8     UART_Start_Receive_DMA(huart,_receive_buff, sizeof(_receive_buff) );
 9 }
10 
11 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
12 {
13      UART_Start_Receive_DMA(huart,_receive_buff, sizeof(_receive_buff) );
14     if( __HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE ) != RESET )
15     {
16         while(DMA2_Stream2->CR&DMA_SxCR_EN); 
17         __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_IDLE);
18         HAL_UART_DMAStop(huart);
19         UART_Start_Receive_DMA(huart,_receive_buff, sizeof(_receive_buff) );
20         SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
21         HAL_UART_DMAResume(huart);
22     }
23     HAL_UART_DMAResume(huart);
24 }
25 
26  /* End of this file */

6.4 测试

 

posted @ 2022-09-05 23:09  mftang2018  阅读(114)  评论(0编辑  收藏  举报