STM32F103RCT6一共有4組IO口,一共有16*3+3=51個IO口
GPIOA0~A15
GPIOB0~B15
GPIOC0~C15
GPIOD0~D2
一、GPIO 功能描述
每個GPI/O端口有兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個32位數據寄存器(GPIOx_IDR和GPIOx_ODR),一個32位置位/復位寄存器(GPIOx_BSRR),一個16位復位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。
STM32 的 IO 口可以由軟件配置成如下 8 種模式:
1、輸入浮空
2、輸入上拉
3、輸入下拉
4、模擬輸入
5、開漏輸出
6、推輓輸出
7、推輓式複用功能
8、開漏複用功能
每個 IO 口可以自由編程,但 IO 口寄存器必須要按 32 位字被訪問。(不允許半字或字節訪問)。GPIOx_BSRR和GPIOx_BRR寄存器允許對任何GPIO寄存器的讀/更改的獨立訪問;這樣,在讀和更改訪問之間產生IRQ時不會發生危險。
VCC:C=circuit 表示電路的意思, 即接入電路的電壓;
VDD:D=device 表示器件的意思, 即器件內部的工作電壓;
VSS:S=series 表示公共連接的意思,通常指電路公共接地端電壓。
對於數字電路來說,VCC是電路的供電電壓,VDD是芯片的工作電壓(通常Vcc>Vdd),VSS是接地點。例如,對於ARM單片機來說,其供電電壓VCC一般爲5V,一般經過穩壓模塊將其轉換爲單片機工作電壓VDD = 3.3V。
TTL肖特基觸發器:將模擬信號轉化爲數字信號,這裏有一個閾值電壓的概念,比如從低到高達到多少纔會導通,從高到底多少纔會關閉。
二、GPIO工作方式(重要)
4種輸入模式:
輸入浮空
輸入上拉
輸入下拉
模擬輸入
4種輸出模式:
開漏輸出
開漏複用功能
推輓式輸出
推輓式複用功能
3種最大翻轉速度:
-2MHZ
-10MHz
-50MHz
①輸入浮空模式(GPIO_Mode_IN_FLOATING)
輸入浮空的時候走的是黃色的部分,順序爲①——④。再輸入浮空的時候上拉和下拉的兩個開關(即②和①之間的開關)是斷開的,輸入電平從①處輸入進去,經過施密特觸發器(這時施密特觸發器是打開的),電平直接傳到輸入數據寄存器,然後CPU就可以通過讀取輸入數據寄存器得到外部輸入電平的值。即在輸入浮空模式下,我們可以讀取外部的電平。
輸入浮空一般多用於外部按鍵輸入,在浮空輸入狀態下,IO狀態是不確定的,完全由外部輸入決定,如果在該引腳懸空的情況下,讀取該端口的電平是不確定的。
②輸入上拉(GPIO_Mode_IPU)
輸入上拉和輸入浮空的區別就是上拉電阻(30-50K)是接通的。
CPU通過讀取輸入數據寄存器的值來得到輸入高低電平的值。
上拉電阻的目的是爲了保證在無信號輸入時輸入端的電平爲高電平,而在信號輸入爲低電平時輸入端的電平應該也爲低電平。如果沒有上拉電阻,在沒有外界輸入的情況下輸入端是懸空的,它的電平是未知的無法保證的,上拉電阻就是爲了保證無信號輸入時輸入端的電平爲高電平。
③輸入下拉(GPIO_Mode_IPD)
輸入下拉就是下拉電阻是接通的。
下拉電阻就是爲了保證無信號輸入時輸入端的電平爲低電平。
④模擬輸入(GPIO_Mode_AIN)
將外部的模擬量轉換成數字量。外部的輸入是模擬的,將其轉換成數字量。 作爲模擬輸入一般是0-3.3v。
應用於ADC模擬輸入,或者低功耗下省電。
⑤開漏輸出(GPIO_Mode_Out_OD)
MOS管部分可看作如下電路:
開漏輸出模式下,CPU可以寫寄存器(位設置/清除寄存器),比如寫1,最終會被映射到輸出數據寄存器,輸出數據寄存器連通的是輸出控制電路,如果我們的輸出是1,N-MOS管就處於關閉狀態(P-MOS從不被激活),這時IO端口的電平就不會由我們輸出的1來決定,因爲N-MOS管已經截止了,所以IO口的電平是由外部的上拉或下拉決定。在輸出模式下,輸出的電平也可以通過輸入電路讀取到輸入數據寄存器,然後被CPU讀取。
所以,當我們輸出1時,我們讀取的輸出電平可能不是我們輸出的1,讀取的值是由外部的上拉或下拉決定的。當我們的輸出是0,這時N-MOS管處於開啓狀態,IO口的電平就會被N-MOS管拉到Vss,這時IO口的電平輸出就爲0,CPU通過輸入電路讀取IO口的電平也就爲0。
輸出端相當於三極管的集電極。要得到高電平狀態需要上拉電阻纔行. 適合於做電流型的驅動,其吸收電流的能力相對強(一般 20mA以內)。
開漏形式的電路有以下幾個特點:
①利用外部電路的驅動能力,減少 IC (集成電路)內部的驅動。當 IC 內部 MOSFET(金屬-氧化物半導體場效應晶體管,簡稱金氧半場效晶體管,可分爲“N型”與“P型”,通常又稱爲NMOSFET與PMOSFET,其他簡稱尚包括NMOS、PMOS) 導通時,驅動電流是從外部的VCC 流經 R pull-up(上拉電阻) ,MOSFET 到 GND。IC 內部僅需很下的柵極驅動電流。
②一般來說,開漏是用來連接不同電平的器件,匹配電平用的,因爲開漏引腳不連接外部的上拉電阻時,只能輸出低電平,如果需要同時具備輸出高電平的功能,則需要接上拉電阻。
③開漏輸出提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時。因爲上升沿是通過外接上拉無源電阻對負載充電,所以當電阻選擇小時延時就小,但功耗大;反之延時大功耗小。所以如果對延時有要求,則建議用下降沿輸出。
⑥複用開漏輸出(GPIO_Mode_AF_OD)
複用開漏輸出和開漏輸出的區別就是輸出1和0的來源不同,開漏輸出是由CPU寫入的,映射到輸出數據寄存器連通到輸出電路,而複用開漏輸出是由複用功能輸出決定的,即來自片上的外設,其他的地方都一樣。
複用開漏輸出、複用推輓輸出可以理解爲GPIO口被用作第二功能時的配置情況(比如串口USART),即並非作爲通用IO口。
⑦推輓輸出(GPIO_Mode_Out_PP)
推輓輸出控制輸出的寄存器和開漏輸出是一樣的,當輸出爲1,這時P-MOS管被導通,N-MOS管截止,輸出的1就被傳輸到IO端口,當輸出爲0,P-MOS管截止,N-MOS管導通,輸出的0就被傳輸到IO口。同樣,我們也可以通過輸入電路讀取IO口的輸出。
推輓輸出:可以輸出高,低電平,連接數字器件; 推輓結構一般是指兩個三極管分別受兩互補信號的控制,總是在一個三極管導通的時候另一個截止。高低電平由 IC 的電源低定。
推輓電路是兩個參數相同的三極管或 MOSFET, 以推輓方式存在於電路中, 各負責正負半周的波形放大任務, 電路工作時,兩隻對稱的功率開關管每次只有一個導通,所以導通損耗小、效率高。輸出既可以向負載灌電流,也可以從負載抽取電流。推拉式輸出級既提高電路的負載能力,又提高開關速度。
⑧複用推輓輸出(GPIO_Mode_AF_PP)
複用推輓輸出和推輓輸出的區別也輸出1和0的來源不同,其它的地方都一樣。
複用開漏輸出、複用推輓輸出可以理解爲GPIO口被用作第二功能時的配置情況(比如說串口),即並非作爲通用IO口。
上電覆位後,GPIO默認爲浮空狀態,部分特殊功能引腳爲特定狀態。
復位後,JTAG引腳被置於輸入上拉或下拉模式:
─ PA15:JTDI置於上拉模式
─ PA14:JTCK置於下拉模式
─ PA13:JTMS置於上拉模式
─ PB4: JNTRST置於上拉模式
當作爲輸出配置時,寫到輸出數據寄存器上的值(GPIOx_ODR)輸出到相應的I/O引腳。可以以推輓模式或開漏模式(當輸出0時,只有N-MOS被打開)使用輸出驅動器。輸入數據寄存器(GPIOx_IDR)在每個APB2時鐘週期捕捉I/O引腳上的數據。所有GPIO引腳有一個內部弱上拉和弱下拉,當配置爲輸入時,它們可以被激活也可以被斷開。