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