6. 基于HAL实现 UART
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 */
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 */