GPIO -- General Purpose Input Output (通用輸入/輸出)簡稱為GPIO, GPIO在每一款單片機中的地位都是至關重要的。 下面說一下它的工作原理。 我用的是MINISTM32F103RCT6這款單片機。
1.1 GPIO工作方式
工作方式:(4輸入、4輸出),三種最大翻轉速度 3種最大翻轉速度 2MHz
10MHz
50MHz 4種輸入方式:
1, 輸入浮空模式:CPU可以讀輸入數據寄存器里面的數據。輸入電平經過TTL施密特觸發器到輸入數據寄存器,
這時上拉下拉電阻都是沒接通的。
2, 輸入上拉模式:和輸入浮空差不多, 唯一的區別就是電平輸入的時候加了一個上拉電阻。
3, 輸入下拉模式:電平輸入的時候加了一個下拉電阻。
4, 模擬模式:TTL施密特觸發器是截止的( 前面三個都是接通的), 注意此刻輸入量并不是高低電平, 而是0-3V電壓; 并且上拉下拉電阻都是沒有接通的。
注意:輸入模式數據都是輸入到輸入數據寄存器中, 然后CPU直接讀輸入數據寄存器中。
20171015204015244.png (127.17 KB, 下載次數: 65)
下載附件
2017-10-15 20:53 上傳
ps:上圖是盜的。。。 4種輸出方式:
1, 開漏輸出模式:輸出電平通過 位設置/清除寄存器 映射到 輸出數據寄存器 然后通過輸出控制電路, 如果輸出的是1(高電平)那么N-MOS管是關閉的, 實際輸出電平是由I/O外部的上拉/下拉電阻控制的。 并且此時CPU可以讀輸出的電平, 但是因為輸出1的時候實際輸出電平是由I/O口外部上拉/下拉決定的, 所以此時讀入的可能不是1。 但是如果輸出的是0那么N-MOS管是開啟的,此時電平被拉到VSS, 此時I/O口輸出的也就是低電平; 并且可以通過CPU輸入數據寄存器來讀取。
2, 開漏復用輸出模式:與開漏輸出模式唯一的區別就是來源, 開漏復用輸出模式的電平來源是來自于片上外設模塊。
3, 推挽輸出模式:與開漏輸出模式前面都是一樣的, 但是當輸出1時, N-MOS管是關閉的,P-MOS管開啟; 所以輸出為1.
當輸出為0時, P-MOS管關閉, N-MOS管開啟; 輸出為0;
4, 復用推挽輸出模式:與推挽輸出模式的唯一區別就是來源, 復用推挽輸出模式的來源是片上外設模塊。
學習的時候可以將第一種輸出模式和第二種輸出模式放一塊, 第三種輸出模式和第四種輸出模式放一塊。
上電復位后, GPIO默認為浮空狀態,部分特殊功能引腳為特定狀態。
復位后, JTAG引腳被置于輸入上拉或者下拉模式:
PA15:JTDI置于上拉模式
PA14:JTCK置于下拉模式
PA13:JTMS置于上拉模式
PB4:JNTRST置于上拉模式
推挽輸出和開漏輸出區別:
推挽輸出:
可以輸出強高低電平,連接數字器件
開漏輸出:
只可以輸出強低電平,高電平得靠外部電阻拉高。輸出端相當于三極管的集電極. 要得到高電平狀態需要上拉電阻才行. 適合于做電流型的驅動,其吸收電流的能力相對強(一般20ma以內)
1.2GPIO端口寄存器包括
兩個32位配置寄存器(GPIOx_CRL, GPIOx_CRH)
兩個32位數據寄存器(GPIOx_IDR和GPIOx_ODR)
一個32位置位/復位寄存器(GPIOx_BRR)
一個16位復位寄存器(GPIOx_BSRR)
一個32位鎖定寄存器(GPIOx_LCKR), (不常用)
每個I/O端口可以自由編程, 然而I/O端口寄存器必須按32位字被訪問(不允許半字或字節訪問)。
1.2.1端口配置高/低寄存器(GPIOx_CRH, GPIOx_CRL)
stm32 GPIO_CRH是32位的寄存器, 但是配置每一個I/O口需要4位,也就是一個寄存器可以控制8個I/O口, 但是每一組I/O有16位所以需要兩個32位寄存器(還有GPIO_CRL), CRH控制高16位, CRL控制低16位寄存器。
每個I/O由4位決定其是 輸入還是輸出 并且是什么模式。 將這4位分為兩組:CNFy[1:0] 和 MOEDy[1:0]
MODEy[1:0]
00:輸入模式(復位后的狀態)
01:輸出模式(最大速度10MHz)
10:輸出模式(最大速度2MHz)
11:輸出模式(最大數據50MHz)
CNFy[1:0]:
在輸入模式
00:模擬輸入模式
01:浮空輸入模式
10:上拉/下拉輸入模式
11:保留
在輸出模式
00:通用推挽輸出模式
01:通用開漏輸出模式
10:復用功能推挽輸出模式
11:復用功能開漏輸出模式
1.2.3端口輸入數據寄存器(GPIOx_IDR)
高16位保留, 低16位每一位控制一個I/O口。如果為 1 就是高電平, 為 0 就是低電平。
1.2.4端口輸出數據寄存器(GPIO_ODR)
與IDR寄存器對應(相反), 高16位保留, 低16位每一位控制一個I/O口。如果為 1 就是輸出高電平, 為 0 就是輸出低電平。但是ODR寄存器還有一個作用:就是在輸入模式下設置到底是上拉還是下拉。前面的CRH/CRL寄存器中當MODEy為 00 時(即輸入模式), CNFy為 10 (即上拉/下拉輸入模式)時,由
ODR確定到底是上拉還是下拉。將對應的ODR寄存器的位設置為 1 代表上拉, 設置為 0 代表下拉。
1.2.5端口位設置/清除寄存器(GPIOx_BSRR)
它是一個 32 位寄存器, 如果使用它的低 16 位(BSy), 那么每一位的含義為:
0:對對應的ODRy位不產生影響。
1:設置對應的ODRy位為1.
也就是說這個寄存器是用來控制ODR寄存器的, 如果低 16 位某些位為 1, 就是說ODRy寄存器對應的也為 1。但是為 0 時不產生影響, 但是如果是ODR寄存器設置為 0 那么就會輸出低電平。這有什么好處呢? 在實時系統中, 如果要設置ODR寄存器, 首先要讀入ODR寄存器的值, 然后賦一個值,然后達到控制電平的目的, 如果只是要設置高電平的話, 如果是使用BSRR寄存器就可以直接賦值為 1 了, 這樣就簡單了很多 ^_^。
如果使用的是高 16 位(BRy)的話, 那么每一位含義:
0:對對應的ODRy位不產生影響。
1:清除對應的ODRy位為0。 也就是輸出低電平
這樣一來就可以設置整個的ODR寄存器的, 如果要輸出高電平控制(BSy), 如果要輸出低電平控制(BRy) ^-^
注意:如果同時設置了BSy和BRy的對應位, BSy位起作用。
1.2.6端口位清除寄存器(GPIOx_BRR)
BRR寄存器其實作用和BSRR的高 16 位作用是一致的。
所以通常BSRR寄存器用低 16 位, 然后用BRR寄存器來實現BSRR高 16 位的功能。
stm32引腳功能說明
stm32大部分端口都具有復用功能, 也就是說可以作為通用I/O還可以作為一些外設接口。
復用作用:最大限度的利用端口資源。
重映射功能:將某些端口的功能映射到其他端口。
所有I/O口都可以作為中斷輸入。像51只能有兩個I/O可作為中斷輸入。-_-
|