本库函数库供检阅 与天津第四项目部 如有错误纯属正常 宏定义结构体: 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管脚用作外部中断线路
|