STM32 GPIO詳解
STM32 GPIO
1. IO口模式
| 輸入 | 輸出 | ||
|---|---|---|---|
| 浮空輸入 | GPIO_Mode_AIN | 開漏輸出 | GPIO_Mode_Out_PP |
| 上拉輸入 | GPIO_Mode_IN_FLOATING | 推挽輸出 | GPIO_Mode_Out_OD |
| 下拉輸入 | GPIO_Mode_IPD | 推挽式復用功能 | GPIO_Mode_AF_PP |
| 模擬輸入 | GPIO_Mode_IPU | 開漏復用功能 | GPIO_Mode_AF_OD |
浮空輸入:什么電阻都不接,由施密特觸發器輸入,輸入阻抗較大,為一個不確定的值,通常作為IIC,USART等通訊協議的接收端;
上拉輸入:接入上拉電阻輸入數字信號1;
下拉輸入:接入下拉電阻輸入數字信號0;
模擬輸入:主要是用于ADC外設的輸入;
開漏輸出:無法真正輸出高電平,即高電平沒有驅動能力,需要借助外部上拉電阻完成對外驅動。
推挽輸出:線路經過一個類似CMOS反相器的電路單元,要輸出大電流一般采用這種輸出方式,例如點亮LED燈。
推挽復用和開漏復用:可以理解為GPIO口被用作第二功能時的配置情況(即并非作為通用IO口使用)。
注:開漏輸出可以實現“線與”功能。
“線與”:多個信號線直接連在一起,所有信號線為高電平時,合在一起的總線為高電平;只要有任意一個是低電平,總線就是低電平。
推挽輸出就沒有這個功能,如果高低電平連在一起,就會出現電流倒灌,損壞器件。推挽輸出的最大優點就是可以真正的輸出高電平和低電平,在兩種電平下都有驅動能力。
2. IO口的寄存器
每個IO口都有七個寄存器來控制。
2個32位配置模式的端口配置寄存器CRL和CRH;
2個32位的數據寄存器IDR和ODR;
1個32位的置位/復位寄存器BSRR;
1個16位的復位寄存器BRR;
1個32位的鎖存寄存器LCKR;
對于寄存器CRL來講有32位,因為每一個IO口要用4個位來控制,所以CRL可以控制8個IO口。所以CRL配置0-7的IO口,CRH來配置8-15的IO口。
在寄存器中從最低位開始,首先時MODE然后是CNF,再然后是MODE,以此類推。
MODE有兩位,CNF有兩位。
| MODE[1:0] |
|---|
| 00:輸入模式(復位后的狀態) |
| 01:輸出模式,最大速度10MHz |
| 10:輸出模式,最大速度2MHz |
| 11:輸出模式,最大速度50MHz |
| CNF[1:0] |
|---|
| 在輸入模式下(MODE[1:0]=00) |
| 00:模擬輸入模式 |
| 01:浮空輸入模式(復位后的狀態) |
| 10:上拉、下拉輸入模式 |
| 11:保留 |
| 在輸出模式(MODE[1:0]>00) |
| 00:通用推挽輸出模式 |
| 01:通用開漏輸出模式 |
| 10:復用功能推挽輸出模式 |
| 11:復用功能開漏輸出模式 |
該寄存器的復位值時0x4444 4444。可以發現復位值就是配置端口為浮空輸入模式。
3. 示例代碼
//IO方向設置
//GPIOA->CRL &= 0xFFFFFFF0; 指的是將PA0這個引腳配置復位清零
//GPIOA->CRL|=8<<0; 指的是將PA0這個引腳配置為輸入模式的上拉、下拉輸入模式
#define MPU_SDA_IN() {GPIOA->CRL &= 0xFFFFFFF0; GPIOA->CRL|=8<<0; }
//GPIOA->CRL|=8<<0; 指的是將PA0這個引腳配置為輸出模式下的通用推挽輸出模式
#define MPU_SDA_OUT() {GPIOA->CRL &= 0xFFFFFFF0; GPIOA->CRL|=3<<0; }

浙公網安備 33010602011771號