本庫函數(shù)庫供檢閱 與天津第四項目部 如有錯誤純屬正常 宏定義結(jié)構(gòu)體: typedef struct { vu32 CRL; 端口配置低寄存器 vu32 CRH; 端口配置高寄存器 vu32 IDR; 端口輸入數(shù)據(jù)寄存器 vu32 ODR; 端口輸出數(shù)據(jù)寄存器 vu32 BSRR; 端口位設(shè)置/復(fù)位寄存器 vu32 BRR; 端口位復(fù)位寄存器 vu32 LCKR; 端口配置鎖定寄存器 } GPIO_TypeDef; 說明GPIO的寄存器的宏定義結(jié)構(gòu)體 typedef struct { vu32 EVCR; 事件控制寄存器 vu32 MAPR; 復(fù)用重映射和調(diào)試I/O配置寄存器 vu32 EXTICR[4]; 外部中斷線路0-15配置寄存器 } AFIO_TypeDef; 定義復(fù)用AFIO端口配置寄存器宏定義結(jié)構(gòu)體 #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) 定義物理寄存器的儲存組織地址 這個下面的就是結(jié)構(gòu)指針, #ifndef DEBUG GPIO 121/368 譯文英文原版為 UM0427 Oct. 2007 Rev 2, 譯文僅供參考,與英文版沖突的,以英文版為準(zhǔn) .. . #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的庫函數(shù)目錄 函數(shù)介紹: 1. GPIO_DeInit(GPIOA); 將外設(shè)GPIOx寄存器重設(shè)為缺省值 2. GPIO_AFIODeInit();將復(fù)用功能(重映射事件控制和EXTI設(shè)置)重設(shè)為缺省值 3. typedef struct { u16 GPIO_Pin;//管教寄存器 GPIOSpeed_TypeDef GPIO_Speed;//管教速度寄存器 GPIOMode_TypeDef GPIO_Mode;//管教模式寄存器 } GPIO_InitTypeDef;//這個宏結(jié)構(gòu)定義并非函數(shù),而是他的寄存器的封裝,要用它去定義變量,系統(tǒng)在這里編譯時并不分配內(nèi)存 GPIO_Pin 該參數(shù)選擇待設(shè)置的GPIO管腳,使用操作符“|”可以一次選中多個管腳?梢允褂孟卤碇械娜我饨M合。 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用以設(shè)置選中管腳的速率 GPIO_Speed_10MHz 最高輸出速率10MHz GPIO_Speed_2MHz 最高輸出速率2MHz GPIO_Speed_50MHz 最高輸出速率50MHz GPIO_Mode GPIO_Mode用以設(shè)置選中管腳的工作狀態(tài) 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 復(fù)用開漏輸出 GPIO_Mode_AF_PP 復(fù)用推挽輸出 注意: 􀂄 當(dāng)某管腳設(shè)置為上拉或者下拉輸入模式,使用寄存器Px_BSRR和PxBRR 􀂄 GPIO_Mode允許同時設(shè)置GPIO方向(輸入/輸出)和對應(yīng)的輸入/輸出設(shè)置,:位[7:4]對應(yīng)GPIO方向,位[4:0]對應(yīng)配置。 GPIO方向有如下索引 - GPIO輸入模式 = 0x00 - GPIO輸出模式 = 0x01 給出了所有GPIO_Mode的索引和編碼 例子: GPIO_InitTypeDef GPIO_InitStructure;//定義一個GPIO_InitTypeDef結(jié)構(gòu)變量GPIO_InitStructure 這里注意宏結(jié)構(gòu)和結(jié)構(gòu)變量的區(qū)別 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);//這個函數(shù)才是最后的執(zhí)行函數(shù)最重要以上是設(shè)置 原型: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 可以看出定義了兩個指針參數(shù):GPIO_TypeDef* GPIOx和GPIO_InitTypeDef* GPIO_InitStruct 第一個表示定義一個GPIO_TypeDef型結(jié)構(gòu)指針變量GPIOx他可傳遞一下參數(shù): CRL 端口配置低寄存器 CRH 端口配置高寄存器 IDR 端口輸入數(shù)據(jù)寄存器 ODR 端口輸出數(shù)據(jù)寄存器 BSRR 端口位設(shè)置/復(fù)位寄存器 BRR 端口位復(fù)位寄存器 LCKR 端口配置鎖定寄存器 可以這樣訪問參數(shù):GPIOx-> IDR=0x多少多少;因為他是指針 第二個表示定義一個GPIO_InitTypeDef型結(jié)構(gòu)指針變量GPIO_InitStruct他可傳遞一下參數(shù): GPIO_Pin;//管教寄存器 GPIOSpeed_TypeDef GPIO_Speed;//管教速度寄存器 GPIOMode_TypeDef GPIO_Mode;//管教模式寄存器 可以這樣訪問參數(shù):GPIO_InitStruct-> GPIO_Pin =0X多少多少;因為他是指針 注意:兩個都是指針固然不假但是比較后發(fā)現(xiàn)問題: GPIO_Init(GPIOA, &GPIO_InitStructure); void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 前者沒有&后者有&,然后回頭看定義會發(fā)現(xiàn)GPIOX是已經(jīng)定義了的地址 #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 */ 所以它本身就是一個指向物理寄存器地址的指針,并且被賦予首地址,現(xiàn)在又定義了一個指針參量相當(dāng)于把它的值賦給后者表示為: 例如:GPIO_TypeDef* GPIOA=((GPIO_TypeDef *) GPIOA_BASE) 第二個不同了在定義中未發(fā)現(xiàn)他的地址定義,而且他還是個結(jié)構(gòu)類型 GPIO_InitTypeDef* GPIO_InitStruct,只是定義了一個GPIO_InitTypeDe型結(jié)構(gòu)指針變量GPIO_InitStruct,而前面有個GPIO_InitTypeDe變量跟他同名是為了可讀性,如果不加&顯然是不對的&表示取出變量GPIO_InitStruct的地址所給指針變量GPIO_InitStruct以指向他的首地址。有點繞,但是就是一個指針的賦值問題。 4. GPIO_InitTypeDef GPIO_InitStructure;變量說明 GPIO_StructInit(&GPIO_InitStructure);//函數(shù)把GPIO_InitStruct中的每一個參數(shù)按缺省值填入 缺省值 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); 設(shè)置指定的數(shù)據(jù)端口位 10GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15); 清除指定的數(shù)據(jù)端口位 11GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); 設(shè)置或者清除指定的數(shù)據(jù)端口位 GPIOx:x可以是A,B,C,D或者E,來選擇GPIO外設(shè) GPIO_Pin:待設(shè)置或者清除指的端口位該參數(shù)可以取GPIO_Pin_x(x可以是0-15)的任意組合 BitVal: 該參數(shù)指定了待寫入的值該參數(shù)必須取枚舉BitAction的其中一個值 Bit_RESET: 清除數(shù)據(jù)端口位 Bit_SET: 設(shè)置數(shù)據(jù)端口位 12GPIO_Write(GPIOA, 0x1101); 向指定GPIO數(shù)據(jù)端口寫入數(shù)據(jù) 13GPIO_PinLockConfig(GPIOA, GPIO_Pin_0 | GPIO_Pin_1); 鎖定GPIO管腳設(shè)置寄存器 14GPIO_EventOutputConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5); 選擇GPIO管腳用作事件輸出 GPIO_PortSourceGPIOE選擇GPIOE GPIO_PinSource5事件輸出的管腳5 15.GPIO_EventOutputConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6); GPIO_EventOutputCmd(ENABLE); 使能或者失能事件輸出 事件輸出的新狀態(tài) 這個參數(shù)可以取:ENABLE或者DISABLE 16. 例: /* I2C1_SCL on PB.08, I2C1_SDA on PB.09 */ GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); 改變指定管腳的映 GPIO_Remap_SPI1 SPI1復(fù)用功能映射 GPIO_Remap_I2C1 I2C1復(fù)用功能映射 GPIO_Remap_USART1 USART1復(fù)用功能映射 GPIO_PartialRemap_USART3 USART2復(fù)用功能映射 GPIO_FullRemap_USART3 USART3復(fù)用功能完全映射 GPIO_PartialRemap_TIM1 USART3復(fù)用功能部分映射 GPIO_FullRemap_TIM1 TIM1復(fù)用功能完全映射 GPIO_PartialRemap1_TIM2 TIM2復(fù)用功能部分映射1 GPIO_PartialRemap2_TIM2 TIM2復(fù)用功能部分映射2 GPIO_FullRemap_TIM2 TIM2復(fù)用功能完全映射 GPIO_PartialRemap_TIM3 TIM3復(fù)用功能部分映射 GPIO_FullRemap_TIM3 TIM3復(fù)用功能完全映射 GPIO_Remap_TIM4 TIM4復(fù)用功能映射 GPIO_Remap1_CAN CAN復(fù)用功能映射1 GPIO_Remap2_CAN CAN復(fù)用功能映射2 GPIO_Remap_PD01 PD01復(fù)用功能映射 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管腳用作外部中斷線路
|