本庫函數庫供檢閱 與天津第四項目部 如有錯誤純屬正常 宏定義結構體: typedef struct { vu32 CRL; 端口配置低寄存器 vu32 CRH; 端口配置高寄存器 vu32 IDR; 端口輸入數據寄存器 vu32 ODR; 端口輸出數據寄存器 vu32 BSRR; 端口位設置/復位寄存器 vu32 BRR; 端口位復位寄存器 vu32 LCKR; 端口配置鎖定寄存器 } GPIO_TypeDef; 說明GPIO的寄存器的宏定義結構體 typedef struct { vu32 EVCR; 事件控制寄存器 vu32 MAPR; 復用重映射和調試I/O配置寄存器 vu32 EXTICR[4]; 外部中斷線路0-15配置寄存器 } AFIO_TypeDef; 定義復用AFIO端口配置寄存器宏定義結構體 #define PERIPH_BASE ((u32)0x40000000) #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) ... #define AFIO_BASE (APB2PERIPH_BASE + 0x0000) #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) #define GPIOE_ BASE (APB2PERIPH_BASE + 0x1800) 定義物理寄存器的儲存組織地址 這個下面的就是結構指針, #ifndef DEBUG GPIO 121/368 譯文英文原版為 UM0427 Oct. 2007 Rev 2, 譯文僅供參考,與英文版沖突的,以英文版為準 .. . #ifdef _AFIO #define AFIO ((AFIO_TypeDef *) AFIO_BASE) #endif /*_AFIO */ #ifdef _GPIOA #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) #endif /*_GPIOA */ #ifdef _GPIOB #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) #endif /*_GPIOB */ #ifdef _GPIOC #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) #endif /*_GPIOC */ #ifdef _GPIOD #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) #endif /*_GPIOD */ #ifdef _GPIOE #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) #endif /*_GPIOE */ .. .GPIO的庫函數目錄 函數介紹: 1. GPIO_DeInit(GPIOA); 將外設GPIOx寄存器重設為缺省值 2. GPIO_AFIODeInit();將復用功能(重映射事件控制和EXTI設置)重設為缺省值 3. typedef struct { u16 GPIO_Pin;//管教寄存器 GPIOSpeed_TypeDef GPIO_Speed;//管教速度寄存器 GPIOMode_TypeDef GPIO_Mode;//管教模式寄存器 } GPIO_InitTypeDef;//這個宏結構定義并非函數,而是他的寄存器的封裝,要用它去定義變量,系統在這里編譯時并不分配內存 GPIO_Pin 該參數選擇待設置的GPIO管腳,使用操作符“|”可以一次選中多個管腳。可以使用下表中的任意組合。 GPIO_Pin_None 無管腳被選中 GPIO_Pin_0 選中管腳0 GPIO_Pin_1 選中管腳1 GPIO_Pin_2 選中管腳2 GPIO_Pin_3 選中管腳3 GPIO_Pin_4 選中管腳4 GPIO_Pin_5 選中管腳5 GPIO_Pin_6 選中管腳6 GPIO_Pin_7 選中管腳7 GPIO_Pin_8 選中管腳8 GPIO_Pin_9 選中管腳9 GPIO_Pin_10 選中管腳10 GPIO_Pin_11 選中管腳11 GPIO_Pin_12 選中管腳12 GPIO_Pin_13 選中管腳13 GPIO_Pin_14 選中管腳14 GPIO_Pin_15 選中管腳15 GPIO_Pin_All 選中全部管腳 GPIO_Speed GPIO_Speed用以設置選中管腳的速率 GPIO_Speed_10MHz 最高輸出速率10MHz GPIO_Speed_2MHz 最高輸出速率2MHz GPIO_Speed_50MHz 最高輸出速率50MHz GPIO_Mode GPIO_Mode用以設置選中管腳的工作狀態 GPIO_Mode_AIN 模擬輸入 GPIO_Mode_IN_FLOATING 浮空輸入 GPIO_Mode_IPD 下拉輸入 GPIO_Mode_IPU 上拉輸入 GPIO_Mode_Out_OD 開漏輸出 GPIO_Mode_Out_PP 推挽輸出 GPIO_Mode_AF_OD 復用開漏輸出 GPIO_Mode_AF_PP 復用推挽輸出 注意: 􀂄 當某管腳設置為上拉或者下拉輸入模式,使用寄存器Px_BSRR和PxBRR 􀂄 GPIO_Mode允許同時設置GPIO方向(輸入/輸出)和對應的輸入/輸出設置,:位[7:4]對應GPIO方向,位[4:0]對應配置。 GPIO方向有如下索引 - GPIO輸入模式 = 0x00 - GPIO輸出模式 = 0x01 給出了所有GPIO_Mode的索引和編碼 例子: GPIO_InitTypeDef GPIO_InitStructure;//定義一個GPIO_InitTypeDef結構變量GPIO_InitStructure 這里注意宏結構和結構變量的區別 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; 引腳選擇全部 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;速度選擇最高輸出速率10MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 浮空輸入 GPIO_Init(GPIOA, &GPIO_InitStructure);//這個函數才是最后的執行函數最重要以上是設置 原型: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 可以看出定義了兩個指針參數:GPIO_TypeDef* GPIOx和GPIO_InitTypeDef* GPIO_InitStruct 第一個表示定義一個GPIO_TypeDef型結構指針變量GPIOx他可傳遞一下參數: CRL 端口配置低寄存器 CRH 端口配置高寄存器 IDR 端口輸入數據寄存器 ODR 端口輸出數據寄存器 BSRR 端口位設置/復位寄存器 BRR 端口位復位寄存器 LCKR 端口配置鎖定寄存器 可以這樣訪問參數:GPIOx-> IDR=0x多少多少;因為他是指針 第二個表示定義一個GPIO_InitTypeDef型結構指針變量GPIO_InitStruct他可傳遞一下參數: GPIO_Pin;//管教寄存器 GPIOSpeed_TypeDef GPIO_Speed;//管教速度寄存器 GPIOMode_TypeDef GPIO_Mode;//管教模式寄存器 可以這樣訪問參數:GPIO_InitStruct-> GPIO_Pin =0X多少多少;因為他是指針 注意:兩個都是指針固然不假但是比較后發現問題: GPIO_Init(GPIOA, &GPIO_InitStructure); void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 前者沒有&后者有&,然后回頭看定義會發現GPIOX是已經定義了的地址 #ifdef _AFIO #define AFIO ((AFIO_TypeDef *) AFIO_BASE) #endif /*_AFIO */ #ifdef _GPIOA #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) #endif /*_GPIOA */ #ifdef _GPIOB #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) #endif /*_GPIOB */ #ifdef _GPIOC #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) #endif /*_GPIOC */ #ifdef _GPIOD #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) #endif /*_GPIOD */ #ifdef _GPIOE #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) #endif /*_GPIOE */ 所以它本身就是一個指向物理寄存器地址的指針,并且被賦予首地址,現在又定義了一個指針參量相當于把它的值賦給后者表示為: 例如:GPIO_TypeDef* GPIOA=((GPIO_TypeDef *) GPIOA_BASE) 第二個不同了在定義中未發現他的地址定義,而且他還是個結構類型 GPIO_InitTypeDef* GPIO_InitStruct,只是定義了一個GPIO_InitTypeDe型結構指針變量GPIO_InitStruct,而前面有個GPIO_InitTypeDe變量跟他同名是為了可讀性,如果不加&顯然是不對的&表示取出變量GPIO_InitStruct的地址所給指針變量GPIO_InitStruct以指向他的首地址。有點繞,但是就是一個指針的賦值問題。 4. GPIO_InitTypeDef GPIO_InitStructure;變量說明 GPIO_StructInit(&GPIO_InitStructure);//函數把GPIO_InitStruct中的每一個參數按缺省值填入 缺省值 GPIO_Pin GPIO_Pin_All GPIO_Speed GPIO_Speed_2MHz GPIO_Mode GPIO_Mode_IN_FLOATING 5.u8 ReadValue; 變量說明 ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7); 讀取指定端口管腳的輸入 6.u16 ReadValue; ReadValue = GPIO_ReadInputData(GPIOC); 讀取指定的GPIO端口輸入 7. u8 ReadValue; ReadValue = GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_7); 讀取指定端口管腳的輸出 8. u16 ReadValue; ReadValue = GPIO_ReadOutputData(GPIOC); 讀取指定的GPIO端口輸出 9GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15); 設置指定的數據端口位 10GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15); 清除指定的數據端口位 11GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); 設置或者清除指定的數據端口位 GPIOx:x可以是A,B,C,D或者E,來選擇GPIO外設 GPIO_Pin:待設置或者清除指的端口位該參數可以取GPIO_Pin_x(x可以是0-15)的任意組合 BitVal: 該參數指定了待寫入的值該參數必須取枚舉BitAction的其中一個值 Bit_RESET: 清除數據端口位 Bit_SET: 設置數據端口位 12GPIO_Write(GPIOA, 0x1101); 向指定GPIO數據端口寫入數據 13GPIO_PinLockConfig(GPIOA, GPIO_Pin_0 | GPIO_Pin_1); 鎖定GPIO管腳設置寄存器 14GPIO_EventOutputConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5); 選擇GPIO管腳用作事件輸出 GPIO_PortSourceGPIOE選擇GPIOE GPIO_PinSource5事件輸出的管腳5 15.GPIO_EventOutputConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6); GPIO_EventOutputCmd(ENABLE); 使能或者失能事件輸出 事件輸出的新狀態 這個參數可以取:ENABLE或者DISABLE 16. 例: /* I2C1_SCL on PB.08, I2C1_SDA on PB.09 */ GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); 改變指定管腳的映 GPIO_Remap_SPI1 SPI1復用功能映射 GPIO_Remap_I2C1 I2C1復用功能映射 GPIO_Remap_USART1 USART1復用功能映射 GPIO_PartialRemap_USART3 USART2復用功能映射 GPIO_FullRemap_USART3 USART3復用功能完全映射 GPIO_PartialRemap_TIM1 USART3復用功能部分映射 GPIO_FullRemap_TIM1 TIM1復用功能完全映射 GPIO_PartialRemap1_TIM2 TIM2復用功能部分映射1 GPIO_PartialRemap2_TIM2 TIM2復用功能部分映射2 GPIO_FullRemap_TIM2 TIM2復用功能完全映射 GPIO_PartialRemap_TIM3 TIM3復用功能部分映射 GPIO_FullRemap_TIM3 TIM3復用功能完全映射 GPIO_Remap_TIM4 TIM4復用功能映射 GPIO_Remap1_CAN CAN復用功能映射1 GPIO_Remap2_CAN CAN復用功能映射2 GPIO_Remap_PD01 PD01復用功能映射 GPIO_Remap_SWJ_NoJTRST 除JTRST外SWJ完全使能(JTAG+SW-DP) GPIO_Remap_SWJ_JTAGDisable JTAG-DP失能 + SW-DP使能 GPIO_Remap_SWJ_Disable SWJ完全失能(JTAG+SW-DP) 17. GPIO_EXTILineConfig(GPIO_PortSource_GPIOB, GPIO_PinSource8); 選擇GPIO管腳用作外部中斷線路
|