GPIO的簡(jiǎn)介:
GPIO它的學(xué)名叫通用輸入輸出端口,其實(shí)它就是單片機(jī)的I/O口,他承擔(dān)著將芯片與外部設(shè)備連接實(shí)現(xiàn)與外部通訊,控制和數(shù)據(jù)采集的功能。
GPIO的結(jié)構(gòu):
STM32的GPIO的硬件結(jié)構(gòu)圖如圖所示
嗯,我們能夠看到的值有最右邊①部分的I/O口引腳,剩下的都在芯片里面,如果想要系統(tǒng)的了解STM32的GPIO,讀懂這個(gè)結(jié)構(gòu)圖還是非常有必要的,嘿嘿,一點(diǎn)一點(diǎn)來(lái)看吧。
①保護(hù)部分:
引腳上的兩個(gè)保護(hù)二極管是用來(lái)保護(hù)I/O口引腳的,兩個(gè)二極管的作用分兩種情況
情況1當(dāng)輸入的電壓過(guò)高時(shí):上面的保護(hù)二極管導(dǎo)通。
情況2當(dāng)輸入的電壓過(guò)低時(shí):下面的保護(hù)二極管導(dǎo)通。
都是為了防止不正常的電壓進(jìn)入芯片然后燒毀芯片。
②輸出驅(qū)動(dòng)部分:
兩個(gè)MOS管一個(gè)P-MOS管一個(gè)N-MOS管使得這部分可以進(jìn)行有推挽輸出和開(kāi)漏輸出,簡(jiǎn)單table about一下推挽輸出和開(kāi)漏輸出,推挽輸出你可以簡(jiǎn)單理解為兩個(gè)MOS管都工作,輸入高電平(3.3V)時(shí)P-MOS管導(dǎo)通I/O口輸出高電平,輸入低電平時(shí)N-MOS管導(dǎo)通I/O口輸出低電平(0V),而開(kāi)漏輸出就只有N-MOS管工作,所以在這個(gè)模式下當(dāng)輸入輸入低電平時(shí)N-MOS管導(dǎo)通I/O口輸出低電平(0V),輸入高電平時(shí),I/O口輸出狀態(tài)為高阻態(tài)(就時(shí)那種不穩(wěn)定的電平)。
應(yīng)用場(chǎng)合:
推挽輸出主要用在比如說(shuō)經(jīng)典之光流水燈,有源蜂鳴器等需要快速切換狀態(tài)的場(chǎng)合。
開(kāi)漏輸出主要用在一些比如IIC等這些通訊場(chǎng)合。
③輸出數(shù)據(jù)寄存器
我們上面一直說(shuō)“當(dāng)輸入XX電平”,大家是不是會(huì)有疑問(wèn)這個(gè)電平從哪里來(lái)呢,別急這就來(lái)說(shuō)。這個(gè)電平就來(lái)自前面的這個(gè)輸出數(shù)據(jù)寄存器,它是由ODR這個(gè)寄存器來(lái)進(jìn)行控制,也就是我們可以通過(guò)控制這個(gè)寄存器來(lái)改變輸出端口的電平。ODR這個(gè)寄存器具體控制操作去瞅瞅官方工作手冊(cè),這里就不再展開(kāi)了。
④復(fù)用輸出
我們?cè)趯W(xué)習(xí)51單片機(jī)的時(shí)候,就知道經(jīng)典的STC89C51 P3端口具有第二功能,比如P3.0 P3.1端口既可以作為普通的I/O口又可以進(jìn)行串口通訊,我們32單片機(jī)I/O口同樣具有第二功能,我們把它稍微的美化了一下叫端口復(fù)用。
⑤輸入數(shù)據(jù)寄存器
單片機(jī)的I/O口通過(guò)上面的兩個(gè)電阻可以被配置為上拉和下拉輸入,經(jīng)過(guò)施密特觸發(fā)器轉(zhuǎn)化為0,1信號(hào)存儲(chǔ)在輸入數(shù)據(jù)寄存器中,通過(guò)IDR寄存器就可以知道該引腳電平的狀態(tài)。
⑥復(fù)用輸入
和復(fù)用輸出類(lèi)似,把輸入的信號(hào)傳給其他的寄存器,共其他外設(shè)讀取。
⑦模擬輸入
當(dāng)I/O口用來(lái)采集模擬信號(hào)的時(shí)候,就必須啊將端口設(shè)置為模擬輸入模式,信號(hào)就不再經(jīng)過(guò)施密特觸發(fā)器,直接進(jìn)入響應(yīng)的片上外設(shè)。
好了到這里STM32的GPIO的結(jié)構(gòu)就說(shuō)完了,這是我個(gè)人在學(xué)習(xí)后的理解,里面可能有說(shuō)的不深入的地方(悄悄說(shuō)一聲我是有硬件基礎(chǔ)),這個(gè)得自己去補(bǔ)充硬件基礎(chǔ)了!
下面我列舉一下關(guān)于GPIO的工作模式,這些工作模式最好我們還是去記住他,如果英文好,根本不需要記,就可以直接的翻譯出來(lái)
最后附上常用的操作GPIO的函數(shù)(HAL庫(kù))
1 HAL_GPIO_Writepin函數(shù)
HAL_GPIO_Writepin(GPIOX ,GPIO_PIN_X, GPIO_PIN_SET/RESET);
向X引腳寫(xiě)入高電平/低電平
2 HAL_GPIO_Readpin函數(shù)
HAL_GPIO_Readpin(GPIOX ,GPIO_PIN_X);
讀取X引腳電平狀態(tài)
3 HAL_GPIO_Togglepin(GPIOX ,GPIO_PIN_X);
使X引腳狀態(tài)反轉(zhuǎn)