亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用庫操作串口UART

發布時間:2022-01-06 20:40:02 來源:億速云 閱讀:168 作者:柒染 欄目:互聯網科技

這期內容當中小編將會給大家帶來有關如何用庫操作串口UART,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。


1.從 GPIO 到 UART
前面幾節我們講了MCU如何啟動,如何用翻轉IO引腳,以及用按鍵去觸發中斷。接下來我們介紹的也是最常用的一個模塊,串口(UART)。
串口可以說是最古老,而且生命力最強的一種通信接口了。RS485總線更是久經考驗。雖然串口早已經從大多數PC的標配中去掉了,但是嵌入式系統跟上位PC機通信用的最多的應該還是通過串口轉USB吧。
我們用 Keil 打開下面這個工程:
STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesUARTUART_TwoBoards_ComPollingMDK-ARMProject.uvprojx
這個代碼配置串口為 9600,8 N 1,我們把代碼編譯下載后,可以通過 UART to USB 轉換器連接到 PC 的 USB 口,在PC端用串口觀察MCU發送的數據。

如何用庫操作串口UART

如何用庫操作串口UART
2.UART 的初始化
我們看一下代碼,串口參數的設置是在主程序里完成的,還有一部分是在stm32f0xx_hal_msp.c 里完成的。為什么要這么費事兒,而不把初始化代碼全放在一個主程序里完成呢?
我們要慢慢體會這樣做帶來的好處。我們調用一個驅動時,這個驅動難免會跟底層硬件打交道,比如串口驅動,它最終是利用用戶選擇的某一個串口模塊,和與此模塊連接的收發引腳進行數據收發的。
HAL(Hardware Abstract Layer) 把跟具體硬件細節相關的代碼單獨剝離了出來,并在Cube庫中引入了 MSP(MCU Support Package) 的概念, 具體的硬件細節交給用戶在這里面配置。

HAL庫里面對應每個硬件模塊有兩個函數 例如:

HAL_UART_Init( )  功能上的描述:設置收發模式、奇偶校驗位、停止位數等等(與芯片無關)。

HAL_UART_MspInit( )  硬件的描述: IO初始化,不同芯片,不同引腳設置不同。

如何用庫操作串口UART

回到程序,我們要使用串口時要調用驅動層的初始化函數 HAL_UART_Init( ),這個初始化函數回過頭來調用了 HAL_UART_MspInit( ) 這個函數來完成 UART 時鐘和收發引腳時鐘的使能,以及收發引腳的配置。之后初始化函數繼續進行 UART 端口的參數配置。
這樣做的一個好處就是使驅動層的初始化函數與硬件無關。一般我們做好一塊板子后,所用的串口和引腳也就固定下來了,在 HAL_UART_MspInit( ) 里配置一次就好了,之后不需要頻繁的改變這些代碼。

如何用庫操作串口UART

如何用庫操作串口UART
3.熟悉 Handle
跟 GPIO 的初始化有所不同,在UART這個模塊引入了 Handle 這一概念。在看 Handle 之前我們先熟悉一下在驅動里經常用到的結構體及其指針的用法:

如何用庫操作串口UART

typedef struct __MY_TypeDef

{

   uint8_t    Var1;

   uint8_t    Var2;

   uint16_t   Var3;

   uint8_t*   Var4;

}MY_TypeDef;

MY_TypeDef* MY_VAR;

MY_VAR 是一個 MY_TypeDef 類型的指針,我們看看把它指向不同的地址時會發生什么?
MY_VAR = (MY_TypeDef*) 0x20000018;

如何用庫操作串口UART

需要注意 MY_VAR->Var4 是個字節型指針變量,這個變量本身占用4個字節,它的值是 0x20000018, 而

* MY_VAR->Var4 的值是 0x02。

把 MY_VAR 指向另一個地址:
MY_VAR = (MY_TypeDef*) 0x2000001C;

如何用庫操作串口UART

與此類似,對于串口模塊,驅動定義了一個結構體類型 UART_HandleTypeDef,我們可以用這個類型定義多個結構體,并通過把串口模塊寄存器區的起始地址付給一個結構體,使該結構體和串口之間建立起聯系:

如何用庫操作串口UART

我們運行的當前程序操作串口的方式為查詢(polling)方式,結構體中和DMA,中斷方式相關的內容可以先忽略,只需要關注結構體中下面這些成員即可:

USART_TypeDef  *Instance;

USART_TypeDef 類型的指針,需要指向欲操作的串口寄存器區起始地址。以把此 Handle 和該串口建立起聯系。

UART_InitTypeDef   Init;

在調用初始化函數前,需要把初始化參數如 波特率,是否奇偶校驗等寫入此結構體。

UART_AdvFeatureInitTypeDef  AdvancedInit;

串口擴展功能初始化參數。當前未用到擴展功能。
使用 Handle 的好處是,我們操作某個模塊時,把這個模塊對應的 Handle 的首地址傳給驅動函數就行了。此函數通過 Handle 就可以找到所有需要的東西。如:

HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 5000);

&UartHandle 為 UART1 對應的 Handle 的首地址。
Handle 除了保存自己對應模塊的參數信息,還保存緩沖數據,以及當前工作狀態。它可以保證各模塊之間互不干擾,在代碼執行過程中被打斷,恢復后又可以正確繼續執行。這樣也便于把驅動集成到操作系統中。在以后的中斷方式和 DMA 操作模式中,我們可以更深刻的體會到這種方法的優點。在理解了串口模塊的工作方式后,理解其它模塊就非常容易了。

需要提到的是,在M0芯片內,有一些共享的或系統級的硬件模塊不使用 Handle 的方式來處理:

GPIO

SYSTICK

NVIC

PWR

RCC

FLASH.

上述就是小編為大家分享的如何用庫操作串口UART了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台南市| 同德县| 时尚| 讷河市| 曲阳县| 昌黎县| 吉林市| 桐城市| 哈巴河县| 文昌市| 富顺县| 梁山县| 陕西省| 华坪县| 通辽市| 揭东县| 凤冈县| 金昌市| 炎陵县| 明水县| 罗山县| 马龙县| 玉林市| 苏州市| 定南县| 汶上县| 阜南县| 宝丰县| 敖汉旗| 尼勒克县| 玉树县| 保山市| 富锦市| 邳州市| 咸阳市| 洪雅县| 武夷山市| 双鸭山市| 潼南县| 灌云县| 华宁县|