STM32GPIO外設輸出
- STM32內部的GPIO外設
- GPIO簡介
- 基本結構
- GPIO位結構
- 輸入部分:
- 輸出部分:
- GPIO八種工作模式
- 浮空/上拉/下拉輸入
- 模擬輸入
- 開漏/推挽輸出
- 復用開漏/推挽輸出
- 手冊寄存器描述
- GPIO功能描述
- 外設的GPIO配置
- GPIO寄存器描述
- 端口輸入數據寄存器
- 端口輸出數據寄存器
- 端口位設置/清除寄存器
- 端口位清除寄存器
- 端口配置鎖定寄存器
- STM32外部的設備和電路
- LED和蜂鳴器簡介
- 硬件電路
- 面包板
- keilkill.bat
- 點亮一個LED燈3步
- RCC外設
- GPIO外設
- gpio.h的文件
- 8種工作模式:
GPIO的輸出 輸入
庫函數里用了大量的結構體、指針、枚舉等知識。C語言中高級部分
LED閃爍、LED流水燈、蜂鳴器滴滴鳴響
STM32內部的GPIO外設
GPIO簡介
GPIO(General Purpose Input Output)通用輸入輸出口
可配置為8種輸入輸出模式
引腳電平:0V~3.3V,部分引腳可容忍5V(可以輸入5V,但是輸出只有3.3V,因為供電只有3.3V)FT(Five Tolerate)
輸出模式下可控制端口輸出高低電平,用以驅動LED、控制蜂鳴器、模擬通信協議輸出時序(IIC、SPI、芯片的特性協議)等
輸入模式下可讀取端口的高低電平或電壓,用于讀取按鍵輸入、外接模塊電平信號輸入、ADC電壓采集、模擬通信協議接收數據等
基本結構
GPIO外設的名稱按照GPIOA、GPIOB、GPIOC等命令的
每個GPIO外設有16個引腳,編號從0-15。GPIOA的第0號引腳,一般成為PA0,第15號為PA15
每個GPIO模塊內,主要包含了寄存器和驅動器這些
寄存器(一段特殊的存儲器),內核可以通過APB2總線對寄存器進行讀寫,來完成輸出電平和讀取電平的功能。
寄存器的每一位對應一個引腳,其中輸出寄存器寫1,對應的引腳就會輸出高電平,寫0就輸出低電平
輸入寄存器讀取為1,就證明對應的端口目前是高電平,讀取為0,就是低電平
所有寄存器都是32位的,但是端口只有16位,所以寄存器只有低16位對應有端口,高16位沒有用到
驅動器用來增加信號的驅動能力。寄存器只負責存儲數據,如果要進行點燈操作,還是需要驅動器來負責增大驅動能力
GPIO位結構
左邊三個是寄存器,中間部分是驅動器,右邊是IO引腳
整體結構分為兩部分:上面是輸入部分,下面是輸出部分
輸入部分:
IO引腳,接了兩個保護二極管,對輸入電壓進行限幅的。如果輸入電壓>VDD ,那么上面的二極管就會導通,輸入電壓產生的電流就會直接流入VDD而不會流入內部電路,可以避免過高的電壓對內部的電路產生傷害。如果輸入電壓<VSS,下方二極管導通,電流從VSS流出去,而不會從內部電路汲取電流,可以保護內部電路。如果輸入電壓在VSS到VDD之間,兩個二極管均不導通,這時二極管對電路沒有影響,這是保護二極管的作用。
上拉電阻至VDD,下拉電阻至VSS。開關可以通過程序配置。
上面導通,下面斷開,上拉輸入模式(默認為高電平的輸入方式)
下面導通,上面斷開,下拉輸入模式(默認為低電平的輸入方式)
兩個都斷開,浮空輸入模式。
上拉下拉式為了給輸入提供一個默認的輸入電平的。因為對于數字端口,輸入不是高電平就是低電平,如果浮空的話引腳的輸入電平極易受外接干擾而改變,為了避免輸出不確定,所以要確定下來用上拉電阻或者下拉電阻。上下拉電阻阻值都比較大,是一種弱上拉和弱下拉,目的是盡量不影響正常的輸入操作。
圖中的肖特基觸發器,應該為施密特觸發器才對(翻譯錯誤)(對輸入電壓進行整形)(類似遲滯比較器),經過施密特觸發器整形的波形就可以直接寫入數據寄存器了。再用程序讀取輸入數據寄存器對應的某一位數據,就可以指導端口的輸入電平了
模擬輸入和復用功能輸入就是連接到片上外設的一些端口,其中有模擬輸入(連接到ADC上的,因為ADC接收模擬量,所以在施密特觸發器之前)。復用功能輸入是連接到其他需要讀取端口的外設上的,比如串口的輸入引腳,這根線接收的是數字量,所以在施密特觸發器后面
輸出部分:
數字部分可以由輸出數據寄存器或片上外設控制,兩種方式通過數據選擇器接到了輸出控制部分。如果通過輸出數據寄存器進行控制,就是普通的IO口輸出,寫這個數據寄存器的某一位就可以操作對應的某個端口了
位設置/清除寄存器,可以用來單獨操作輸出數據寄存器的某一位,而不影響其他位,因為輸出數據寄存器同時控制16個端口,并且這個寄存器只能整體讀寫,所以只想單獨控制某一個端口而不影響其他端口的話,就需要一些特殊的操作方式
第一種方式是先讀出這個寄存器,然后用按位與和按位或的方式更改某一位,最后再將更改后的數據寫回去,在C語言中就是&=和|=操作,比較麻煩,效率不到,對于IO口的操作而言不太合適
第二種方式是設置這個位設置/清除寄存器,如果對某一位置1,在位設置寄存器的對應位寫1即可,剩下不需要操作的位寫0。內部有電路,自動將輸出數據寄存器中的對應位置位1,而剩下的寫0的位則保持不變。保證了只操作其中某一位而不影響其他位,并且是一步到位的操作。
如果相對某一位清0,就在位清除寄存器的對應位寫1即可,內部有電路,自動將輸出數據寄存器中的對應位置位0
第三種方式是讀取STM32中的“位帶”區域,這個“位帶”作用和51單片機的位尋址作用差不多,在STM32中,專門分配的有一段地址區域,這段地址映射了ARM和外設寄存器所有的位,讀寫這段地址中的數據,就相當于讀寫所映射位置的某一位。
目前暫不會用到。庫函數方法操作是讀寫位設置和位清除寄存器的方法
輸出控制之后接到兩個MOS管,推挽、開漏和關閉三種方式
推挽輸出在高低電平均有較強的驅動能力,所以推挽輸出模式也叫強推輸出模式
開漏輸出模式,數據寄存器為1時,輸出相當于斷開,也就是高阻模式,只有低電平有驅動能力。可以作為通信協議的驅動方式,比如IIC,多機通信時可以避免各個設備的相互干擾。還可以用于輸出5V的電平信號(用于兼容5V的設備)
關閉。引腳配置成輸入模式時,兩個MOS管都無效,輸出關閉,端口的電平由外部信號來控制
GPIO位結構的全部介紹
GPIO八種工作模式
通過配置GPIO的端口配置寄存器,位結構的電路就會根據配置進行改變(比如開關的通斷,NMOS和PMOS是否有效,數據選擇器的選擇等),端口可以配置成以下8種模式
浮空/上拉/下拉輸入
浮空輸入時,端口一定要接上一個連續的驅動源,不能出現懸空的狀態。
輸入模式下,輸出驅動器是斷開的。端口只能輸入不能輸出,
VDD或VDD_FT是3.3V端口和容忍5V端口的區別。特殊不同在哪手冊沒有說,我們也不用管,就知道就行了。上面的保護二極管需要做一下處理,要不然直接接VDD3.3V的話,外部接入5V電壓就會導致上邊二極管開啟,并且產生較大電流,這是不太妥當的。
模擬輸入
從引腳直接接到片上外設ADC,所以使用ADC時,將引腳配置成模擬輸入就行了
開漏/推挽輸出
在輸出模式下,輸入模式也是有效的。但是在輸入模式下,輸出都是無效的,這是因為一個端口只能有一個輸出,但可以有多個輸入,所以當配置成輸出模式的時候,內部也可以順便輸入,這個沒啥影響
復用開漏/推挽輸出
這兩個模式和普通的開漏輸出和推挽輸出差不多,只不過引腳電平由片上外設控制,引腳控制權有片上外設掌控。在輸入部分,片上外設也可以讀取引腳的電平,同時普通的輸入也是有效的,順便接受一下電平信號
8種模式中,除了模擬輸入這個模式會關閉數字的輸入功能,其他7個模式中所有的輸入都是有效的
手冊寄存器描述
GPIO功能描述
可以看GPIO8種方式詳情可以看手冊,
外設的GPIO配置
使用片上外設的引腳時,可以參考手冊里給的配置(外設的GPIO配置)
GPIO寄存器描述
GPIO配置寄存器,每個端口的模式由4位進行控制,16個端口需要64位,所以配置寄存器有2個,1個端口配置低寄存器,1個端口配置高寄存器
多出了GPIO輸出的速度(可以限制輸出引腳的最大翻轉速度),這個設計出來是為了低功耗和穩定性的。一般要求不高時配置50MHz即可。
端口輸入數據寄存器
里面的低16位對應16個引腳,高16位沒有使用
端口輸出數據寄存器
里面的低16位對應16個引腳,高16位沒有使用
端口位設置/清除寄存器
高16位進行位清除,低16位進行位設置。寫1進行設置或者清除,寫0不產生影響
端口位清除寄存器
低16位和端口位設置/清除寄存器的高16位功能一樣,為啥還需要這個寄存器,是為了方便操作設置的。如果只想單一地進行位設置或者位清除。位設置時,用上面的寄存器,位清除時,用下面的寄存器。因為設置和清除時,使用的都是低16位的數據,這樣方便一些。如果想對多個端口同時進行位設置和位清除,那使用第一個寄存器就可以了,這樣可以保證位設置和位清除的的同步性。
端口配置鎖定寄存器
可以對端口的配置進行鎖定,防止意外更改。
STM32外部的設備和電路
LED和蜂鳴器簡介
沒有剪過得LED實物,長腳是正極,短腳是負極。
LED內部也可以看正負極,較小的一般是正極,較大的一般是負極
硬件電路
LED燈的限流電阻一定要接。看IO口的高低電平的驅動能力如何來選取怎么接。一般選取第一種接法。很多單片機或者芯片,使用高電平弱驅動,低電平強驅動的規則。可以一定程度上避免高低電平打架。
三極管驅動電路。(更好的驅動電路和阻值選型可以看模電和數電部分)
面包板
面包板的正反面。
金屬爪的排放規律:
豎著的5孔金屬爪連接,上面兩排和下面兩排的金屬爪是橫著連接(還標了供電的紅+ ,藍-標識)(有的正中間橫的可能斷開)
keilkill.bat
批處理文件,可以把工程編譯產生的中間文件都刪掉,因為編譯產生的文件比較大,主要占空間的就是Listing和Objects這兩個文件夾,這些都是中間文件,如果要把工程分享給別人,可以雙擊一下這個批處理文件,會把中間文件都刪掉
點亮一個LED燈3步
1.使用RCC開啟GPIO的時鐘
2.使用GPIO_Init函數初始化GPIO
3.使用輸出或者輸入的函數控制GPIO口
設計RCC和GPIO兩個外設 可以先看下這兩個外設都有哪些庫函數
RCC外設
可以在Library中找到rcc.h文件,在.h文件的最下面,一般都是庫函數所有函數的聲明。
可以看到rRCC有很多函數,但是大部分函數我們都不會用到,最常用的只有只有這3個函數
以AHB為例:
brief 簡介
param 參數
看簡介描述它的功能,看參數如何選擇。
如果不清楚哪個外設連接在哪一個總線上,還可以到arg這個列表里面找一下
GPIO外設
gpio.h的文件
需要了解的就是紅框里的函數
1.GPIO_DeInit,參數可以寫GPIOA、GPIOB等等,調用這個函數之后,所指定的GPIO外設就會被復位
2.GPIO_AFIODeInit,可以復位AFIO外設
3.GPIO_Init 非常重要,作用:用結構體的參數來初始化GPIO口,需要先定義一個結構體變量,然后再給結構體賦值,最后調用這個函數
這個函數內部會自動讀取結構體的值,執行一堆判斷和運算,寫入到GPIO配置寄存器,然后自動把外設的各個參數配置好(操作細節就不需要關心了)。這種Init函數在STM32中基本所有的外設都有,一般初始化外設都使用Init函數來完成。
4.GPIO——StructInit,可以把結構體變量賦一個默認值,
接下來4個是GPIO的讀取函數
再下面4個事GPIO的寫入函數
這些函數可以實現讀寫GPIO口的功能,
剩下的函數暫時不會用到
重要的函數就是GPIO_Init和8個讀寫函數
8種工作模式:
AIN (Analog IN) 模擬輸入
IN_FLOATING 浮空輸入
IPD (In Pull Down) 下拉輸入
IPU (In Pull Up) 上拉輸入
Out_OD (Out Open Drain)開漏輸出
Out_PP (Out Push Pull) 推挽輸出
AF_OD (Atl Open Drain) 復用開漏
AF_PP (Atl Push Pull) 復用推挽