今天有網友私信我,問我怎麼沒有更新文章,我有點慚愧沒有能夠及時更新文章。因為都沒有太多時間準備,所以更新的有點慢,但是我還是決定每天給大家分享一點知識。之前我們講了STM32的時鐘,講完時鐘之後我開始為大家講一些外設我們從最基本的GPIO開始講。我們打開STM32的手冊(由于STM32的手冊網上很多,大家可以自己找,如果沒有的朋友也可以私信我,我會及時反饋并将資料給到你),我們看第9章 General-purpose and alternate-function I/Os (GPIOs and AFIOs)。這節主要講STM32的通用IO與複用IO相關知識,我們看任何一款芯片一定要把官方給的參考手冊看透,這樣才能對芯片了如指掌。首先我們來了解一下IO口的模式以及該模式的一些相關知識:
輸入:浮空輸入 ─ 上拉輸入 ─ 下拉輸入 ─ 模拟輸入
輸出:開漏輸出 ─ 推挽輸出 ─ 開漏複用輸出 ─ 開漏複用輸出
針對這些我們逐一分析:
首先是浮空輸入,什麼是浮空輸入:就是IO的電平狀态是不确定的,完全由外部輸入決定,如果在該引腳懸空的情況下,讀取該端口的電平是不确定的,這種輸入一般用作按鍵的檢測。
我們從圖中可以看出,當我們外部IO口沒有電壓的時候其實這個功能是失效的,根本沒用,所以再我們設置開漏的時候外部一定要接上拉電阻,這樣我們就可以通過控制CTRL端控制外部的輸入。
推挽輸出:
上圖就是推挽輸出,當我們的CTRL信号為高電平的時候,Q1導通、Q3截至,IO口輸出高電平,當CTRL信号輸出低電平的時候,Q1截至Q3導通,IO口輸出低電平。
而複用推挽輸出以及複用開漏其實是作為第二功能時的配置說明,使用方法與此方法一緻。
講完了IO口的模式,我們再來講講STM32IO口的相關的寄存器,我們從下圖文檔中:
可以看出,每個通用IO口都有2個32位的配置寄存器,2個32位的數據寄存器,一個32位的置位/複位寄存器,一個16位的複位寄存器以及一個32位鎖存寄存器。我們先看通用IO口,在通用IO口的複位期間以及剛複位後,複用功能未開啟狀态,IO口是被設置成為浮空輸入的,所以這點我們要注意,在設計的時候一定要考慮到開機的時候這些IO的狀态會不會影響我們的設計,我之前在設計的時候就碰到過這樣的情況。我們看手冊中,有些特定的總線手冊給了我們一些GPIO的模式配置,這些配置在第9章的9.1.11章節中,我們以後配置的時候一定要看清楚是否與是按照這些配置來配置的,千萬不要搞錯了。
我們正式進入GPIO寄存器相關知識,我們先看GPIOx_CRL和GPIOx_CRH這兩個寄存器,這兩個寄存器是IO口配置寄存器,主要配置IO是輸入還是輸出以及IO口的速度。
我們先看複位的值,我們将0x4444 4444分解為二進制,他的值就是0100 0100 0100 0100 0100 0100 0100 0100,我們将這些數字一一對應帶入該寄存器的對應位,我們拿MODE0和CNF0作為對象,可以知道CNF0[1:0] = 01 ,MODE0[1:0] = 00,通過這兩個數值然後根據下面的圖示查詢可以得出,默認的狀态是InputMode,01:Floating Input狀态,與我們之前手冊上的一緻,這就是我們分析GPIOx_CRL與GPIOx_CRH寄存器的方法。
由于我們的引腳有16個引腳,而每個寄存器隻能配置8個引腳,所以我們需要兩個寄存器來配置這些引腳。GPIOx_CRL配置的低8個引腳,而GPIOx_CRH配置的高8個的引腳。
分析完模式,我們再來分析端口輸入寄存器GPIOx_IDR。
我們從圖中可以看出,該寄存器的高16位作為預留位置未使用,而使用了低16位。該寄存器的IDR0~IDR15對應的就是引腳0~15的輸入值,而高16位都是0,這些位隻能是隻讀的模式并且隻能以字的形式讀出。
看完端口輸入寄存器我們再來看看端口輸出寄存器GPIO_ODR:
與GPIO_IDR相識,端口輸出寄存器的高16位也是保留的,而隻用了低16位,每一位都可以讀也可以寫。ODR0控制這GPIOx_Pin0,ODR15控制這GPIOx_Pin15,這些位也隻能以字(16位)的形式進行操作。今天有點晚了,該休息了,明天接着寫,謝謝大家,大家晚安!!!!!
也希望大家勞逸結合,身體健康,喜歡我的朋友給我加個關注,有需要什麼資料的也可以找我,我盡我所能給大家幫助,謝謝大家了!!!!,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!