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