GPIO实验
附件 : Chapter 6 GPIO的工作原理與實驗.ppt
一、什么是GPIO? ??? 首先應該理解什么是GPIO。GPIO,英文全稱為General-Purpose IO ports,也就是通用IO口。在嵌入式系統中常常有數量眾多,但是結構卻比較簡單的外部設備/電路,對這些設備/電路有的需要CPU為之提供控制手段, 有的則需要被CPU用作輸入信號。而且,許多這樣的設備/電路只要求一位,即只要有開/關兩種狀態就夠了,比如燈亮與滅。對這些設備/電路的控制,使用傳 統的串行口或并行口都不合適。所以在微控制器芯片上一般都會提供一個“通用可編程IO接口”,即GPIO。接口至少有兩個寄存器,即“通用IO控制寄存器 ”與“通用IO數據寄存器”。數據寄存器的各位都直接引到芯片外部,而對這種寄存器中每一位的作用,即每一位的信號流通方向,則可以通過控制寄存器中對應 位獨立的加以設置。這樣,有無GPIO接口也就成為微控制器區別于微處理器的一個特征。 ??? 在實際的MCU中,GPIO是有多種形式的。比如,有的數據寄存器可以按照位尋址,有些卻不能按照位尋址,這在編程時就要區分了。比如傳統的8051系 列,就區分成可位尋址和不可位尋址兩種寄存器。另外,為了使用的方便,很多mcu把glue logic等集成到芯片內部,增強了系統的穩定性能,比如GPIO接口除去兩個標準寄存器必須具備外,還提供上拉寄存器,可以設置IO的輸出模式是高阻, 還是帶上拉的電平輸出,或者不帶上拉的電平輸出。這在電路設計中,外圍電路就可以簡化不少。 ??? 明白了這個道理,不同的MCU,提供的GPIO口的數目不同,可選擇的glue logic也不同。所以,在了解共性的基礎上去了解個性。 ??? 另外需要注意的是,對于不同的計算機體系結構,設備可能是端口映射,也可能是內存映射的。如果系統結構支持獨立的IO地址空間,并且是端口映射,就必須使 用匯編語言完成實際對設備的控制,因為C語言并沒有提供真正的“端口”的概念。如果是內存映射,那就方便的多了。舉個例子,比如像寄存器A(地址假定為 0x48000000)寫入數據0x01,那么就可以這樣設置了。
??? 這實際上就是內存映射機制的方便性了。其中volatile關鍵字是嵌入式系統開發的一個重要特點。這個就不再這里總結了。上述表達式拆開來分析,首先 (volatile unsigned long *)0x48000000的意思是把0x48000000強制轉換成volatile unsigned long類型的指針,暫記為p,那么就是#define A *p,即A為P指針指向位置的內容了。這里就是通過內存尋址訪問到寄存器A,可以讀/寫操作。 二、S3C2410的GPIO的特點 ??? 首先看看introduction。
??? 可見,s3c2410的GPIO有117pin,下面應該到9 IO ports看看詳細部分了。
??? 這么多的IO口,其實很多是復合功能的,既可以作為普通的IO口使用,也可以作為特殊外設接口。在程序設計時,要對整體的資源有所規劃,初始化時就應該把所有資源安排合理。這樣才會避免出現問題。當然,僅僅做一個最簡單的led燈實驗,倒是省去了很多步驟。 ??? 現在的8個端口,其寄存器是相似的。除了兩個通用寄存器GPxCON、GPxDAT外,還提供了GPxUP用于確定是否使用內部上拉電阻(其中x為A-H,需要注意的是沒有GPAUP)。應用的主要步驟就是: ??? ·設置GPIO控制寄存器GPxCON ??? ·設置GPIO上拉寄存器GPxUP ??? 初始化完成后,就可以通過對GPxDAT的操作來實現相應的應用了。其中,PORT A與PORT B-H在功能選擇方面有所不同,GPACON的每一位對應一根引腳(共23pin有效)。當某位設為0,相應引腳為輸出引腳,此時往GPADAT中寫 0/1,可以讓引腳輸出低電平/高電平;當某位設為1,則相應引腳為地址線,或者用于地址控制,此時GPADAT沒有用了。一般而言,GPACON通常全 設為1,以便訪問外部存儲器件。PORT B-H在寄存器操作方面完全相同。GPxCON中每兩位控制一根引腳:00表示輸入,01表示輸出,10表示特殊功能,11保留。GPxDAT用于讀/寫 引腳:當引腳設為輸入時,讀此寄存器可知相應引腳狀態是高/低;當引腳設為輸出時,寫此寄存器相應位可以使相應引腳輸出低電平或高電平。GPxUP:某位 設為0,相應引腳無內部上拉;為1,相應引腳使用內部上拉。關于特殊功能,那就得結合特殊外設來進行設置了。 ??? 這算是最簡單的部分。完成一個led燈實驗,可以用來做后續實驗的調試手段。 基本實驗一:LED燈循環點亮 ??? 在EDUKIT-III實驗箱上,有四個LED燈,與IO口的對應關系為GPF[7:4]----LED[4:1]。當IO引腳輸出為低電平的時 候,LED燈被點亮。只需要關注三個寄存器GPFCON、GPFDAT、GPFUP。由于硬件電路的關系,設置上拉電阻與否并不影響LED燈的點亮,所以 GPFUP可以不必考慮。剩下的就是GPFCON和GPFDAT。 ??? 我參考了《S3C2410完全開發》和vivi源代碼,對前者的源代碼進行了完善和修正,形成了兩個版本。版本1是采用ARM匯編語言完成,版本2采用C 語言完成。版本1練習了宏定義函數,子程序等,相對而言比較簡單。版本2重點練習了軟件架構,雖然短小,但是仍然模仿了vivi的軟件架構。只是沒有必要 寫復雜的Makefile,所以只寫了比較簡單的Makefile。在編寫過程中,發現自己對ld,objcopy,和一些細節沒有很好的把握,經過查看 資料,已經基本掌握,后續工作需要就這些工具進行深入的學習,目標是能夠熟練掌握。 ARM匯編版本: ??? (1)我采用了延時子程序,但是上電復位后,WDT默認是打開的。所以在程序的開始要禁用WDT。 ??? (2)關于ARM的跳轉指令B、BL、BX要區分開。B一般用于本段內的指令跳轉,而BL用于子程序調用,BX用于ARM和THUMB狀態的切換。特別地 說,BL指令會將下一條指令的地址拷貝到LR中,然后跳轉到指定的地址運行程序。所以,子程序調用的模型為: ??? bl delay ??? ... delay: ??? ... ??? mov pc, lr ??? 明確了這兩條,程序就不難理解了。源代碼見上傳的附件。 C語言版本: ??? (1)軟件架構仿照了vivi,也可以說是Linux Kernel。當然,僅僅寫這么小的程序用不到這么麻煩,但是可以訓練這種架構,為寫中型大型程序打好基礎。 ??? (2)注意C語言下實現寄存器讀寫的(*(volatile unsigned long *)(addr))。其實就是要掌握volatile和指針的用法,明白在嵌入式環境中,為什么要這樣操作。 ??? (3)寫c時,要注意頭文件如何處理。寫Makefile時,要注意是否采用隱含規則,如果不采用,就要自己定義明確規則,就像vivi里面的 Rules.make。在這里,因為只是涉及到.s的編譯不采用隱含規則,所以沒有把Rules.make單獨拿出,事實上可以單獨寫為 Rules.make,然后在Makefile后加入include Rules.make就可以了。 ??? (4)要調用C子程序,必須分配堆棧空間。因為子程序調用時,要進行入棧出棧處理。又因為從nand flash啟動,而nand flash在S3C2410下的特點規定堆棧不能超過4K。 ??? 經過測試,兩個程序都可以很好的運行。四個燈循環點亮^_^
???????????????? 文件打包:led_c.tar.gz
基本實驗二:蜂鳴器 ??? 這個實驗比較簡單,本來《S3C2410完全開發》下個實驗是IO ports,用按鍵控制燈亮滅,但是我的開發板沒有相應的硬件功能部分。所以就以buzzer實驗代替。 ??? 這里應該弄清楚蜂鳴器的工作原理,并且知道硬件電路應該怎么設計。從百度上搜索了一篇文章,講解得比較清晰。網址如下: [url]http://www.ourmpu.com/mcujx/fmqsy.htm[/url] 【整理部分資料放在這里: ??? 蜂鳴器是一種一體化結構的電子訊響器,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件;蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。 ??? 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。多諧振蕩器由晶體管或集成電路構成,當接通電源后(1.5~15V直流工作電壓),多諧振蕩器起振,輸出1.5~2.5kHZ的音頻信號,阻抗匹配器推動壓電蜂鳴片發聲。 ??????????????????????
??? 電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場,振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲。 ??? 電磁式蜂鳴器驅動原理 ??????????????????????
???? 蜂鳴器發聲原理是電流通過電磁線圈,使電磁線圈產生磁場來驅動振動膜發聲的,因此需要一定的電流才能驅動它,單片機IO引腳輸出的電流較小,單片機輸出的 TTL電平基本上驅動不了蜂鳴器,因此需要增加一個電流放大的電路。S51增強型單片機實驗板通過一個三極管C8550來放大驅動蜂鳴器,原理圖見下圖: ??? 如圖所示,蜂鳴器的正極接到VCC(+5V)電源上面,蜂鳴器的負極接到三極管的發射極E,三極管的基級B經過限流電阻R1后由單片機的P3.7引腳控 制,當P3.7輸出高電平時,三極管T1截止,沒有電流流過線圈,蜂鳴器不發聲;當P3.7輸出低電平時,三極管導通,這樣蜂鳴器的電流形成回路,發出聲 音。因此,我們可以通過程序控制P3.7腳的電平來使蜂鳴器發出聲音和關閉。程序中改變單片機P3.7引腳輸出波形的頻率,就可以調整控制蜂鳴器音調,產 生各種不同音色、音調的聲音。另外,改變P3.7輸出電平的高低電平占空比,則可以控制蜂鳴器的聲音大小,這些我們都可以通過編程實驗來驗證。】 -------------------------
一、什么是GPIO? ??? 首先應該理解什么是GPIO。GPIO,英文全稱為General-Purpose IO ports,也就是通用IO口。在嵌入式系統中常常有數量眾多,但是結構卻比較簡單的外部設備/電路,對這些設備/電路有的需要CPU為之提供控制手段, 有的則需要被CPU用作輸入信號。而且,許多這樣的設備/電路只要求一位,即只要有開/關兩種狀態就夠了,比如燈亮與滅。對這些設備/電路的控制,使用傳 統的串行口或并行口都不合適。所以在微控制器芯片上一般都會提供一個“通用可編程IO接口”,即GPIO。接口至少有兩個寄存器,即“通用IO控制寄存器 ”與“通用IO數據寄存器”。數據寄存器的各位都直接引到芯片外部,而對這種寄存器中每一位的作用,即每一位的信號流通方向,則可以通過控制寄存器中對應 位獨立的加以設置。這樣,有無GPIO接口也就成為微控制器區別于微處理器的一個特征。 ??? 在實際的MCU中,GPIO是有多種形式的。比如,有的數據寄存器可以按照位尋址,有些卻不能按照位尋址,這在編程時就要區分了。比如傳統的8051系 列,就區分成可位尋址和不可位尋址兩種寄存器。另外,為了使用的方便,很多mcu把glue logic等集成到芯片內部,增強了系統的穩定性能,比如GPIO接口除去兩個標準寄存器必須具備外,還提供上拉寄存器,可以設置IO的輸出模式是高阻, 還是帶上拉的電平輸出,或者不帶上拉的電平輸出。這在電路設計中,外圍電路就可以簡化不少。 ??? 明白了這個道理,不同的MCU,提供的GPIO口的數目不同,可選擇的glue logic也不同。所以,在了解共性的基礎上去了解個性。 ??? 另外需要注意的是,對于不同的計算機體系結構,設備可能是端口映射,也可能是內存映射的。如果系統結構支持獨立的IO地址空間,并且是端口映射,就必須使 用匯編語言完成實際對設備的控制,因為C語言并沒有提供真正的“端口”的概念。如果是內存映射,那就方便的多了。舉個例子,比如像寄存器A(地址假定為 0x48000000)寫入數據0x01,那么就可以這樣設置了。
| #define A (*(volatile unsigned long *)0x48000000) ... ???? A = 0x01; ... |
| · 117-bit general purpose I/O ports / 24-ch external interrupt source |
| The S3C2410X has 117 multi-functional input/output port pins. The ports are: — Port A (GPA): 23-output port — Port B (GPB): 11-input/output port — Port C (GPC): 16-input/output port — Port D (GPD): 16-input/output port — Port E (GPE): 16-input/output port — Port F (GPF): 8-input/output port — Port G (GPG): 16-input/output port — Port H (GPH): 11-input/output port |
???????????????? 文件打包:led_c.tar.gz
基本實驗二:蜂鳴器 ??? 這個實驗比較簡單,本來《S3C2410完全開發》下個實驗是IO ports,用按鍵控制燈亮滅,但是我的開發板沒有相應的硬件功能部分。所以就以buzzer實驗代替。 ??? 這里應該弄清楚蜂鳴器的工作原理,并且知道硬件電路應該怎么設計。從百度上搜索了一篇文章,講解得比較清晰。網址如下: [url]http://www.ourmpu.com/mcujx/fmqsy.htm[/url] 【整理部分資料放在這里: ??? 蜂鳴器是一種一體化結構的電子訊響器,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件;蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。 ??? 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。多諧振蕩器由晶體管或集成電路構成,當接通電源后(1.5~15V直流工作電壓),多諧振蕩器起振,輸出1.5~2.5kHZ的音頻信號,阻抗匹配器推動壓電蜂鳴片發聲。 ??????????????????????
??? 電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場,振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲。 ??? 電磁式蜂鳴器驅動原理 ??????????????????????
???? 蜂鳴器發聲原理是電流通過電磁線圈,使電磁線圈產生磁場來驅動振動膜發聲的,因此需要一定的電流才能驅動它,單片機IO引腳輸出的電流較小,單片機輸出的 TTL電平基本上驅動不了蜂鳴器,因此需要增加一個電流放大的電路。S51增強型單片機實驗板通過一個三極管C8550來放大驅動蜂鳴器,原理圖見下圖: ??? 如圖所示,蜂鳴器的正極接到VCC(+5V)電源上面,蜂鳴器的負極接到三極管的發射極E,三極管的基級B經過限流電阻R1后由單片機的P3.7引腳控 制,當P3.7輸出高電平時,三極管T1截止,沒有電流流過線圈,蜂鳴器不發聲;當P3.7輸出低電平時,三極管導通,這樣蜂鳴器的電流形成回路,發出聲 音。因此,我們可以通過程序控制P3.7腳的電平來使蜂鳴器發出聲音和關閉。程序中改變單片機P3.7引腳輸出波形的頻率,就可以調整控制蜂鳴器音調,產 生各種不同音色、音調的聲音。另外,改變P3.7輸出電平的高低電平占空比,則可以控制蜂鳴器的聲音大小,這些我們都可以通過編程實驗來驗證。】 -------------------------
轉載于:https://blog.51cto.com/enchen/152196
總結
- 上一篇: 深入掌握JMS(四):实战Queue
- 下一篇: 页面优化指南(easyui页面优化方案