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直接讀輸入資料寄存器中。
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可作為中斷輸入。-_-