1
HAL庫中UART相關(guān)結(jié)構(gòu)體的內(nèi)容
本小節(jié)參考《description-of-stm32f0-hal-and-lowlayer-drivers-stmicroelectronics》、《STM32F051x 參考手冊中文》。
UART的結(jié)構(gòu)體有兩個,如圖,UART_InitTypeDef是初始化結(jié)構(gòu)體,包含UART開始運(yùn)行時的配置;UART_HandleTypeDef是句柄結(jié)構(gòu)體,包含UART所有運(yùn)行時的信息。
UART_InitTypeDef初始化結(jié)構(gòu)體中包含,波特率、幀的字長、停止位長度、奇偶校驗(yàn)方式、工作模式、硬件流模式和過(超)采樣率設(shè)置。
其中過采樣的目的類似于一種低通濾波,Stm32通過對一幀進(jìn)行16次或者8次采樣,并對采樣結(jié)果進(jìn)行“多數(shù)票決”來判斷該幀為起始位或是數(shù)據(jù)位的0或1。詳見《STM32F051x 參考手冊中文》573頁。
硬件流控制是通過硬件對UART傳輸進(jìn)行更精細(xì)的控制的手段。UART傳輸中,Stm32通過nCTS端口讀取對方的nRTS端口電平,獲知對方是否準(zhǔn)備好接受新的數(shù)據(jù),這種操作可以避免數(shù)據(jù)寄存器中未被讀出的舊數(shù)據(jù)被新數(shù)據(jù)刷新掉的情況發(fā)生。詳見《STM32F051x 參考手冊中文》604頁。
UART_HandleTypeDef是UART句柄結(jié)構(gòu)體,包含了UART運(yùn)行過程中HAL層的所有信息。
2
UART初始化三步
在介紹Stm32的HAL初始化UART之前,我們先看一下Arduino怎么初始化UART的。
Arduino使用非常簡便的一句話,*Serial.begin(波特率); *來初始化UART,這一句話包含了三個內(nèi)容:
- UART對象——其代表我們要使用的UART外設(shè);
- UART啟動——其代表根據(jù)UART參數(shù)啟動串口;
- UART參數(shù)——其代表UART以何種配置運(yùn)行;
Stm32的HAL初始化過程也可以進(jìn)行類比:
我們還可以用填表格來理解這三步操作:
2.1
Step1-申明結(jié)構(gòu)體變量-生成表格
申明一個UART_HandleTypeDef的結(jié)構(gòu)體變量,圖中的結(jié)構(gòu)體是在main函數(shù)中聲明,推薦在main.c的頭部申明結(jié)構(gòu)體,使其成為全局變量。
2.2
Step2-配置UART參數(shù)-填寫表格
配置UART參數(shù)參數(shù)包括兩步:
第一步是要給UART_HandleTypeDef結(jié)構(gòu)體變量賦值
- 將我們要使用的外設(shè)賦值給其instance字段。
- 將波特率、幀長度等配合賦值給其UART_InitTypeDef初始化結(jié)構(gòu)體變量的相應(yīng)字段。
第二步是要配置與所使用的UART連接的GPIO口,因?yàn)槿魏瓮庠O(shè)想與外界交換數(shù)據(jù)都需要正確的和使用的GPIO進(jìn)行綁定。
在還未介紹的Step3中,我們需要調(diào)用HAL_UART_Init()初始化UART,HAL_UART_Init()又會調(diào)用HAL_UART_MspInit()對于單片機(jī)的Msp( MCU Specific Package 單片機(jī)的具體方案 )進(jìn)行配置,這里Msp就指具體配置哪個IO與UART進(jìn)行連接。
在HAL_UART_MspInit()中配置GPIO又需要進(jìn)行如下兩步操作:
1. 定義GPIO_InitTypeDef初始化結(jié)構(gòu)體變量作為所要初始化GPIO的配置的“暫存”。
2. 然后判斷此次調(diào)用HAL_UART_MspInit()函數(shù)的UART外設(shè),根據(jù)不同的UART外設(shè)對于相應(yīng)的GPIO和時鐘進(jìn)行如下操作:
- 啟動所用UART外設(shè)的時鐘。
- 啟用所用GPIO的時鐘。
- 配置GPIO_InitTypeDef初始化結(jié)構(gòu)體變量(變量值如上圖)。
- 使用初始化函數(shù)初始化GPIO。
2.3
Step3-使用函數(shù)初始化UART-提交表格
完成了UART的參數(shù)配置和IO配置之后,我們需要使用HAL_UART_Init()函數(shù)提交之前配置好的UART_HandleTypeDef結(jié)構(gòu)體變量這個“表格”,使得Stm32按照我們的參數(shù)配置、IO配置啟動。
3
使用輪詢模式
3.1
UART通信的三種模式
UART通信有三種模式,分別為輪詢模式、中斷模式、DMA模式,本小節(jié)介紹輪詢模式通信。
如果讀者學(xué)過8位單片機(jī)的底層開發(fā),應(yīng)該能理解輪詢模式和中斷模式的區(qū)別以及中斷模式比輪詢模式在單片機(jī)任務(wù)較多時更為高效的原因。
《Mastering Stm32》一書的248頁也對兩者的區(qū)別進(jìn)行了闡述:
簡單來說,輪詢模式是內(nèi)核在規(guī)定的阻塞時間內(nèi)使用while循環(huán)讀取傳輸?shù)臉?biāo)志位,直到標(biāo)志位被置位才將數(shù)據(jù)寫入或讀出DR寄存器。
而中斷模式是傳輸完成的相關(guān)中斷發(fā)生時,內(nèi)核才放下手中的工作,將數(shù)據(jù)寫入或讀出DR寄存器。少了阻塞時間內(nèi)的循環(huán)讀取因此更高效。
而DMA模式則更為高效,DMA作為內(nèi)核的二弟,當(dāng)傳輸完成中斷發(fā)生時,幫助大哥將數(shù)據(jù)寫入或讀出DR寄存器,不需要打斷大哥-內(nèi)核的工作。
3.2
輪詢模式
在輪詢模式發(fā)送數(shù)據(jù)調(diào)用函數(shù)HAL_UART_Transmit() ,接收數(shù)據(jù)調(diào)用函數(shù)HAL_UART_Receive(),兩者的傳入?yún)?shù)列表,以及返回值意義相同,如下圖,摘自《description-of-stm32f0-hal-and-lowlayer-drivers-stmicroelectronics》P572頁。
下面演示兩個函數(shù)的幾種調(diào)用案例:
/* 發(fā)送字符數(shù)組 */
char buff[2] = {'a','b'};
HAL_UART_Transmit(&huart3,(uint8_t *)buff,
sizeof(buff),HAL_MAX_DELAY);
/* 發(fā)送字符串 */
HAL_UART_Transmit(&huart3, (uint8_t*)"Hello",
strlen("Hello"),HAL_MAX_DELAY);
/* 接受字符數(shù)組 */
char readBuf[1];
HAL_UART_Receive(&huart2, (uint8_t*)readBuf, 1, HAL_MAX_DELAY);
至此本文已經(jīng)完成了對于Stm32使用HAL初始化UART,以及在輪詢模式通信方法的闡述。
-
STM32
+關(guān)注
關(guān)注
2270文章
10895瀏覽量
355722 -
串口通信
+關(guān)注
關(guān)注
34文章
1624瀏覽量
55507 -
低通濾波
+關(guān)注
關(guān)注
0文章
18瀏覽量
16034 -
奇偶校驗(yàn)
+關(guān)注
關(guān)注
0文章
15瀏覽量
8206 -
HAL庫
+關(guān)注
關(guān)注
1文章
121瀏覽量
6216
發(fā)布評論請先 登錄
相關(guān)推薦
評論