说明:驱动基于STm32G031K6测试,其他型号需自行做改动。
串口1的初始化:
//使用串口1,通过中断和DMA进行数据收发。DMA的初始化另作说明
void STM32LLUart1Init(void)
{
LL_USART_InitTypeDef UART_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); //使能GPIO时钟
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); //使能串口1时钟
GPIO_InitStruct.Pin = bspUART1_TX_PIN; //TXPin指定
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; //io模式配置为复用模式
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; //设置为高速率
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; //设置为推挽输出
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; //不带上拉
GPIO_InitStruct.Alternate = LL_GPIO_AF_1; //选择复用IO功能
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = bspUART1_RX_PIN; //TXPin指定
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_1; //选择复用IO功能
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
NVIC_SetPriority(USART1_IRQn, 0); //开启串口中断
NVIC_EnableIRQ(USART1_IRQn);
UART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; //设置时钟预分频
UART_InitStruct.BaudRate = 115200; //设置串口通信波特率
UART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据位
UART_InitStruct.StopBits = LL_USART_STOPBITS_1; //1位停止位
UART_InitStruct.Parity = LL_USART_PARITY_NONE; //奇偶校验关闭
UART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; //数据收发功能都开
UART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;//硬件流控关闭
UART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; //数据采样频率倍数设置
LL_USART_Init(USART1, &UART_InitStruct);
LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8,暂时不理解这个,可能是串口中断产生时的fifo阈值吧
LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8
LL_USART_DisableFIFO(USART1); //因为使用dma接收,关闭FIFO
LL_USART_ConfigAsyncMode(USART1); //其他基本配置
LL_USART_Enable(USART1); //使能串口
while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1)))); //检查相关标志位
LL_USART_EnableIT_IDLE(USART1); //使能空闲中断
LL_USART_EnableIT_ERROR(USART1); //使能错误中断
}
串口中断处理函数:
void USART1_IRQHandler(void)
{
uint32_t isr_reg = 0;
isr_reg = LL_USART_ReadReg(USART1, ISR);
if (LL_USART_IsActiveFlag_IDLE(USART1))
{
LL_USART_ClearFlag_IDLE(USART1);
//设置串口接收使用DMA,串口接收的数据会自动保存到DMA初始化时配置的缓存内,
//这里可能需要对收取到缓存的数据做一些操作。
}
LL_USART_WriteReg(USART1,ICR,isr_reg)
}
串口发送函数:
void STM32LLUart1SendBuffer(uint8_t *buffer,uint16_t length)
{
uint16_t i = 0;
for(i=0;i
{
while(!LL_USART_IsActiveFlag_TXE(USART1));
LL_USART_TransmitData8(USART1,buffer
);
}
}
串口数据接收通过DMA进行,不需要串口接收函数,DMA具体配置另作说明。
说明:驱动基于STm32G031K6测试,其他型号需自行做改动。
串口1的初始化:
//使用串口1,通过中断和DMA进行数据收发。DMA的初始化另作说明
void STM32LLUart1Init(void)
{
LL_USART_InitTypeDef UART_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); //使能GPIO时钟
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); //使能串口1时钟
GPIO_InitStruct.Pin = bspUART1_TX_PIN; //TXPin指定
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; //io模式配置为复用模式
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; //设置为高速率
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; //设置为推挽输出
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; //不带上拉
GPIO_InitStruct.Alternate = LL_GPIO_AF_1; //选择复用IO功能
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = bspUART1_RX_PIN; //TXPin指定
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_1; //选择复用IO功能
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
NVIC_SetPriority(USART1_IRQn, 0); //开启串口中断
NVIC_EnableIRQ(USART1_IRQn);
UART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; //设置时钟预分频
UART_InitStruct.BaudRate = 115200; //设置串口通信波特率
UART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据位
UART_InitStruct.StopBits = LL_USART_STOPBITS_1; //1位停止位
UART_InitStruct.Parity = LL_USART_PARITY_NONE; //奇偶校验关闭
UART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; //数据收发功能都开
UART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;//硬件流控关闭
UART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; //数据采样频率倍数设置
LL_USART_Init(USART1, &UART_InitStruct);
LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8,暂时不理解这个,可能是串口中断产生时的fifo阈值吧
LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8
LL_USART_DisableFIFO(USART1); //因为使用dma接收,关闭FIFO
LL_USART_ConfigAsyncMode(USART1); //其他基本配置
LL_USART_Enable(USART1); //使能串口
while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1)))); //检查相关标志位
LL_USART_EnableIT_IDLE(USART1); //使能空闲中断
LL_USART_EnableIT_ERROR(USART1); //使能错误中断
}
串口中断处理函数:
void USART1_IRQHandler(void)
{
uint32_t isr_reg = 0;
isr_reg = LL_USART_ReadReg(USART1, ISR);
if (LL_USART_IsActiveFlag_IDLE(USART1))
{
LL_USART_ClearFlag_IDLE(USART1);
//设置串口接收使用DMA,串口接收的数据会自动保存到DMA初始化时配置的缓存内,
//这里可能需要对收取到缓存的数据做一些操作。
}
LL_USART_WriteReg(USART1,ICR,isr_reg)
}
串口发送函数:
void STM32LLUart1SendBuffer(uint8_t *buffer,uint16_t length)
{
uint16_t i = 0;
for(i=0;i
{
while(!LL_USART_IsActiveFlag_TXE(USART1));
LL_USART_TransmitData8(USART1,buffer);
}
}
串口数据接收通过DMA进行,不需要串口接收函数,DMA具体配置另作说明。
举报