STM32G031K6 LL庫的使用 - UART

串口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<length;i++)
    {
        while(!LL_USART_IsActiveFlag_TXE(USART1));
        LL_USART_TransmitData8(USART1,buffer[i]);
    }
}

串口數據接收通過DMA進行,不需要串口接收函數,DMA具體配置另作說明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章