STM32F0使用LL库实现UART接收

Posted amw2738

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
}

 

以上是关于STM32F0使用LL库实现UART接收的主要内容,如果未能解决你的问题,请参考以下文章

STM32F0 DMA“输入溢出”

stm32f0 uart编程

STM32学习笔记 二基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发

如何在 STM32F1 上使用 HAL 库永久启用 uart RX 中断

无法通过 UART 传输每个字符

STM32F4 UART1 DMA发送和接收不定长度数据