目錄
3.1 GPIO簡介
3.2 GPIO基本結構
3.3 GPIO位結構
輸入部分:
二極管的保護作用:
施密特觸發器:
片上外設端口
輸出部分:
MOS管
3.4 GPIO模式
3.4.1 浮空/上拉/下拉輸入
3.4.2 模擬輸入
3.4.3 開漏/推挽輸出
3.4.4 復用開漏/推挽輸出
3.5 LED和蜂鳴器簡介
3.5.1 LED和蜂鳴器的硬件電路
參考資料
3.6 面包板(供電區要通過跳線和中間區域連接)
3.7 LED代碼
第一步:開啟時鐘,初始化時鐘
第二步:將Delay函數加入工程,添加組,然后,魔術棒添加文件路徑
第三步:寫代碼點亮LED
第四步:按圖接線,如果要反接開漏模式,正接推挽模式,LED長線為正
3.8 LED流水燈代碼
第一步:按圖接線,將LED流水燈,連接到面包板上
第二步:復制LED閃爍代碼,然后,改名文件夾
第三步:修改LED閃爍代碼,實現LED流水燈
LED閃爍代碼
LED流水燈代碼
3.9 蜂鳴器代碼
第一步:按圖連接蜂鳴器到,面包板上,圖一畫圈按照圖二畫圈部分來接線
第二步:復制LED閃爍代碼,修改實現蜂鳴器代碼
LED閃爍
蜂鳴器代碼
3.10 按鍵簡介
3.11 傳感器模塊簡介
上下拉電阻思維理解AO端模擬電壓輸出(與圖形結合)
3.11.1 硬件電路
3.11.2 參考資料
3.12?按鍵控制LED代碼
第一步:按圖接線到面包板
第二步:復制新建工程代碼
第三步:打開文件夾,新建一個文件夾,命名為Hardware,用于模塊化編程,存放硬件驅動,然后在工程新建一個組和添加文件路徑
第四步:模塊化代碼
LED.c
LED.h(防止重復定義的條件編譯,最后一行必須是空的)
Key.c
Key.h
main.c
3.13?光敏傳感器控制蜂鳴器代碼
第一步:按圖接線到面包板
第二步:復制按鍵控制LED代碼
第三步:模塊化代碼
Buzzer.c(與LED.c的代碼基本一致,復制粘貼后只需要修改其中的端口、引腳即可)
Buzzer.h
LightSensor.c
LightSensor.h
main.c
3.15 總結GPIO的使用方法(以LED代碼模塊為例)
1.初始化時鐘
2.定義結構體,賦值結構體
3.將指定的GPIO外設初始化
3.16 GPIO庫函數
RCC開啟GPIO時鐘的庫函數
GPIO初始化庫函數
3.15上述的完整代碼
3.1 GPIO簡介
GPIO(General Purpose Input Output)通用輸入輸出口
可配置為8種輸入輸出模式
引腳電平:0V~3.3V,部分引腳可容忍5V
輸出模式下可控制端口輸出高低電平,用以驅動LED、控制蜂鳴器、模擬通信協議輸出時序等
輸入模式下可讀取端口的高低電平或電壓,用于讀取按鍵輸入、外接模塊電平信號輸入、ADC電壓采集、模擬通信協議接收數據等
3.2 GPIO基本結構
3.3 GPIO位結構
輸入部分:
I/O引腳,接了兩個保護二極管,這個是對輸入電壓進行限幅,上面二極管:接VDD,3.3V,下面二極管:接VSS,0V,電壓在0~3.3V之間二極管不會導通
二極管的保護作用:
如果輸入電壓比3.3V還要高,那上方這個二極管就會導通,輸入電壓產生的電流就會直接接入VDD而不會流入內部電路,這樣就會避免過高的電壓對內部這些電路產生傷害
如果輸入電壓比0V還低,這個電壓是相對于VSS的電壓,所以是可以有負電壓的,那這個時候下方這個二極管就會導通,電流會從VSS直接流出去,而不會從內部電路汲取電流,也是可以保護內部電路的
上拉電阻和下拉電阻,上拉電阻置VDD,下拉電阻置VSS,這個開關是可以通過程序進行配置的
(弱)上拉輸入模式:上面導通,下面斷開,默認高電平模式
(弱)下拉輸入模式:下面導通,上面斷開,默認低電平模式
浮空輸入模式:兩個都斷開,不確定電平高低
上拉和下拉的作用,為了給輸入提供一個默認的輸入電平
施密特觸發器:
對輸入電壓進行整形,執行邏輯:輸入電壓大于某一閾值,輸出就會瞬間升為高電平,輸入電壓小于某一閾值,輸出就會瞬間降為低電平
通過施密特觸發器整形波形,可以直接寫入輸入數據寄存器,這時用程序讀取輸入數據寄存器對應的某一位的數據,就能知道端口的輸入
片上外設端口
模擬輸入:連接到ADC上,因為ADC需要接收模擬量,所以在施密特觸發器前面
復用功能輸入:連接到其他需要讀取端口的外設上,比如:串口的輸入引腳;這根線接收的數字量,所以在施密特觸發器后面
輸出部分:
輸出部分可以由輸出數據寄存器活片上外設控制,兩種控制方式通過數據選擇器接到了輸出部分;選擇輸出寄存器控制,就普通I/O口輸出,寫這個數據寄存器的某一位就可以操作對應的某個端口
位設置/清除寄存器這個可以用來單獨操作輸出數據寄存器的某一位,而不影響其他位,因為輸出數據寄存器同時控制16個端口,并且這個寄存器只能整體讀寫,所以想單獨控制其中某一個端口而不影響其他端口的話,需要一些獨特的方式
第一種方法:先讀出這個寄存器,然后按位與按位或的方式更改某一位,最后再將更改后的數據寫回去,這種方式效率不高,操作麻煩
第二種方法:就是用到位設置/清除寄存器,如果要對某一位進行置1的操作,在位設置寄存器的對應位寫1,,不需要的操作寫0,自動將輸出數據寄存器對應位置1,而剩下寫0的位則保持不變,這樣就保證了只操作其中某一位而不影響其他位,并且這是一步到位的操作,如果,想對輸出數據寄存器某一位進行清0的操作,在位清除寄存器的對應位寫1
MOS管
上面是P-MOS,下面是N-MOS,這個MOS管是一種電子開關,信號來控制開關的導通和關閉,開關負責將I/O口接到VDD或者VSS,可以選擇推挽、開漏、關閉三種模式
推挽輸出模式(強推輸出模式):P-MOS和N-MOS均有效;數據寄存器為1時,上管導通,下管斷開,輸出直接接到VDD,輸出高電平;數據寄存器為0時,下管導通,上管斷開,輸出直接接到VSS,輸出低電平
開漏輸出模式(只有低電平有驅動能力,高電平沒有驅動能力,通信協議的驅動方式(避免各個設備的相互干擾),還可輸出5V的電平信號):P-MOS是無效,N-MOS有效;數據寄存器為1時,下管斷開,這時輸出想當于斷開,也就是高阻模式;數據寄存器為0時,下管導通,輸出直接接到VSS,也就是輸出低電平
關閉輸出模式,P-MOS和N-MOS均無效,也就是輸出關閉,端口的電平由外部信號控制
3.4 GPIO模式
通過配置GPIO的端口配置寄存器,端口可以配置成以下8種模式
3.4.1 浮空/上拉/下拉輸入
輸入模式下,輸出驅動器是斷開的,端口只能輸入不能輸出,在上拉電阻和下拉電阻進行操作,使其加入浮空/上拉/下拉輸入,在施密特觸發器進行波形整形后,連接到輸入數據寄存器
3.4.2 模擬輸入
模擬輸入下,引腳直接接入片上外設,也就是ADC,將引腳配置為模擬輸入就行
3.4.3 開漏/推挽輸出
P-MOS無效,就是開漏輸出,P-MOS和N-MOS有效,推挽輸出,在輸出模式下,輸入模式是有效的,因為一個端口只能有一個輸出,但可以有多個輸入
3.4.4 復用開漏/推挽輸出
只由片上外設控制
3.5 LED和蜂鳴器簡介
LED:發光二極管,正向通電點亮,反向通電不亮
有源蜂鳴器:內部自帶振蕩源,將正負極接上直流電壓即可持續發聲,頻率固定
無源蜂鳴器:內部不帶振蕩源,需要控制器提供振蕩脈沖才可發聲,調整提供振蕩脈沖的頻率,可發出不同頻率的聲音
3.5.1 LED和蜂鳴器的硬件電路
第一張圖是低電平驅動的電路,LED正極接3.3V,負極通過一個限流電阻接到PA0上,當PA0輸出低電平時,LED兩端就會產生電壓差,就會形成正向導通的電流,LED就會點亮,當PA0輸出高電平時,沒有電壓差,LED就熄滅;第二張圖,高電平驅動電路,PA0高電平亮,PA0低電平滅
要看I/O口高低電平的驅動能力如何,決定選擇哪種方式驅動,GPIO在推挽輸出模式下,高低電平均有比較強的驅動能力,這兩種都可以,如果高電平驅動能力弱,不能使用第二種連接方法
第一張圖是PNP三極管(PNP的三極管最好接上邊)的驅動電路,三極管的左邊是基極,帶箭頭的是發射極,剩下的是集電極,基極給低電平,三極管導通,通過3.3V和GND,就可以給蜂鳴器提供驅動電流,反之;第二張是NPN三極管(NPN的三極管最好接下邊)的驅動電路,三極管的左邊是基極,帶箭頭的是發射極,剩下的是集電極,基極給高電平導通,低電平斷開
參考資料
3.6 面包板(供電區要通過跳線和中間區域連接)
3.7 LED代碼
第一步:開啟時鐘,初始化時鐘
第二步:將Delay函數加入工程,添加組,然后,魔術棒添加文件路徑
第三步:寫代碼點亮LED
第四步:按圖接線,如果要反接開漏模式,正接推挽模式,LED長線為正
3.8 LED流水燈代碼
第一步:按圖接線,將LED流水燈,連接到面包板上
第二步:復制LED閃爍代碼,然后,改名文件夾
第三步:修改LED閃爍代碼,實現LED流水燈
LED閃爍代碼
LED流水燈代碼
3.9 蜂鳴器代碼
第一步:按圖連接蜂鳴器到,面包板上,圖一畫圈按照圖二畫圈部分來接線
第二步:復制LED閃爍代碼,修改實現蜂鳴器代碼
LED閃爍
蜂鳴器代碼
3.10 按鍵簡介
按鍵:常見的輸入設備,按下導通,松手斷開
按鍵抖動:由于按鍵內部使用的是機械式彈簧片來進行通斷的,所以在按下和松手的瞬間會伴隨有一連串的抖動
按鍵的抖動,對于高速運行的單片機來說,5~10ms是很漫長的,所以要消抖(在按鍵按下和松開時,都加一個延遲函數),否則就會出現,按一次按鍵單片機出現反映了多次的現象
3.11 傳感器模塊簡介
傳感器模塊:傳感器元件(光敏電阻/熱敏電阻/紅外接收管等)的電阻會隨外界模擬量的變化而變化,通過與定值電阻分壓即可得到模擬電壓輸出,再通過電壓比較器進行二值化即可得到數字電壓輸出
上下拉電阻思維理解AO端模擬電壓輸出(與圖形結合)
當這個N1阻值變小時,下拉作用就會增強,中間的AO端的電壓就會拉低(極端情況下,N1阻值為0,AO輸出被完全下拉,輸出為0V);當N1阻值變大,下拉作用就會減弱,中間的引腳由于R1的上拉作用,電壓就會升高(極端情況下,N1阻值無窮大,相當于斷路,輸出電壓被R1拉高至VCC)
AO端模擬電壓二值化輸出,就是數字輸出(與圖結合)
電壓比較器,當同向輸入端電壓大于反向輸入端的電壓時,輸出就會瞬間升高為最大值(VCC);反之,輸出瞬間降為最小值(GND)
3.11.1 硬件電路
按鍵的四種接法,圖一圖二是下接按鍵的方式(一般使用這種),圖三圖四是上接按鍵的方式
圖一:隨便選取一個GPIO口,比如PA0,然后通過K1接地,按鍵按下時,PA0被直接下拉到GND,此時讀取PA0口的電平就是低電平,當按鍵松手時PA0被懸空(電壓不確定),所以這種接法下,必須要求PA0是上拉輸入模式,這樣按下按鍵,引腳低電平,松手,引腳高電平
圖二:相比圖一多了一個上拉電阻,PA0可以使浮空輸入或者上拉輸入,這樣按下按鍵,引腳低電平,松手,引腳高電平
圖三:K1接到3.3V,必須要求PA0接到下拉輸入模式,這樣按鍵按下時高電平,松手是低電平
圖四:相比于圖三,多了一個下拉電阻,這樣按鍵按下時高電平,松手是低電平
傳感器模塊電路
3.11.2 參考資料
3.12?按鍵控制LED代碼
第一步:按圖接線到面包板
第二步:復制新建工程代碼
第三步:打開文件夾,新建一個文件夾,命名為Hardware,用于模塊化編程,存放硬件驅動,然后在工程新建一個組和添加文件路徑
第四步:模塊化代碼
LED.c
LED.h(防止重復定義的條件編譯,最后一行必須是空的)
Key.c
Key.h
main.c
3.13?光敏傳感器控制蜂鳴器代碼
第一步:按圖接線到面包板
第二步:復制按鍵控制LED代碼
第三步:模塊化代碼
Buzzer.c(與LED.c的代碼基本一致,復制粘貼后只需要修改其中的端口、引腳即可)
Buzzer.h
LightSensor.c
LightSensor.h
main.c
3.15 總結GPIO的使用方法(以LED代碼模塊為例)
1.初始化時鐘
2.定義結構體,賦值結構體
GPIO_Mode,選擇8種輸入輸出模式
GPIO_Pin選擇引腳,可以用按位或(|)的方式同時選中多個引腳
GPIO_Speed選擇輸出速度,要求不高直接50MHz即可
3.將指定的GPIO外設初始化
3.16 GPIO庫函數
RCC開啟GPIO時鐘的庫函數
GPIO初始化庫函數
void GPIO_DeInit 調用這個函數之后,所指定的GPIO外設就會被復位
void GPIO_AFIODeInit 調用這個函數之后,可以復位AFIO外設
void GPIO_Init 這個函數作用是用結構體的參數來初始化GPIO口,需要先定義一個結構體變量,然后再給結構體賦值,最后調用這個函數,這個函數就會自動讀取結構體的值,然后自動把外設的各個參數配置好,一般初始化外設都是使用這個Init函數完成
void GPIO_StructInit 這個函數可以把結構體變量賦一個默認值
uint8_t GPIO_ReadInputDataBit、uint16_t GPIO_ReadInputData、uint8_t GPIO_ReadOutputDataBit、uint16_t GPIO_ReadOutputData這四個是GPIO讀取函數
void GPIO_SetBits、void GPIO_ResetBits、void GPIO_WriteBit、void GPIO_Write這四個是GPIO寫入函數