uboot更改gpio电平_ECBM系列教程4:单片机的手和脚——GPIO
GPIO全稱叫做General-Purpose Input/Output,即通用輸入/輸出口。是單片機(jī)和外界交流的重要部件,你可能看到過(guò)沒(méi)有ADC的單片機(jī)、沒(méi)有定時(shí)器的單片機(jī)或者沒(méi)有串口的單片機(jī),但是沒(méi)有GPIO的單片機(jī)是不存在的。
本篇教程不會(huì)過(guò)多去講解電路層面的原理,但會(huì)用實(shí)例演示GPIO的各方面特性。
首先讓我們看看本篇教程用到的開(kāi)發(fā)板——Bread board。
一塊和面包板“天衣無(wú)縫”結(jié)合的開(kāi)發(fā)板在電路上,將一個(gè)LED的正極接到P3.7腳,負(fù)極接到GND。準(zhǔn)備就緒后,打開(kāi)之前建好的工程,接著打開(kāi)gpio.h。
在控件界面里,能看到兩個(gè)設(shè)置組。一個(gè)是Px口使能,推薦只有在ROM空間不夠的情況才關(guān)掉不用的Px口使能。我之前遇到過(guò),為了優(yōu)化空間關(guān)掉了P2的使能,結(jié)果把模塊接到P2口上死活也通信不了,卡了一天才發(fā)現(xiàn)P2使能沒(méi)打開(kāi)。二是深度優(yōu)化,用于把不需要的gpio庫(kù)函數(shù)優(yōu)化掉,理由同第一點(diǎn),沒(méi)事別優(yōu)化!
在上圖中,我們可以看到gpio庫(kù)一共有10個(gè)函數(shù)。接下來(lái)我們一一講解。
- gpio_write:這是一個(gè)8位IO口寫函數(shù),可以一次性寫入8位數(shù)據(jù)。gpio_write(GPIO_P0,0x06);的效果其實(shí)等同P0=0x06;其實(shí)該函數(shù)的作用主要還是提供給其他并口通信的外設(shè)庫(kù)使用。
- gpio_read:這是一個(gè)8位IO口讀函數(shù),可以一次性讀整個(gè)P口8個(gè)腳的數(shù)據(jù)。val=gpio_read(GPIO_P0);的效果等同于val=P0;所以就算是我,也會(huì)因?yàn)樽謹(jǐn)?shù)原因懶得用。不過(guò)它與直接用val=P0;的最大區(qū)別就是:讀取的Px口作為函數(shù)的參數(shù)是可以在程序運(yùn)行的時(shí)候修改的。因此在外設(shè)庫(kù)使用該函數(shù),就能在應(yīng)用中切換P口而不用去改函數(shù)定義區(qū)里的代碼了。
- gpio_in/gpio_out:既然說(shuō)到I/O,當(dāng)然核心就是這兩個(gè)函數(shù)啦。這兩個(gè)函數(shù)主要用于讀取某一個(gè)IO口的電平值和寫某一個(gè)IO口的電平值。gpio_out(D10,1);等同于P11=1;flag=gpio_in(D10);等同于flag=P10;和上面一樣,做成庫(kù)函數(shù)的最大優(yōu)點(diǎn),便是IO作為參數(shù),可以隨意切換,甚至在單片機(jī)運(yùn)行時(shí)切換都可以(具體的例子在解說(shuō)外設(shè)庫(kù)的復(fù)用性時(shí)詳細(xì)說(shuō)明)。
- gpio_toggle:IO電平的翻轉(zhuǎn)函數(shù),假設(shè)某個(gè)IO口原來(lái)是高電平,翻轉(zhuǎn)之后就變成了低電平。反之亦然。
- gpio_in_fast/gpio_out_fast/gpio_toggle_fast:這三個(gè)函數(shù)是上面列舉的那三個(gè)的快速運(yùn)行版,只會(huì)用在外設(shè)庫(kù)中,學(xué)習(xí)本教程的時(shí)候可以不用管他們。.
以上就是gpio的操作函數(shù)。那么究竟使用它們?yōu)榱瞬僮魇裁茨?#xff1f;這就不得不說(shuō)數(shù)字電路的一個(gè)特性了(電路基礎(chǔ)穩(wěn)固的人可以跳過(guò)這一段):數(shù)字電路里只有兩個(gè)明確狀態(tài)——0和1。0和1是一個(gè)虛擬的概念,是我們?nèi)藶槎x出來(lái)的。比如TTL電平里+5V代表1,+0V代表0。而在232電平里-12V代表1,+12V代表0。在文中提到的開(kāi)發(fā)板里,由于板載單片機(jī)工作在3.3V,所以1代表+3.3V,操作IO輸出1就是讓IO輸出+3.3V的高電平;0代表+0V,操作IO輸出0就是讓IO輸出+0V的低電平。因?yàn)閿?shù)字電路就是圍繞著1和0設(shè)計(jì)的,所以只要單片機(jī)按一定規(guī)律輸出1或者0就能控制數(shù)字電路!
還記得文章開(kāi)頭的LED嗎?LED點(diǎn)亮的條件就是正極接VCC,負(fù)極接GND,且正負(fù)極壓差大于LED壓降(一般LED壓降為1.8V~3.0V)。那么如果你想點(diǎn)亮LED,在這個(gè)電路中,只要使P3.7腳輸出高電平3.3V就行了。那么立刻用庫(kù)函數(shù)寫一遍吧:
#include "ecbm_core.h" //加載庫(kù)函數(shù)的頭文件。 void main(){ //main函數(shù),必須的。system_init(); //系統(tǒng)初始化函數(shù),也是必須的。gpio_out(D37,1);//就是這一句啦,讓P3.7口輸出高電平3.3V。while(1){} }需要注意的參數(shù)的形式為Dxx型,就是說(shuō)P3.7口就是D37,P2.5口就是D25。運(yùn)行結(jié)果如下:
小燈已經(jīng)開(kāi)始發(fā)出原諒的綠光了那如果P3.7腳輸出0呢?那么P3.7腳的電壓將會(huì)是0V,而LED兩端都是0V,LED就不會(huì)亮了。
細(xì)心的你可能發(fā)現(xiàn)了,這LED的亮度根本不夠看,沒(méi)注意的話根本看不到它在發(fā)光(我在拍攝的時(shí)候也特意降低了曝光值才勉強(qiáng)讓它的亮度看起來(lái)明顯一些)。這就設(shè)計(jì)到IO工作模式了。當(dāng)年工程師也發(fā)現(xiàn)了這些問(wèn)題,所以為IO口在不同環(huán)境下的應(yīng)用設(shè)計(jì)了不同的模式。在8051單片機(jī)中一共有4種。(為了照顧新手的理解能力,我不會(huì)去說(shuō)高深的電路知識(shí)。)
四種模式都講解完了,那么能解決LED亮度的問(wèn)題的辦法就出來(lái)了。既然亮度低的原因是上拉能力太弱,那么只要把P3.7口切換到推挽模式就可以了。
兩個(gè)參數(shù),一個(gè)是要設(shè)置的IO口,一個(gè)是IO的模式。IO模式的定義可以參考宏定義:
所以代碼更改如下:
#include "ecbm_core.h" //加載庫(kù)函數(shù)的頭文件。 void main(){ //main函數(shù),必須的。system_init(); //系統(tǒng)初始化函數(shù),也是必須的。gpio_mode(D37,GPIO_PP);//推挽模式。 gpio_out(D37,1); //就是這一句啦,讓P3.7口輸出高電平3.3V。while(1){} }運(yùn)行效果如下:
啊,原諒的光芒更加閃耀了呢。最后一個(gè)函數(shù)gpio_uppull其實(shí)用處不大,僅在某些應(yīng)用會(huì)用到,比如IIC通信要求IO是開(kāi)漏模式同時(shí)外接上拉電阻。而STC8內(nèi)置了上拉電阻,可以節(jié)省一些元件錢。該函數(shù)就是用來(lái)打開(kāi)和關(guān)閉上拉電阻的。在IIC章的時(shí)候會(huì)說(shuō)明它。
對(duì)于這篇文章,還有什么不懂的問(wèn)題呢?歡迎留言告訴我。
預(yù)告:下一篇文章中,會(huì)講解外部中斷的應(yīng)用,敬請(qǐng)期待。
總結(jié)
以上是生活随笔為你收集整理的uboot更改gpio电平_ECBM系列教程4:单片机的手和脚——GPIO的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实用查询
- 下一篇: 程序员---不要对自己说“不可能”