找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2755|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

GPIO工作原理(stm32F10x)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:235664 發(fā)表于 2017-10-15 20:47 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
GPIO -- General Purpose Input Output (通用輸入/輸出)簡稱為GPIO, GPIO在每一款單片機(jī)中的地位都是至關(guān)重要的。 下面說一下它的工作原理。 我用的是MINISTM32F103RCT6這款單片機(jī)。

1.1 GPIO工作方式
工作方式:(4輸入、4輸出),三種最大翻轉(zhuǎn)速度
3種最大翻轉(zhuǎn)速度
2MHz
10MHz
50MHz
4種輸入方式:
1, 輸入浮空模式:CPU可以讀輸入數(shù)據(jù)寄存器里面的數(shù)據(jù)。輸入電平經(jīng)過TTL施密特觸發(fā)器到輸入數(shù)據(jù)寄存器,
這時上拉下拉電阻都是沒接通的。
2, 輸入上拉模式:和輸入浮空差不多, 唯一的區(qū)別就是電平輸入的時候加了一個上拉電阻。
3, 輸入下拉模式:電平輸入的時候加了一個下拉電阻。
4, 模擬模式:TTL施密特觸發(fā)器是截止的( 前面三個都是接通的), 注意此刻輸入量并不是高低電平,
而是0-3V電壓; 并且上拉下拉電阻都是沒有接通的。
注意:輸入模式數(shù)據(jù)都是輸入到輸入數(shù)據(jù)寄存器中, 然后CPU直接讀輸入數(shù)據(jù)寄存器中。

ps:上圖是盜的。。。
4種輸出方式:
1, 開漏輸出模式:輸出電平通過 位設(shè)置/清除寄存器 映射到 輸出數(shù)據(jù)寄存器 然后通過輸出控制電路, 如果輸出的是1(高電平)那么N-MOS管是關(guān)閉的, 實際輸出電平是由I/O外部的上拉/下拉電阻控制的。 并且此時CPU可以讀輸出的電平, 但是因為輸出1的時候?qū)嶋H輸出電平是由I/O口外部上拉/下拉決定的, 所以此時讀入的可能不是1。 但是如果輸出的是0那么N-MOS管是開啟的,此時電平被拉到VSS, 此時I/O口輸出的也就是低電平; 并且可以通過CPU輸入數(shù)據(jù)寄存器來讀取。
2, 開漏復(fù)用輸出模式:與開漏輸出模式唯一的區(qū)別就是來源, 開漏復(fù)用輸出模式的電平來源是來自于片上外設(shè)模塊。
3, 推挽輸出模式:與開漏輸出模式前面都是一樣的, 但是當(dāng)輸出1時, N-MOS管是關(guān)閉的,P-MOS管開啟; 所以輸出為1.
當(dāng)輸出為0時, P-MOS管關(guān)閉, N-MOS管開啟; 輸出為0;
4, 復(fù)用推挽輸出模式:與推挽輸出模式的唯一區(qū)別就是來源, 復(fù)用推挽輸出模式的來源是片上外設(shè)模塊。
學(xué)習(xí)的時候可以將第一種輸出模式和第二種輸出模式放一塊, 第三種輸出模式和第四種輸出模式放一塊。

上電復(fù)位后, GPIO默認(rèn)為浮空狀態(tài),部分特殊功能引腳為特定狀態(tài)。
復(fù)位后, JTAG引腳被置于輸入上拉或者下拉模式:
PA15:JTDI置于上拉模式
PA14:JTCK置于下拉模式
PA13:JTMS置于上拉模式
PB4:JNTRST置于上拉模式

推挽輸出和開漏輸出區(qū)別:
推挽輸出:
可以輸出強(qiáng)高低電平,連接數(shù)字器件
開漏輸出:
只可以輸出強(qiáng)低電平,高電平得靠外部電阻拉高。輸出端相當(dāng)于三極管的集電極. 要得到高電平狀態(tài)需要上拉電阻才行. 適合于做電流型的驅(qū)動,其吸收電流的能力相對強(qiáng)(一般20ma以內(nèi))

1.2GPIO端口寄存器包括
兩個32位配置寄存器(GPIOx_CRL, GPIOx_CRH)
兩個32位數(shù)據(jù)寄存器(GPIOx_IDR和GPIOx_ODR)
一個32位置位/復(fù)位寄存器(GPIOx_BRR)
一個16位復(fù)位寄存器(GPIOx_BSRR)
一個32位鎖定寄存器(GPIOx_LCKR), (不常用)
每個I/O端口可以自由編程, 然而I/O端口寄存器必須按32位字被訪問(不允許半字或字節(jié)訪問)。

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:輸入模式(復(fù)位后的狀態(tài))
01:輸出模式(最大速度10MHz)
10:輸出模式(最大速度2MHz)
11:輸出模式(最大數(shù)據(jù)50MHz)
CNFy[1:0]:
在輸入模式
00:模擬輸入模式
01:浮空輸入模式
10:上拉/下拉輸入模式
11:保留
在輸出模式
00:通用推挽輸出模式
01:通用開漏輸出模式
10:復(fù)用功能推挽輸出模式
11:復(fù)用功能開漏輸出模式


1.2.3端口輸入數(shù)據(jù)寄存器(GPIOx_IDR)
高16位保留, 低16位每一位控制一個I/O口。如果為 1 就是高電平, 為 0 就是低電平。


1.2.4端口輸出數(shù)據(jù)寄存器(GPIO_ODR)
與IDR寄存器對應(yīng)(相反), 高16位保留, 低16位每一位控制一個I/O口。如果為 1 就是輸出高電平, 為 0 就是輸出低電平。但是ODR寄存器還有一個作用:就是在輸入模式下設(shè)置到底是上拉還是下拉。前面的CRH/CRL寄存器中當(dāng)MODEy為 00 時(即輸入模式), CNFy為 10 (即上拉/下拉輸入模式)時,由
ODR確定到底是上拉還是下拉。將對應(yīng)的ODR寄存器的位設(shè)置為 1 代表上拉, 設(shè)置為 0 代表下拉。


1.2.5端口位設(shè)置/清除寄存器(GPIOx_BSRR)
它是一個 32 位寄存器, 如果使用它的低 16 位(BSy), 那么每一位的含義為:
0:對對應(yīng)的ODRy位不產(chǎn)生影響。
1:設(shè)置對應(yīng)的ODRy位為1.
也就是說這個寄存器是用來控制ODR寄存器的, 如果低 16 位某些位為 1, 就是說ODRy寄存器對應(yīng)的也為 1。但是為 0 時不產(chǎn)生影響, 但是如果是ODR寄存器設(shè)置為 0 那么就會輸出低電平。這有什么好處呢? 在實時系統(tǒng)中, 如果要設(shè)置ODR寄存器, 首先要讀入ODR寄存器的值, 然后賦一個值,然后達(dá)到控制電平的目的, 如果只是要設(shè)置高電平的話, 如果是使用BSRR寄存器就可以直接賦值為 1 了, 這樣就簡單了很多 ^_^。
如果使用的是高 16 位(BRy)的話, 那么每一位含義:
0:對對應(yīng)的ODRy位不產(chǎn)生影響。
1:清除對應(yīng)的ODRy位為0。 也就是輸出低電平
這樣一來就可以設(shè)置整個的ODR寄存器的, 如果要輸出高電平控制(BSy), 如果要輸出低電平控制(BRy) ^-^
注意:如果同時設(shè)置了BSy和BRy的對應(yīng)位, BSy位起作用。


1.2.6端口位清除寄存器(GPIOx_BRR)
BRR寄存器其實作用和BSRR的高 16 位作用是一致的。
所以通常BSRR寄存器用低 16 位, 然后用BRR寄存器來實現(xiàn)BSRR高 16 位的功能。

stm32引腳功能說明
stm32大部分端口都具有復(fù)用功能, 也就是說可以作為通用I/O還可以作為一些外設(shè)接口。
復(fù)用作用:最大限度的利用端口資源。
重映射功能:將某些端口的功能映射到其他端口。
所有I/O口都可以作為中斷輸入。像51只能有兩個I/O可作為中斷輸入。-_-

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表