上一篇文章我們講到,軟件其實只需要讀寫寄存器,就可以實現操作硬件。比如我們要點亮一個led燈,只需要對應的GPIO寄存器位寫1,對應引腳就會輸出高電平,點亮led燈。
于是出現很多問題,為什么寫寄存器就能出高電平等之類的問題?下面就本篇我來串一下,一一解答一下。
我先說明幾點:
- 其實對于軟件工程師而言,知道寄存器是軟硬件之間的紐帶就夠了,因為這樣你已經就能操控硬件了。
- 但是學習一下MCU內部 GPIO電路對于高嵌入式或者硬件工程師我覺得有必要,至少加強你對硬件的認知,而且不同芯片內部電路都不一樣,所以就有了這篇文章。
進入正題,因為不同的MCU的內部GPIO電路實現不一樣,甚至像51單片機的GPIO 不同的組實現都不一樣,比如51單片機的P0和P1 IO口內部電路就不一樣。所以我們這里僅僅是以51單片機的P0 GPIO內部電路為例來講解的,其它芯片的大家自己舉一反三。
下圖是51單片機的P0口的GPIO內部電路框圖:
P0 GPIO部分電路主要有以下構成:
1.P0.x輸出鎖存器(就是寄存器一個單元,寄存器有多個位,就是D觸發器)
2. 2個三態緩沖器,用于控制讀引腳還是讀鎖存器
3.驅動電路,V1,V2兩個場效應晶體管
4.輸出控制部分,與門、反相器、轉換開關MUX各一個
下面我們來走一下流程:
- 我們知道LED=1這行代碼就是告訴CPU將寄存器對應的位設置成1。這行代碼編譯后轉換成二進制碼給CPU執行,CPU看到這條指令就知道,你讓將P0寄存器某位設置成1。有人可能會問,那個指令碼是多少?這個是CPU設計指令集約定的,不同CPU不一樣。
- CPU執行這條指令時,會發出一個0(也就是低電平)到GPIO0 的上圖與門控制端,這樣會使與門關閉,使地址/數據總線送來的信號無法通過與門。同時控制轉換開關MUX,圖中虛線部分,使電子轉換開關與鎖存器的非Q端聯通。可能有人會問信號是什么?就是高低電壓電信號。
- 同時,鎖存器的CP端會會有寫信號,表示要開始往鎖存器寫數據了,cpu通過內部總線將1這個數據通過D端發給鎖存器,鎖存器會從非Q端處輸出反信號低電平0。
- 非Q端經過MUX與V2連接,會使場效應管V2截止,這樣P0.X引腳就與地斷開,如果引腳外接了上拉電阻,就會是P0.X輸出是高電平1.
- 如果P0.X接了個led燈,led N極接了地,就會PN節導通,led就亮了。
這就是整個過程。
總結一下,上面我們將整個脈絡講了一遍。大家發現,其實控制led燈還是MCU內部電路,沒錯,確實是這樣,但是軟件代碼被CPU執行之后,CPU會使相關寄存器改變狀態為1,連帶后面整個電路就會連鎖反應,導致最后引腳輸出高電平。而寄存器和內存一樣,CPU通過地址總線尋址是可以找到它并改寫它,所以才有上篇文章我說寄存器是軟硬件的接口紐帶。你只需要操作寄存器就可以操作硬件。
當然強調一點,不同芯片它的實現電路不一樣,這里我們舉這個例子主要是讓你理解軟硬件怎么聯系起來的這種模式或者方法,至于具體電路都是芯片設計公司的事情。