STM32F0使用LL库实现UART接收
初始化:
1 void MX_USART1_UART_Init(void) 2 { 3 4 /* USER CODE BEGIN USART1_Init 0 */ 5 6 /* USER CODE END USART1_Init 0 */ 7 8 LL_USART_InitTypeDef USART_InitStruct = {0}; 9 10 LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; 11 12 /* Peripheral clock enable */ 13 LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_USART1); 14 15 LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); 16 17 LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); 18 /**USART1 GPIO Configuration 19 PA9 ------> USART1_TX 20 PA10 ------> USART1_RX 21 */ 22 GPIO_InitStruct.Pin = LL_GPIO_PIN_9; 23 GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; 24 GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; 25 GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; 26 GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; 27 GPIO_InitStruct.Alternate = LL_GPIO_AF_1; 28 LL_GPIO_Init(GPIOA, &GPIO_InitStruct); 29 30 GPIO_InitStruct.Pin = LL_GPIO_PIN_10; 31 GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; 32 GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; 33 GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; 34 GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; 35 GPIO_InitStruct.Alternate = LL_GPIO_AF_1; 36 LL_GPIO_Init(GPIOA, &GPIO_InitStruct); 37 38 /* USART1 DMA Init */ 39 LL_DMA_DeInit(DMA1, LL_DMA_CHANNEL_3); 40 /* USART1_RX Init */ 41 LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_3, LL_DMA_DIRECTION_PERIPH_TO_MEMORY); 42 43 LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PRIORITY_LOW); 44 45 LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MODE_NORMAL); 46 47 LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PERIPH_NOINCREMENT); 48 49 LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MEMORY_INCREMENT); 50 51 LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PDATAALIGN_BYTE); 52 53 LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MDATAALIGN_BYTE); 54 55 /* USER CODE BEGIN USART1_Init 1 */ 56 LL_DMA_SetMemoryAddress(DMA1,LL_DMA_CHANNEL_3,(uint32_t)g_sSecUartInfo.ucRbuf); 57 LL_DMA_SetPeriphAddress(DMA1,LL_DMA_CHANNEL_3,(uint32_t)&USART1->RDR); 58 LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_3,Sec_UART_MAX_LEN); 59 60 /* USER CODE END USART1_Init 1 */ 61 USART_InitStruct.BaudRate = 1200; 62 USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; 63 USART_InitStruct.StopBits = LL_USART_STOPBITS_1; 64 USART_InitStruct.Parity = LL_USART_PARITY_NONE; 65 USART_InitStruct.TransferDirection = LL_USART_DIRECTION_RX; 66 USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; 67 USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; 68 LL_USART_Init(USART1, &USART_InitStruct); 69 LL_USART_DisableIT_CTS(USART1); 70 LL_USART_ConfigAsyncMode(USART1); 71 LL_USART_Enable(USART1); 72 /* USER CODE BEGIN USART1_Init 2 */ 73 LL_USART_EnableDMAReq_RX(USART1); 74 LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_3); 75 /* USER CODE END USART1_Init 2 */ 76 77 }
数据处理:
if(LL_DMA_IsActiveFlag_TC3(DMA1))
{
LL_DMA_ClearFlag_GI3(DMA1);
LL_DMA_DisableChannel(DMA1,LL_DMA_CHANNEL_3);
LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_3,Sec_UART_MAX_LEN);
LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_3);
}