99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

【工程師6】+理論類+STM32的GPIO庫函數詳解

gpio:通用輸入輸出接口
gpio管腳:一個io管腳,這個管腳可以有多個配置。在庫函數中用GPIO_Pin_1這樣的宏定義表示
gpio端口(gpio分組):一組gpio管腳的信息。在庫函數中用宏定義GPIOA GPIOB等表示
1      gpio庫說明
庫文件名:stm32f4xx_gpio.c
文檔提示翻譯:
如何使用這個驅動
(1)       使用RCC_AHB1PeriphclockCmd(RCC_AHB1Periph_GPIOx, ENABLE)函數使能GPIO的AHB總線時鐘
(2)       使用GPIO_Init()函數對每個引腳進行四種可能的配置
《1》       輸入狀態:Floating(浮空), Pull-up(上拉), Pull-down(下拉)
《2》       輸出狀態:Push-Pull (上拉下拉)(Pull-up(上拉), Pull-down(下拉) or no Pull(不上拉也不下拉)),Open Drain(開漏) (Pull-up(上拉), Pull-down(下拉) or no Pull(不上拉也不下拉)),在輸出模式,速度配置成2MHZ,25MHZ,50MHZ和100MHZ.
《3》       第二功能:上拉下拉和開漏
《4》       模擬:當一個管腳被用作ADC通道或者DAC輸出的時候,需要配置成此模式
(3)       外設的第二功能:
《1》       在ADC和DAC模式,使用GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AN把需要的管腳配置成模擬模式
《2》       對于其它的管腳(定時器,串口等):
l  使用GPIO_PinAFConfig()函數把管腳和需要的第二功能進行連接
l  使用GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF把需要的管腳配置成第二功能模式
l  通過成員變量GPIO_PuPd, GPIO_OType and GPIO_Speed選擇類型,上拉下拉和輸出速度
l  調用函數GPIO_Init()
(4)       在輸入模式,使用函數GPIO_ReadInputDataBit()得到配置好管腳的電平
(5)       在輸出模式,使用函數GPIO_SetBits()/GPIO_ResetBits()設置配置好IO的高低電平
(6)       在復位過程和剛剛復位后,第二功能是無效的,GPIO被配置成了輸入浮空模式(JTAG管腳除外)
(7)       當LSE振蕩器關閉的時候,LSE振蕩器管腳OSC32_IN和OSC32_OUT可以作為通過IO來使用(分別用PC14和PC15表示)。LSE的優先級高于GPIO函數
(8)       當HSE振蕩器關閉的時候,HSE振蕩器管腳OSC_IN和OSC_OUT可以作為通用IO(PH0,PH1)來使用。HSE的優先級高于GPIO函數。
全部回復(20)
正序查看
倒序查看
2019-10-18 15:05
2      具體函數說明
初始化和配置相關函數
1.  void GPIO_DeInit(GPIO_TypeDef* GPIOx)
函數解釋gpio的反初始化函數,該函數的作用是把GPIO相關的寄存器配置成上電復位后的默認狀態,在第一次初始化前或者不再使用某一個接口后可以調用該函數。
函數參數說明:GPIOxgpio的分組,如GPIOA  GPIOB  GPIOC等的宏定義(這些宏定義在頭文件stm32f4xx.h中,由廠家寫好,我們直接使用即可)

2.  void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef*GPIO_InitStruct)
函數解釋gpio的初始化函數,該函數的作用是對io進行初始化。
函數參數說明:(1)GPIOx:gpio的分組,如GPIOA  GPIOB GPIOC等的宏定義。
(2)GPIO_InitStruct:gpio的初始化相關結構體。該結構體里面的成員變量決定了我們具體的初始化參數。以下進行說明:
l  GPIO_Pin:指定具體的IO腳,如GPIO_Pin_0   GPIO_Pin_1這樣的宏定義,這些宏由廠家寫好,我們直接使用即可。
l  GPIO_Mode:指定gpio的模式,有以下四種模式:
GPIO_Mode_IN(輸入),GPIO_Mode_OUT(輸出),GPIO_Mode_AF(第二功能),GPIO_Mode_AN(模擬),可以直接使用這四種宏定義。
l  GPIO_Speed:指定IO的最快翻轉速度,也就是當使用IO產生頻率(如PWM)的最快速度。有以下四種速度的配置:
GPIO_Low_Speed (低速),GPIO_Medium_Speed(中等速度),GPIO_Fast_Speed(快速),GPIO_High_Speed(高速),可以直接使用這四種宏定義。
l  GPIO_OType:指定選擇管腳的輸出類型,有以下兩種配置:
GPIO_OType_PP (推挽方式輸出),GPIO_OType_OD(開漏方式輸出),可以直接使用這兩種宏定義。
Tips:
推挽輸出推挽輸出就是單片機引腳可以直接輸出高電平電壓。低電平時接地,高電平時輸出單片電源電壓。這種方式可以不接上拉電阻。但如果輸出端可能會接地的話,這個時候輸出高電平可能引發單片機運行不穩定,甚至可能燒壞引腳。推挽方式的驅動力更大。
開漏輸出開漏輸出就是不輸出電壓,低電平時接地,高電平時不接地。如果外接上拉電阻,則在輸出高電平時電壓會拉到上拉電阻的電源電壓。這種方式適合在連接的外設電壓比單片機電壓低的時候。
l  GPIO_PuPd。指定選擇管腳的上拉和下拉模式。有如下三種配置:
GPIO_PuPd_NOPULL(不上拉也不下拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)。Tips:這些都是IO的內部上拉或者下拉模式,也可以接上拉和下拉電阻通過硬件進行外部上拉和外部下拉。

3.  void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
函數解釋gpio結構體的初始化。對GPIO_InitStruct結構體進行默認配置
函數參數說明:GPIO_InitStruct,直接傳入該結構體的指針,在該函數內會對結構體進行初始化。

4.  void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
函數解釋:鎖定gpio的寄存器,鎖定的寄存器是GPIOx_MODER,GPIOx_OTYPER, GPIOx_OSPEEDR,GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH。在下一次復位前,被鎖定的管腳不能被修改。
函數參數說明:GPIOxgpio的分組(如GPIOA,GPIOB等)。GPIO_Pin:具體的gpio管腳(如GPIO_Pin_0   GPIO_Pin_1這樣的宏定義)
0
回復
2019-10-18 15:06
@lihui710884923
2    具體函數說明初始化和配置相關函數1.  voidGPIO_DeInit(GPIO_TypeDef*GPIOx)函數解釋:gpio的反初始化函數,該函數的作用是把GPIO相關的寄存器配置成上電復位后的默認狀態,在第一次初始化前或者不再使用某一個接口后可以調用該函數。函數參數說明:GPIOx:gpio的分組,如GPIOA  GPIOB  GPIOC等的宏定義(這些宏定義在頭文件stm32f4xx.h中,由廠家寫好,我們直接使用即可)2.  voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)函數解釋:gpio的初始化函數,該函數的作用是對io進行初始化。函數參數說明:(1)GPIOx:gpio的分組,如GPIOA  GPIOBGPIOC等的宏定義。(2)GPIO_InitStruct:gpio的初始化相關結構體。該結構體里面的成員變量決定了我們具體的初始化參數。以下進行說明:l  GPIO_Pin:指定具體的IO腳,如GPIO_Pin_0  GPIO_Pin_1這樣的宏定義,這些宏由廠家寫好,我們直接使用即可。l  GPIO_Mode:指定gpio的模式,有以下四種模式:GPIO_Mode_IN(輸入),GPIO_Mode_OUT(輸出),GPIO_Mode_AF(第二功能),GPIO_Mode_AN(模擬),可以直接使用這四種宏定義。l  GPIO_Speed:指定IO的最快翻轉速度,也就是當使用IO產生頻率(如PWM)的最快速度。有以下四種速度的配置:GPIO_Low_Speed(低速),GPIO_Medium_Speed(中等速度),GPIO_Fast_Speed(快速),GPIO_High_Speed(高速),可以直接使用這四種宏定義。l  GPIO_OType:指定選擇管腳的輸出類型,有以下兩種配置:GPIO_OType_PP(推挽方式輸出),GPIO_OType_OD(開漏方式輸出),可以直接使用這兩種宏定義。Tips:推挽輸出:推挽輸出就是單片機引腳可以直接輸出高電平電壓。低電平時接地,高電平時輸出單片機電源電壓。這種方式可以不接上拉電阻。但如果輸出端可能會接地的話,這個時候輸出高電平可能引發單片機運行不穩定,甚至可能燒壞引腳。推挽方式的驅動力更大。開漏輸出:開漏輸出就是不輸出電壓,低電平時接地,高電平時不接地。如果外接上拉電阻,則在輸出高電平時電壓會拉到上拉電阻的電源電壓。這種方式適合在連接的外設電壓比單片機電壓低的時候。l  GPIO_PuPd。指定選擇管腳的上拉和下拉模式。有如下三種配置:GPIO_PuPd_NOPULL(不上拉也不下拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)。Tips:這些都是IO的內部上拉或者下拉模式,也可以接上拉和下拉電阻通過硬件進行外部上拉和外部下拉。3.  voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct)函數解釋:gpio結構體的初始化。對GPIO_InitStruct結構體進行默認配置函數參數說明:GPIO_InitStruct,直接傳入該結構體的指針,在該函數內會對結構體進行初始化。4.  voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)函數解釋:鎖定gpio的寄存器,鎖定的寄存器是GPIOx_MODER,GPIOx_OTYPER,GPIOx_OSPEEDR,GPIOx_PUPDR,GPIOx_AFRLandGPIOx_AFRH。在下一次復位前,被鎖定的管腳不能被修改。函數參數說明:GPIOx:gpio的分組(如GPIOA,GPIOB等)。GPIO_Pin:具體的gpio管腳(如GPIO_Pin_0  GPIO_Pin_1這樣的宏定義)
GPIO的讀寫函數
1.  uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin)
函數解釋:讀取io輸入管腳的值
函數參數說明:GPIOxgpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳
函數返回值說明:輸入管腳的值Bit_SET(高電平) Bit_RESET(低電平)

2.  uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
函數解釋:讀取輸入io數據,該函數用于讀取一個IO分組的所有數據
函數參數說明:GPIOxgpio的分組/gpio端口
函數返回值說明:一個io端口的所有數據 (輸入狀態)

3.  uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin)
函數解釋:讀取io輸出管腳的值
函數參數說明:GPIOxgpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳
函數返回值說明:輸出管腳的值Bit_SET(高電平) Bit_RESET(低電平)

4.  uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
函數解釋:讀取輸出io分組/端口的值
函數參數說明:GPIOxgpio的分組/gpio端口
函數返回值說明:一個io端口的所有數據 (輸出狀態)

5.  void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
函數解釋:對io管腳進行置位(輸出高電平)。這個函數使用GPIOx_BSRR寄存器來實現原子讀或者修改操作。在這種情況下,在讀和修改訪問時發生一個IRQ中斷是沒有危險的。
函數參數說明:GPIOxgpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳或者是io管腳的組合

6.  void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
函數解釋:對io管腳進行復位(輸出低電平)。這個函數使用GPIOx_BSRR寄存器來實現原子讀或者修改操作。在這種情況下,在讀和修改訪問時發生一個IRQ中斷是沒有危險的。
函數參數說明:GPIOxgpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳或者是io管腳的組合

7.  void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitActionBitVal)
函數解釋:對某一位進行寫入操作
函數參數說明:GPIOxgpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳;BitVal:寫入高電平或者低電平(Bit_RESET:寫入低電平 Bit_SET:寫入高電平)

8.  void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
函數解釋:對gpio端口進行寫入操作,適用于對統一端口的多個管腳的寫入
函數參數說明:GPIOxgpio的分組/gpio端口; BitVal:寫入高電平或者低電平(Bit_RESET:寫入低電平 Bit_SET:寫入高電平)

9.  void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
函數解釋:翻轉指定的gpio口,也就是說,如果當前的io是低電平,則變成高電平,如果當前io是高電平,則變成低電平
函數參數說明:GPIOxgpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳。
0
回復
2019-10-18 15:07
@lihui710884923
GPIO的讀寫函數1.  uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)函數解釋:讀取io輸入管腳的值函數參數說明:GPIOx:gpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳函數返回值說明:輸入管腳的值Bit_SET(高電平) Bit_RESET(低電平)2.  uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx)函數解釋:讀取輸入io數據,該函數用于讀取一個IO分組的所有數據函數參數說明:GPIOx:gpio的分組/gpio端口函數返回值說明:一個io端口的所有數據 (輸入狀態)3.  uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)函數解釋:讀取io輸出管腳的值函數參數說明:GPIOx:gpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳函數返回值說明:輸出管腳的值Bit_SET(高電平) Bit_RESET(低電平)4.  uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx)函數解釋:讀取輸出io分組/端口的值函數參數說明:GPIOx:gpio的分組/gpio端口函數返回值說明:一個io端口的所有數據 (輸出狀態)5.  voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)函數解釋:對io管腳進行置位(輸出高電平)。這個函數使用GPIOx_BSRR寄存器來實現原子讀或者修改操作。在這種情況下,在讀和修改訪問時發生一個IRQ中斷是沒有危險的。函數參數說明:GPIOx:gpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳或者是io管腳的組合6.  voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)函數解釋:對io管腳進行復位(輸出低電平)。這個函數使用GPIOx_BSRR寄存器來實現原子讀或者修改操作。在這種情況下,在讀和修改訪問時發生一個IRQ中斷是沒有危險的。函數參數說明:GPIOx:gpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳或者是io管腳的組合7.  voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal)函數解釋:對某一位進行寫入操作函數參數說明:GPIOx:gpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳;BitVal:寫入高電平或者低電平(Bit_RESET:寫入低電平 Bit_SET:寫入高電平)8.  voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal)函數解釋:對gpio端口進行寫入操作,適用于對統一端口的多個管腳的寫入函數參數說明:GPIOx:gpio的分組/gpio端口; BitVal:寫入高電平或者低電平(Bit_RESET:寫入低電平 Bit_SET:寫入高電平)9.  voidGPIO_ToggleBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)函數解釋:翻轉指定的gpio口,也就是說,如果當前的io是低電平,則變成高電平,如果當前io是高電平,則變成低電平函數參數說明:GPIOx:gpio的分組/gpio端口;GPIO_Pin:具體的gpio管腳。
Gpio復用功能配置函數
1.  void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource,uint8_t GPIO_AF)
函數解釋:改變指定管腳的映射關系。即配置指定管腳的復用功能。
函數參數說明:GPIOxgpio的分組/gpio端口;GPIO_PinSource:具體要配置成復用功能的管腳(如GPIO_Pin_0   GPIO_Pin_1這樣的宏定義);GPIO_AF:選擇該管腳要使用的復用功能。有如下配置:(注意:復用功能的配置要和實際管腳支持的復用功能匹配)
GPIO_AF_RTC_50Hz: Connect RTC_50Hz pin toAF0 (default after reset)
GPIO_AF_MCO: Connect MCO pin (MCO1 and MCO2)to AF0 (default after reset)
GPIO_AF_TAMPER: Connect TAMPER pins(TAMPER_1 and TAMPER_2) to AF0 (default after reset)
GPIO_AF_SWJ: Connect SWJ pins (SWD andJTAG)to AF0 (default after reset)
GPIO_AF_TRACE: Connect TRACE pins to AF0(default after reset)
GPIO_AF_TIM1: Connect TIM1 pins to AF1
GPIO_AF_TIM2: Connect TIM2 pins to AF1
GPIO_AF_TIM3: Connect TIM3 pins to AF2
GPIO_AF_TIM4: Connect TIM4 pins to AF2
GPIO_AF_TIM5: Connect TIM5 pins to AF2
GPIO_AF_TIM8: Connect TIM8 pins to AF3
GPIO_AF_TIM9: Connect TIM9 pins to AF3
GPIO_AF_TIM10: Connect TIM10 pins to AF3
GPIO_AF_TIM11: Connect TIM11 pins to AF3
GPIO_AF_I2C1: Connect I2C1 pins to AF4
GPIO_AF_I2C2: Connect I2C2 pins to AF4
GPIO_AF_I2C3: Connect I2C3 pins to AF4
GPIO_AF_SPI1: Connect SPI1 pins to AF5
GPIO_AF_SPI2: Connect SPI2/I2S2 pins to AF5
GPIO_AF_SPI4: Connect SPI4 pins to AF5
GPIO_AF_SPI5: Connect SPI5 pins to AF5
GPIO_AF_SPI6: Connect SPI6 pins to AF5
GPIO_AF_SAI1: Connect SAI1 pins to AF6 forSTM32F42xxx/43xxx devices.      
GPIO_AF_SPI3: Connect SPI3/I2S3 pins to AF6
GPIO_AF_I2S3ext: Connect I2S3ext pins toAF7
GPIO_AF_USART1: Connect USART1 pins to AF7
GPIO_AF_USART2: Connect USART2 pins to AF7
GPIO_AF_USART3: Connect USART3 pins to AF7
GPIO_AF_UART4: Connect UART4 pins to AF8
GPIO_AF_UART5: Connect UART5 pins to AF8
GPIO_AF_USART6: Connect USART6 pins to AF8
GPIO_AF_UART7: Connect UART7 pins to AF8
GPIO_AF_UART8: Connect UART8 pins to AF8
GPIO_AF_CAN1: Connect CAN1 pins to AF9
GPIO_AF_CAN2: Connect CAN2 pins to AF9
GPIO_AF_TIM12: Connect TIM12 pins to AF9
GPIO_AF_TIM13: Connect TIM13 pins to AF9
GPIO_AF_TIM14: Connect TIM14 pins to AF9
GPIO_AF_OTG_FS: Connect OTG_FS pins to AF10
GPIO_AF_OTG_HS: Connect OTG_HS pins to AF10
GPIO_AF_ETH: Connect ETHERNET pins to AF11
GPIO_AF_FSMC: Connect FSMC pins to AF12
GPIO_AF_FMC: Connect FMC pins to AF12 forSTM32F42xxx/43xxx devices.   
GPIO_AF_OTG_HS_FS: Connect OTG HS(configured in FS) pins to AF12
GPIO_AF_SDIO: Connect SDIO pins to AF12
GPIO_AF_DCMI: Connect DCMI pins to AF13
GPIO_AF_LTDC: Connect LTDC pins to AF14 forSTM32F429xx/439xx devices.
GPIO_AF_EVENTOUT: Connect EVENTOUT pins toAF15
0
回復
2019-10-18 15:08
@lihui710884923
Gpio復用功能配置函數1.  voidGPIO_PinAFConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_PinSource,uint8_tGPIO_AF)函數解釋:改變指定管腳的映射關系。即配置指定管腳的復用功能。函數參數說明:GPIOx:gpio的分組/gpio端口;GPIO_PinSource:具體要配置成復用功能的管腳(如GPIO_Pin_0  GPIO_Pin_1這樣的宏定義);GPIO_AF:選擇該管腳要使用的復用功能。有如下配置:(注意:復用功能的配置要和實際管腳支持的復用功能匹配)GPIO_AF_RTC_50Hz:ConnectRTC_50HzpintoAF0(defaultafterreset)GPIO_AF_MCO:ConnectMCOpin(MCO1andMCO2)toAF0(defaultafterreset)GPIO_AF_TAMPER:ConnectTAMPERpins(TAMPER_1andTAMPER_2)toAF0(defaultafterreset)GPIO_AF_SWJ:ConnectSWJpins(SWDandJTAG)toAF0(defaultafterreset)GPIO_AF_TRACE:ConnectTRACEpinstoAF0(defaultafterreset)GPIO_AF_TIM1:ConnectTIM1pinstoAF1GPIO_AF_TIM2:ConnectTIM2pinstoAF1GPIO_AF_TIM3:ConnectTIM3pinstoAF2GPIO_AF_TIM4:ConnectTIM4pinstoAF2GPIO_AF_TIM5:ConnectTIM5pinstoAF2GPIO_AF_TIM8:ConnectTIM8pinstoAF3GPIO_AF_TIM9:ConnectTIM9pinstoAF3GPIO_AF_TIM10:ConnectTIM10pinstoAF3GPIO_AF_TIM11:ConnectTIM11pinstoAF3GPIO_AF_I2C1:ConnectI2C1pinstoAF4GPIO_AF_I2C2:ConnectI2C2pinstoAF4GPIO_AF_I2C3:ConnectI2C3pinstoAF4GPIO_AF_SPI1:ConnectSPI1pinstoAF5GPIO_AF_SPI2:ConnectSPI2/I2S2pinstoAF5GPIO_AF_SPI4:ConnectSPI4pinstoAF5GPIO_AF_SPI5:ConnectSPI5pinstoAF5GPIO_AF_SPI6:ConnectSPI6pinstoAF5GPIO_AF_SAI1:ConnectSAI1pinstoAF6forSTM32F42xxx/43xxxdevices.    GPIO_AF_SPI3:ConnectSPI3/I2S3pinstoAF6GPIO_AF_I2S3ext:ConnectI2S3extpinstoAF7GPIO_AF_USART1:ConnectUSART1pinstoAF7GPIO_AF_USART2:ConnectUSART2pinstoAF7GPIO_AF_USART3:ConnectUSART3pinstoAF7GPIO_AF_UART4:ConnectUART4pinstoAF8GPIO_AF_UART5:ConnectUART5pinstoAF8GPIO_AF_USART6:ConnectUSART6pinstoAF8GPIO_AF_UART7:ConnectUART7pinstoAF8GPIO_AF_UART8:ConnectUART8pinstoAF8GPIO_AF_CAN1:ConnectCAN1pinstoAF9GPIO_AF_CAN2:ConnectCAN2pinstoAF9GPIO_AF_TIM12:ConnectTIM12pinstoAF9GPIO_AF_TIM13:ConnectTIM13pinstoAF9GPIO_AF_TIM14:ConnectTIM14pinstoAF9GPIO_AF_OTG_FS:ConnectOTG_FSpinstoAF10GPIO_AF_OTG_HS:ConnectOTG_HSpinstoAF10GPIO_AF_ETH:ConnectETHERNETpinstoAF11GPIO_AF_FSMC:ConnectFSMCpinstoAF12GPIO_AF_FMC:ConnectFMCpinstoAF12forSTM32F42xxx/43xxxdevices.  GPIO_AF_OTG_HS_FS:ConnectOTGHS(configuredinFS)pinstoAF12GPIO_AF_SDIO:ConnectSDIOpinstoAF12GPIO_AF_DCMI:ConnectDCMIpinstoAF13GPIO_AF_LTDC:ConnectLTDCpinstoAF14forSTM32F429xx/439xxdevices.GPIO_AF_EVENTOUT:ConnectEVENTOUTpinstoAF15
代碼示例:
示例一:把gpioa6配置成輸出管腳,并配置成高電平
         GPIO_InitTypeDefGPIO_InitStruct;
         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
         GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6;
         GPIO_InitStruct.GPIO_Mode= GPIO_Mode_OUT;
         GPIO_InitStruct.GPIO_PuPd= GPIO_PuPd_UP;

         GPIO_Init(GPIOA,&GPIO_InitStruct);

         GPIO_SetBits(GPIOA,GPIO_Pin_6);

示例二:把gpioe4配置成輸入
         GPIO_InitTypeDefGPIO_InitStruct;
         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
         GPIO_InitStruct.GPIO_Pin= GPIO_Pin_4;
         GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN;
         GPIO_InitStruct.GPIO_PuPd= GPIO_PuPd_UP;
         GPIO_Init(GPIOE,&GPIO_InitStruct);

示例三:配置復用功能 PA9 PA10 配置成串口1的收發接口
GPIO_InitTypeDef GPIO_InitStructure;
         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA時鐘
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1時鐘
         //串口1對應引腳復用映射
         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//GPIOA9復用為USART1
         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//GPIOA10復用為USART1
         //USART1端口配置
         GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9GPIOA10
         GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;//復用功能
         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;      //速度50MHz
         GPIO_InitStructure.GPIO_OType= GPIO_OType_PP; //推挽復用輸出
         GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP; //上拉
         GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA9,PA10
0
回復
2019-10-24 08:56
@lihui710884923
代碼示例:示例一:把gpioa6配置成輸出管腳,并配置成高電平      GPIO_InitTypeDefGPIO_InitStruct;      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);      GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;      GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;      GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;      GPIO_Init(GPIOA,&GPIO_InitStruct);      GPIO_SetBits(GPIOA,GPIO_Pin_6);示例二:把gpioe4配置成輸入      GPIO_InitTypeDefGPIO_InitStruct;      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);      GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;      GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;      GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;      GPIO_Init(GPIOE,&GPIO_InitStruct);示例三:配置復用功能 PA9PA10 配置成串口1的收發接口GPIO_InitTypeDefGPIO_InitStructure;      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA時鐘      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1時鐘      //串口1對應引腳復用映射      GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//GPIOA9復用為USART1      GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//GPIOA10復用為USART1      //USART1端口配置      GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;//GPIOA9與GPIOA10      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//復用功能      GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    //速度50MHz      GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽復用輸出      GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉      GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA9,PA10

對于GPIO口的模式,來個圖形詳細講解


浮空輸入_IN_FLOATING

帶上拉輸入_IPU


帶下拉輸入_IPD

模擬輸入_AIN

開漏輸出_OUT_OD

推挽輸出_OUT_PP

開漏復用輸出_AF_OD

推挽復用輸出_AF_PP

以下是八種模式的工作原理:




0
回復
2019-10-24 09:12
@lihui710884923
對于GPIO口的模式,來個圖形詳細講解帶上拉輸入_IPU帶下拉輸入_IPD開漏輸出_OUT_OD開漏復用輸出_AF_OD以下是八種模式的工作原理:

一.GPIO浮空輸入_IN_FLOATING模式工作原理:


以上截圖就是浮空輸入模式的原理圖,圖中陰影的部分在浮空輸入模式下是處于不工作狀態的,尤其是下半部分的輸出電路,實際上這時的輸出電路與輸入的端口處于隔離狀態。

0
回復
2019-10-24 09:16
@lihui710884923
一.GPIO浮空輸入_IN_FLOATING模式工作原理:[圖片],

二.GPIO帶上拉輸入_IPU 模式工作原理:


上圖是STM32的GPIO帶上拉輸入模式的原理圖。

與前面介紹的浮空輸入模式相比,僅僅是在數據通道上面,接入了一個上拉電阻,根據STM32的數據手冊,這個上拉電阻阻值介于30K~50K 歐姆。同樣,CPU可以隨時在“輸入數據寄存器”的另一端,通過內部的數據總線讀出I/O 端口的電平變化的狀態。



0
回復
2019-10-24 09:18
@lihui710884923
二.GPIO帶上拉輸入_IPU模式工作原理:[圖片]與前面介紹的浮空輸入模式相比,僅僅是在數據通道上面,接入了一個上拉電阻,根據STM32的數據手冊,這個上拉電阻阻值介于30K~50K歐姆。同樣,CPU可以隨時在“輸入數據寄存器”的另一端,通過內部的數據總線讀出I/O端口的電平變化的狀態。

三.GPIO帶下拉輸入_IPD 模式工作原理:


對于輸入下拉模式的輸入,是在數據通道的下部,接入了一個下拉電阻。

根據STM32的數據手冊,這個下拉電阻阻值也是介于30K~50K 歐姆。

對于要加上拉或下拉電阻:

1.當作單片機作為輸入時,假設我們直接在IO端口接一個按鍵到地(或電源)。

因為按鍵按,于不按管腳都是懸空的。單片機就很難檢測按鍵是否按下。

所以人為的接一個上拉(或下拉)。以確定未按下的時候IO輸入電平的狀態

2.可以提高芯片的抗干擾能



0
回復
2019-10-24 09:23
@lihui710884923
三.GPIO帶下拉輸入_IPD模式工作原理:[圖片]根據STM32的數據手冊,這個下拉電阻阻值也是介于30K~50K歐姆。1.當作單片機作為輸入時,假設我們直接在IO端口接一個按鍵到地(或電源)。所以人為的接一個上拉(或下拉)。以確定未按下的時候IO輸入電平的狀態

四、GPIO模擬輸入_AIN 模式工作原理:


如果把STM32配置為模擬輸入模式時,工作原理就比較簡單了,信號從左邊編號為1 的端口進從右邊編號為2的一端直接進入STM32單片機的AD模塊。

細心的朋友可以看到數據通道中上拉、下拉電阻和施密特觸發器,這時均處于關斷的狀態,“輸入數據寄存器”就不能反映IO端口上的電平變化的狀態了,換句話說,也就是在模擬輸入狀態下,CPU不能通過“輸入數據寄存器”讀到IO端口變化的數據了。

以上分析的是GPIO模塊IO引腳的輸入模式的工作原理,下面介紹一下GPIO輸出模式的工作原理


0
回復
2019-10-24 09:28
@lihui710884923
四、GPIO模擬輸入_AIN模式工作原理:[圖片]細心的朋友可以看到數據通道中上拉、下拉電阻和施密特觸發器,這時均處于關斷的狀態,“輸入數據寄存器”就不能反映IO端口上的電平變化的狀態了,換句話說,也就是在模擬輸入狀態下,CPU不能通過“輸入數據寄存器”讀到IO端口變化的數據了。

五、GPIO開漏輸出_OUT_OD 模式工作原理


上圖是GPIO開漏輸出模式的工作原理圖

當CPU 在編號1 端通過“位設置/ 清除寄存器”或“輸出數據寄存器”寫入數據后

該數據位將通過編號2的輸出控制電路傳送到編號4 的I/O端口。

如果CPU 寫入的是邏輯“1 ”,則編號3 的N-MOS管將處于關閉狀態

此時I/O 端口的電平將由外部的上拉電阻決定

如果CPU 寫入的是邏輯“0 ”,則編號3的N-MOS管將處于開啟狀態

此時I/O端口的電平被編號3 的N-MOS管拉到了“地”的零電位。

在圖中的上半部,施密特觸發器處于開啟狀態

這意味著CPU 可以在“輸入數據寄存器”的另一端,隨時可以監控I/O端口的狀態

通過這個特性,還可以實現了虛擬的I/O端口雙向通信:假如CPU 輸出邏輯“1 ”

由于編號3 的N-MOS管處于關閉狀態,I/O 端口的電平將完全由外部電路決定

因此,CPU 可以在“輸入數據寄存器”讀到外部電路的信號,而不是它自己輸出的邏輯“1 ”


0
回復
2019-10-24 09:28
@lihui710884923
五、GPIO開漏輸出_OUT_OD模式工作原理[圖片]當CPU在編號1端通過“位設置/清除寄存器”或“輸出數據寄存器”寫入數據后如果CPU寫入的是邏輯“1”,則編號3的N-MOS管將處于關閉狀態如果CPU寫入的是邏輯“0”,則編號3的N-MOS管將處于開啟狀態在圖中的上半部,施密特觸發器處于開啟狀態通過這個特性,還可以實現了虛擬的I/O端口雙向通信:假如CPU輸出邏輯“1”因此,CPU可以在“輸入數據寄存器”讀到外部電路的信號,而不是它自己輸出的邏輯“1”

GPIO口的輸出模式下,有3 種輸出速度可選(2MHz 、10MHz和50MHz) 

這個速度是指GPIO口驅動電路的響應速度,而不是輸出信號的速度

輸出信號的速度與程序有關(芯片內部在I/O口的輸出部分安排了多個響應速度不同的輸出驅動電路用戶可以根據自己的需要選擇合適的驅動電路)。

通過選擇速度來選擇不同的輸出驅動模塊,達到最佳的噪聲控制和降低功耗的目的。

高頻的驅動電路,噪聲很高  

當我們的項目不需要比較高的輸出頻率時,請選用低頻驅動電路,這樣非常有利于提高系統的EMI 性能。

當然如果我們的項目要求輸出較高頻率的信號,但卻選用了較低頻率的驅動模塊,很可能會得到比較失真的輸出信號

0
回復
2019-10-24 09:33
@lihui710884923
這個速度是指GPIO口驅動電路的響應速度,而不是輸出信號的速度通過選擇速度來選擇不同的輸出驅動模塊,達到最佳的噪聲控制和降低功耗的目的。當我們的項目不需要比較高的輸出頻率時,請選用低頻驅動電路,這樣非常有利于提高系統的EMI性能。

六、GPIO推挽輸出_OUT_PP模式工作原理


GPIO的推挽輸出模式是在開漏輸出模式的基礎上,在“輸出控制電路”之后,增加了一個P-MOS管

當CPU輸出邏輯“1 ”時,編號3 處的P-MOS管導通,而下方的N-MOS管截止,達到輸出高電平的目的

當CPU輸出邏輯“0 ”時,編號3 處的P-MOS管截止,而下方的N-MOS管導通,達到輸出低電平的目的

在這個模式下,CPU 仍然可以從“輸入數據寄存器”讀到該IO端口電壓變化的信號


0
回復
2019-10-24 09:36
@lihui710884923
六、GPIO推挽輸出_OUT_PP模式工作原理[圖片]當CPU輸出邏輯“1”時,編號3處的P-MOS管導通,而下方的N-MOS管截止,達到輸出高電平的目的在這個模式下,CPU仍然可以從“輸入數據寄存器”讀到該IO端口電壓變化的信號

七、GPIO開漏復用輸出_AF_OD模式工作原理


GPIO的開漏復用輸出模式與開漏輸出模式的工作原理基本相同

不同的是編號為2 的輸入的源不同,它是和復用功能的輸出端相連

此時的“輸出數據寄存器”被輸出通道給斷開了。

從上面的這個圖,我們還可以看到CPU同樣可以從“輸入數據寄存器”讀取到外部IO端口變化的電平信號。


0
回復
2019-10-24 09:38
@lihui710884923
七、GPIO開漏復用輸出_AF_OD模式工作原理[圖片]不同的是編號為2的輸入的源不同,它是和復用功能的輸出端相連從上面的這個圖,我們還可以看到CPU同樣可以從“輸入數據寄存器”讀取到外部IO端口變化的電平信號。

八、GPIO推挽復用輸出_AF_PP模式工作原理


最后介紹一下GPIO推挽復用輸出模式的工作原理

編號2“輸出控制電路” 輸入是與復用功能的輸出端相連

此時“輸出數據寄存器”被從輸出通道斷開了,片上外設的輸出信號直接與“輸出控制電路”的輸入端想連接。

我們將GPIO配置成復用輸出功能后,假如相應的外設模塊沒有被激活,那么此時IO端口的輸出將不確定。

其它部分原理與前面敘述的模式一樣,包括對“輸入數據寄存器”的讀取方式也是一樣的。


0
回復
2019-10-24 09:40
@lihui710884923
八、GPIO推挽復用輸出_AF_PP模式工作原理[圖片]編號2“輸出控制電路”輸入是與復用功能的輸出端相連我們將GPIO配置成復用輸出功能后,假如相應的外設模塊沒有被激活,那么此時IO端口的輸出將不確定。

4輸入 + 2 輸出 + 2 復用輸出,一共是8種模式

圖形結合文字講解完畢,希望對于stm32單片機新手學習有所幫助

0
回復
2019-11-30 14:41
@lihui710884923
圖形結合文字講解完畢,希望對于stm32單片機新手學習有所幫助
stm32的GPIO講的很透徹
0
回復
2019-12-07 20:46
@liuxiaofei126
stm32的GPIO講的很透徹
主要就是對GPIO口的總結
0
回復
2020-07-23 10:32
@lihui710884923
主要就是對GPIO口的總結
這個不錯感覺,對于初學者直觀明了的介紹了其工作原理,多謝
0
回復
2020-07-24 12:30
@沃默思情
這個不錯感覺,對于初學者直觀明了的介紹了其工作原理,多謝
沒事,圖解直觀一點
0
回復
2022-03-11 11:34

對于剛入門的新手,我想這幾個概念是必須得搞清楚的,平時接觸的最多的也就是推挽輸出、開漏輸出、上拉輸入這三種,但一直未曾對這些做過歸納。因此,在這里做一個總結:

推挽輸出:可以輸出高,低電平,連接數字器件; 推挽結構一般是指兩個三極管分別受兩互補信號的控制,總是在一個三極管導通的時候另一個截止。高低電平由IC的電源低定。

推挽電路是兩個參數相同的三極管或MOSFET,以推挽方式存在于電路中,各負責正負半周的波形放大任務,電路工作時,兩只對稱的功率開關管每次只有一個導通,所以導通損耗小、效率高。輸出既可以向負載灌電流,也可以從負載抽取電流。推拉式輸出級既提高電路的負載能力,又提高開關速度。

詳細理解:



如圖所示,推挽放大器的輸出級有兩個“臂”(兩組放大元件),一個“臂”的電流增加時,另一個“臂”的電流則減小,二者的狀態輪流轉換。對負載而言,好像是一個“臂”在推,一個“臂”在拉,共同完成電流輸出任務。當輸出高電平時,也就是下級負載門輸入高電平時,輸出端的電流將是下級門從本級電源經VT3拉出。這樣一來,輸出高低電平時,VT3 一路和 VT5 一路將交替工作,從而減低了功耗,提高了每個管的承受能力。又由于不論走哪一路,管子導通電阻都很小,使RC常數很小,轉變速度很快。因此,推拉式輸出級既提高電路的負載能力,又提高開關速度。

開漏輸出:輸出端相當于三極管的集電極. 要得到高電平狀態需要上拉電阻才行. 適合于做電流型的驅動,其吸收電流的能力相對強(一般20ma以內).

開漏形式的電路有以下幾個特點:

1. 利用外部電路的驅動能力,減少IC內部的驅動。當IC內部MOSFET導通時,驅動電流是從外部的VCC流經R pull-up ,MOSFET到GND。IC內部僅需很下的柵極驅動電流。

2. 一般來說,開漏是用來連接不同電平的器件,匹配電平用的,因為開漏引腳不連接外部的上拉電阻,只能輸出低電平,如果需要同時具備輸出高電平的功能,則需要接上拉電阻,很好的一個優點是通過改變上拉電源的電壓,便可以改變傳輸電平。比如加上上拉電阻就可以提供TTL/CMOS電平輸出等。上拉電阻的阻值決定了邏輯電平轉換的沿的速度 。阻值越大,速度越低功耗越小,所以負載電阻的選擇要兼顧功耗和速度

3. OPEN-DRAIN提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時。因為上升沿是通過外接上拉無源電阻對負載充電,所以當電阻選擇小時延時就小,但功耗大;反之延時大功耗小。所以如果對延時有要求,則建議用下降沿輸出。

4. 可以將多個開漏輸出的Pin,連接到一條線上。通過一只上拉電阻,在不增加任何器件的情況下,形成與邏輯關系。這也是I2C,SMBus等總線判斷總線占用狀態的原理。補充:什么是“線與”?:

在一個結點(), 連接一個上拉電阻到電源 VCC  VDD  n  NPN  NMOS 晶體管的集電極 C 或漏極 D, 這些晶體管的發射極 E 或源極 S 都接到地線上, 只要有一個晶體管飽和, 這個結點()就被拉到地線電平上. 因為這些晶體管的基極注入電流(NPN)或柵極加上高電平(NMOS), 晶體管就會飽和, 所以這些基極或柵極對這個結點()的關系是或非 NOR 邏輯. 如果這個結點后面加一個反相器, 就是或 OR 邏輯.

其實可以簡單的理解為:在所有引腳連在一起時,外接一上拉電阻,如果有一個引腳輸出為邏輯0,相當于接地,與之并聯的回路“相當于被一根導線短路”,所以外電路邏輯電平便為0,只有都為高電平時,與的結果才為邏輯1。

關于推挽輸出和開漏輸出,最后用一幅最簡單的圖形來概括:


該圖中左邊的便是推挽輸出模式,其中比較器輸出高電平時下面的PNP三極管截止,而上面NPN三極管導通,輸出電平VS+;當比較器輸出低電平時則恰恰相反,PNP三極管導通,輸出和地相連,為低電平。右邊的則可以理解為開漏輸出形式,需要接上拉。

0
回復
主站蜘蛛池模板: 992tv国产精品福利在线 | 亚洲免费视频一区二区 | 全免费A级毛片免费看无码播放 | 99手机国产精品 | 最新永久无码AV网址亚洲 | 国产不卡一级无码视频 | 亚洲高清视频一区二区 | 91亚洲一区二区 | www.av在线免费观看 | 少妇精品亚洲一区二区成人 | 亚洲欧美精品一中文字幕 | 一区二区三区日本 | 91成人精品一区在线播放69 | 苍井空亚洲精品AA片在线播放 | 久久精品欧美一区二区三区不卡 | 日韩一级二级片 | 日韩a中文字幕 | 亚洲国产精品久久 | www久久综合 | 亚洲视频www| 无套内谢少妇毛片aaaa片免费 | 综合欧美亚洲日本 | 国产91一区二区在线观看 | 狠狠色综合欧美激情 | 91视频盛宴| 日韩在线1| 中文在线精品 | 四虎影院最新 | 在线观看毛片视频 | 扒开粉嫩的小缝喷白浆 | 我和同学人妻熟妇的激情 | 天天玩天天操天天干 | 脱了老师内裤猛烈进入在线观看 | 精品乱码卡1卡2卡3免费开放 | 最近免费中文字幕中文高清 | 精品国产不卡 | 理论片麻豆 | 免费古装a级毛片无码 | 无套内谢少妇毛片aaaa片免费 | 青青青国产在线观看免费 | 在线看福利中文字幕人妻 |