使用LL库开发STM32:UART基础使用
文章目錄
- 目的
- 基礎(chǔ)說明與初始化
- 基礎(chǔ)說明
- 初始化配置
- 數(shù)據(jù)接收和發(fā)送
- 輪詢方式
- 中斷方式
- DMA方式
- 總結(jié)
目的
UART(異步串口)是單片機非常常用的一個功能,一般用作設(shè)備或模塊間通訊的一種方式。通常所說的232或是485通訊從寫程序的角度來說就是使用UART進(jìn)行通訊。(這個地方有些人會混淆,串口更多是一種通訊方式、機制,而TTL、232、485更多的是電氣相關(guān)特性)
HAL庫使用UART非常簡單,LL庫相對來說會稍微麻煩一點點。HAL庫設(shè)計了三套數(shù)據(jù)首發(fā)了模式,你可以選擇其中一套使用,這對新手來說上手可以非常快,但現(xiàn)實情況中這三套模式其實不是那么實用的,你如果想要在此基礎(chǔ)上做些改變就會麻煩。UART中使用LL庫相對來說是個更好的選擇,這篇文章先講下LL庫中使用UART的基本操作。
基礎(chǔ)說明與初始化
基礎(chǔ)說明
STM32系列MCU大多都有多個UART可以使用,每個UART可以設(shè)置獨立的參數(shù),和其它設(shè)備通訊時通訊的雙方必須有相同的參數(shù)。一般會涉及的參數(shù)如下:
- BaudRate 波特率,通訊速率,當(dāng)其他參數(shù)默認(rèn)時,每秒可傳輸字節(jié)數(shù)約為 BaudRate/10;
- WordLength 數(shù)據(jù)位,數(shù)據(jù)位表示每一個數(shù)據(jù)包含bit數(shù),一般用8bit,即一個數(shù)據(jù)為一個字節(jié);
- StopBits 停止位,停止位用來表示一個數(shù)據(jù)傳輸結(jié)束;
- Parity 校驗位,校驗位用來校驗傳輸?shù)臄?shù)據(jù)是否正確,一般也比較少用,通訊用的協(xié)議一般帶自己的校驗方式;
- HwFlowCtl 流控制,現(xiàn)在比較少用到;
- OverSampling 過采樣,一般默認(rèn)就行;
初始化配置
使用STM32CubeIDE或STM32CubeMX來初始化UART的話我們一般只要根據(jù)需求設(shè)置基本參數(shù)、中斷、DMA即可,如下圖所示:
使用中如果需要更改相關(guān)參數(shù)的話可以直接按照軟件生成的初始化程序來,也可以使用LL庫中提供的修改單獨參數(shù)的方法:
- LL_USART_SetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling, uint32_t BaudRate)
設(shè)置通訊波特率; - LL_USART_SetDataWidth(USART_TypeDef *USARTx, uint32_t DataWidth)
設(shè)置數(shù)據(jù)位長度; - LL_USART_SetStopBitsLength(USART_TypeDef *USARTx, uint32_t StopBits)
設(shè)置停止位長度; - LL_USART_SetParity(USART_TypeDef *USARTx, uint32_t Parity)
設(shè)置校驗位; - LL_USART_SetTransferDirection(USART_TypeDef *USARTx, uint32_t TransferDirection)
設(shè)置傳輸方向; - LL_USART_SetHWFlowCtrl(USART_TypeDef *USARTx, uint32_t HardwareFlowControl)
設(shè)置硬件流控制; - LL_USART_SetOverSampling(USART_TypeDef *USARTx, uint32_t OverSampling)
設(shè)置過采樣;
數(shù)據(jù)接收和發(fā)送
HAL庫中UART的數(shù)據(jù)接收和發(fā)送設(shè)計了輪詢、中斷、DMA三種方式來使用,這篇文章中將介紹下LL庫中這三種基礎(chǔ)的使用方式。
輪詢方式
如果只是要測試串口收發(fā)數(shù)據(jù)的話,輪詢方式不管是配置還是使用都是最簡單的,先看下面演示:
上面演示中軟件配置中只是使能了USART1,將其設(shè)置成異步模式,然后將相關(guān)的庫設(shè)置為LL庫,其它的都沒改,在生成的程序中在主循環(huán)中添加了少量代碼就實現(xiàn)了將收到的數(shù)據(jù)回傳的功能。其中涉及的方法如下:
- uint32_t LL_USART_IsActiveFlag_RXNE(USART_TypeDef *USARTx)
查詢是否有收到可讀取的數(shù)據(jù); - uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx)
讀取收到的數(shù)據(jù),讀取后會自動清除RXNE標(biāo)志位; - uint32_t LL_USART_IsActiveFlag_TXE(USART_TypeDef *USARTx)
查詢是否可以向發(fā)送數(shù)據(jù)寄存器寫數(shù)據(jù); - void LL_USART_TransmitData8(USART_TypeDef *USARTx, uint8_t Value)
將數(shù)據(jù)寫入發(fā)送數(shù)據(jù)寄存器,寫入后數(shù)據(jù)將自動發(fā)送;
中斷方式
上面的輪詢方式在實際項目中通常使用率不是那么高,中斷的方式更加常用些,先看下面演示:
上面演示中除了軟件自動生成的代碼手動添加的代碼只有開啟中斷已經(jīng)中斷回調(diào)函數(shù)中的操作,新涉及的方法如下:
- void LL_USART_EnableIT_RXNE(USART_TypeDef *USARTx)
使能RXNE中斷; - uint32_t LL_USART_IsEnabledIT_RXNE(USART_TypeDef *USARTx)
查詢是否是RXNE中斷;
上面例子中只用到了接收中斷,發(fā)送中斷也有相應(yīng)的方法使能和查詢。另外可以用 LL_USART_ClearFlag_.... 方法來清除中斷標(biāo)志。
DMA方式
和中斷方式相比使用DMA方式使用頻率就更高了,先看下面演示:
- 初始化配置
- 測試代碼
- 通訊測試
上面演示中除了軟件自動生成的代碼,我們需要手動添加下面這些內(nèi)容來啟用相應(yīng)功能:
- 設(shè)置外設(shè)地址
void LL_DMA_SetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t PeriphAddress)
使用上面方法來設(shè)置外設(shè)地址,這個演示中指USART的DR寄存器地址,通過下面方法獲取:
uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx) - 設(shè)置內(nèi)存地址
void LL_DMA_SetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress)
使用上面方法來設(shè)置內(nèi)存地址,這個演示中指接收或發(fā)的數(shù)組數(shù)據(jù); - 設(shè)置數(shù)據(jù)長度
void LL_DMA_SetDataLength(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t NbData)
使用上面方法來設(shè)置要傳輸?shù)臄?shù)據(jù)長度; - 使能相應(yīng)的中斷
void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream)
這個演示中使用了上面方法來開啟DMA傳輸完成中斷; - 使能USART的DMA傳輸
void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx)
void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx)
使用上面方法分別使能USART通過DMA傳輸數(shù)據(jù); - 啟動DMA傳輸
void LL_DMA_EnableStream(DMA_TypeDef *DMAx, uint32_t Stream)
使用上面方法后數(shù)據(jù)將開始傳輸;
上面演示中在中斷回調(diào)函數(shù)中我們進(jìn)行了下面的操作:
- 判斷中斷事件類型
uint32_t LL_DMA_IsActiveFlag_xxx(DMA_TypeDef *DMAx)
使用上面方法來判斷中斷類型; - 清除中斷標(biāo)志
void LL_DMA_ClearFlag_xxx(DMA_TypeDef *DMAx)
使用上面方法來清除中斷標(biāo)志; - 停止已完成的DMA傳輸
void LL_DMA_DisableStream(DMA_TypeDef *DMAx, uint32_t Stream)
使用上面方法可以停止DMA傳輸; - 添加所需的功能代碼
上面演示中我在接收完成中斷中啟動了USART DMA發(fā)送功能,將收到的數(shù)據(jù)回發(fā);在發(fā)送完成中斷中重新啟動了USART DMA接收功能;
總結(jié)
用LL庫來使用UART相比HAL庫也并沒有復(fù)雜太多,不過和HAL庫對于各種芯片有著較好兼容性不同的是LL庫對于各種芯片的兼容性不怎么好,比如STM32F4系列的芯片中DMA涉及Stream,而STM32F1系列芯片的DMA并沒有Stream卻有Channel,兩者代碼上無法直接套用。
事實上這篇文章中的各個演示只是介紹了下LL庫中UART的基本使用方法,實際項目中通常不會這么用,更常見的使用方法將在后面的文章中介紹。
總結(jié)
以上是生活随笔為你收集整理的使用LL库开发STM32:UART基础使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 焊接机器人编程及调试方法
- 下一篇: J - 单源最短路