1. 程式人生 > >STM32庫函式詳解----(通用輸入/輸出GPIO)

STM32庫函式詳解----(通用輸入/輸出GPIO)

初始化和配置相關函式

1.void  GPIO_DeInit  (GPIO_TypeDef* GPIOx)

函式解釋:gpio的反初始化函式,該函式的作用是把GPIO相關的暫存器配置成上電覆位後的預設狀態,在第一次初始化前或者不在使用某一介面後,可以呼叫該函式。

引數GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

 

2.void  GPIO_Init  (GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)

函式解釋:GPIO的初始化函式,該函式的作用是對io進行初始化。

引數:(1)GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

            (2)GPIO_InitStruct,GPIO的初始化相關結構體。該結構體裡的成員變數決定了我們具體的初始化引數。以下進行說明:

              GPIO_Pin:指定具體的io腳,如GPIO_Pin_0,GPIO_Pin_1這樣的巨集定義。

              GPIO_Mode

:指定GPIO的模式,有四種模式:

  GPIO_Mode_IN(輸入), GPIO_Mode_OUT(輸出), GPIO_Mode_AF(第二功能), GPIO_Mode_AN(模擬)

              GPIO_Speed:指定IO最快翻轉速度,也就是當使用IO產生頻率(如PWM)的最大速度。有四種模式:

 GPIO_Low_Speed(低速), GPIO_Medium_Speed(中等速度), GPIO_Fast_Speed(快速), GPIO_High_Speed(低速)

               GPIO_OType:指定選擇管腳的輸出型別,有以下兩種配置:

GPIO_OType_PP(推輓方式輸出),GPIO_OType_OD(開漏方式輸出)

溫馨提示

推輓輸出:推輓輸出就是微控制器引腳可以直接輸出高電平電壓。低電平時接地,高電平時輸出微控制器電源電壓。這種方式可以不接上拉電阻。但如果輸出端可能會接地的話,這個時候輸出高電平可能引發微控制器執行不穩定,甚至可能燒壞引腳。推輓方式的驅動力更大。

開漏輸出:開漏輸出就是不輸出電壓,低電平時接地,高電平時不接地。如果外接上拉電阻,則在輸出高電平時,電壓會拉到上拉電阻的電源電壓。這種方式適合在連線的外設電壓比微控制器低的時候。

               GPIO_PuPd:指定選擇管腳的上拉和下拉模式。有三種配置:

GPIO_PuPd_NOPULL(不上拉也不下拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)

溫馨提示

這些都是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。在下一次復位前,被鎖定的管腳不能被修改。

引數:(1)GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

            (2)  GPIO_Pin:指定具體的io腳,如GPIO_Pin_0,GPIO_Pin_1這樣的巨集定義。

 

 

GPIO的讀寫函式

1.uint8_t  GPIO_ReadInputDataBit  (GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin)

函式解釋:讀取io輸入管腳的值

引數:(1)GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

            (2)  GPIO_Pin:指定具體的io腳,如GPIO_Pin_0,GPIO_Pin_1這樣的巨集定義。

返回值:輸入管腳的值 Bit_SET(高電平),Bit_RESET(低電平)

 

2.uint16_t  GPIO_ReadInputData (GPIO_TypeDef* GPIOx )

函式解釋:讀取輸入io資料,該函式用於讀取一個io分組的所有資料

引數GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

返回值:一個io埠的所有資料(輸入狀態)

 

3.uint8_t  GPIO_ReadOutputDataBit  (GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin)

函式解釋:讀取io輸出管腳的值

引數:(1)GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

            (2)  GPIO_Pin:指定具體的io腳,如GPIO_Pin_0,GPIO_Pin_1這樣的巨集定義。

返回值:輸出管腳的值 Bit_SET(高電平),Bit_RESET(低電平)

 

4.uint16_t  GPIO_ReadOutputData (GPIO_TypeDef* GPIOx )

函式解釋:讀取輸出io資料,該函式用於讀取一個io分組的所有資料

引數GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

返回值:一個io埠的所有資料(輸出狀態)

 

5.void  GPIO_SetBits(GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin)

函式解釋:對io管腳進行置位(輸出高電平)。這個函式使用GPIOx_BSRR暫存器來實現原子讀或者修改操作。在這種情況下,在讀和修改訪問時發生一個IRQ中斷是沒有危險的。

引數:(1)GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

            (2)  GPIO_Pin:指定具體的io腳,如GPIO_Pin_0,GPIO_Pin_1這樣的巨集定義。

 

6.void  GPIO_ResetBits(GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin)

函式解釋:對io管腳進行復位(輸出低電平)。這個函式使用GPIOx_BSRR暫存器來實現原子讀或者修改操作。在這種情況下,在讀和修改訪問時發生一個IRQ中斷是沒有危險的。

引數:(1)GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

            (2)  GPIO_Pin:指定具體的io腳,如GPIO_Pin_0,GPIO_Pin_1這樣的巨集定義。

 

7.void  GPIO_WriteBit(GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin,BitActionBitVal)

函式解釋:對某一位進行寫入操作。

引數:(1)GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

            (2)GPIO_Pin:指定具體的io腳,如GPIO_Pin_0,GPIO_Pin_1這樣的巨集定義。

            (3)BitVal:寫入高電平或者低電平(Bit_RESET:寫入低電平 Bit_SET:寫入高電平)

 

8.void  GPIO_Write(GPIO_TypeDef* GPIOx,uint16_t  PortVal)

函式解釋:對GPIO埠進行寫入操作,適用於對統一埠的多個管腳的寫入。

引數:(1)GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

            (2)BitVal:寫入高電平或者低電平(Bit_RESET:寫入低電平 Bit_SET:寫入高電平)

 

9.void  GPIO_ToggleBits(GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin)

函式解釋:翻轉指定的GPIO口,如果當前io是高電平,則變為低電平。如果當前io是低電平,則變為高電平。

引數:(1)GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

            (2)GPIO_Pin:指定具體的io腳,如GPIO_Pin_0,GPIO_Pin_1這樣的巨集定義。

 

GPIO複用功能配置函式

1.void  GPIO_PinAFConfig(GPIO_TypeDef* GPIOx,uint16_t  GPIO_PinSource,uint8_t  GPIO_AF)

函式解釋:改變指定管腳的對映關係,即配置指定管腳的複用功能。

引數:(1)GPIOx,GPIO的分組,如 GPIOA,GPIOB,GPIOC等的巨集定義。

            (2)GPIO_PinSource,具體要配置成複用功能的管腳(如GPIO_Pin_0,GPIO_Pin_1這樣的巨集定義)。

            (3)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

 

程式碼示例

示例一:把GPIO6配置成輸出管腳,並置高電平。

         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; //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