1、STM32F10xGPIO10.1 GPIO寄存器结构 .120 10.2 GPIO库函数 .122 No函数名描述1GPIO_DeInit将外设GPIOx寄存器重设为缺省值2GPIO_AFIODeInit将复用功能(重映射事件控制和EXTI设置)重设为缺省值3GPIO_Init根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器4GPIO_StructInit把GPIO_InitStruct中的每一个参数按缺省值填入5GPIO_ReadInputDataBit读取指定端口管脚的输入6GPIO_ReadInputData读取指定的GPIO端口输入7GPIO_ReadOutp
2、utDataBit读取指定端口管脚的输出8GPIO_ReadOutputData读取指定的GPIO端口输出9GPIO_SetBits设置指定的数据端口位10GPIO_ResetBits清除指定的数据端口位11GPIO_WriteBit设置或者清除指定的数据端口位12GPIO_Write向指定GPIO数据端口写入数据13GPIO_PinLockConfig锁定GPIO管脚设置寄存器14GPIO_EventOutputConfig选择GPIO管脚用作事件输出15GPIO_EventOutputCmd使能或者失能事件输出16GPIO_PinRemapConfig改变指定管脚的映射17GPIO_EXT
3、ILineConfig选择GPIO管脚用作外部中断线路10 通用输入/输出(GPIO) GPIO 驱动可以用作多个用途,包括管脚设置,单位设置/重置,锁定机制,从端口管脚读入或者向端口管脚写入数据。Section 10.1 GPIO寄存器结构描述了固件函数库所使用的数据结构,Section 10.2 固件库函数介绍了函数库里的所有函数。 10.1 GPIO寄存器结构GPIO 寄存器结构,GPIO_TypeDef 和 AFIO_TypeDef ,在文件“stm3210x_map.h 中定义如下: typedef struct vu32 CRL; vu32 CRH; vu32 IDR; vu32
4、ODR; vu32 BSRR; vu32 BRR; vu32 LCKR; GPIO_TypeDef;typedef struct vu32 EVCR; vu32 MAPR; vu32 EXTICR4; AFIO_TypeDef;Table 178.例举了GPIO 所有寄存器 Table 178. GPIO 寄存器 寄存器描述CRL端口配置低寄存器CRH端口配置高寄存器IDR端口输入数据寄存器ODR端口输出数据寄存器BSRR端口位设置/复位寄存器BRR端口位复位寄存器LCKR端口配置锁定寄存器EVCR事件控制寄存器MAPR复用重映射和调试I/O配置寄存器EXTICR外部中断线路0-15配置寄存器
5、五个 GPIO 外设声明于文件:. #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 (A
6、PB2PERIPH_BASE + 0x0C00) #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) #ifndef DEBUG. #ifdef _AFIO #define AFIO (AFIO_TypeDef *) AFIO_BASE) #endif /*_AFIO */ #ifdef _GPIOA #define GPIOA (GPIO_TypeDef *) GPIOA
7、_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 *) G
8、PIOE_BASE) #endif /*_GPIOE */ . #else /* DEBUG */ . #ifdef _AFIO EXT AFIO_TypeDef *AFIO; #endif /*_AFIO */ #ifdef _GPIOA EXT GPIO_TypeDef *GPIOA; #endif /*_GPIOA */ #ifdef _GPIOB EXT GPIO_TypeDef *GPIOB; #endif /*_GPIOB */ #ifdef _GPIOC EXT GPIO_TypeDef *GPIOC; #endif /*_GPIOC */ #ifdef _GPIOD EXT G
9、PIO_TypeDef *GPIOD; #endif /*_GPIOD */ #ifdef _GPIOE EXT GPIO_TypeDef *GPIOE; #endif /*_GPIOE */ . #endif使用 Debug 模式时,初始化指针AFIO, GPIOA, GPIOB, GPIOC, GPIOD 和 GPIOE 于文件: #ifdef _GPIOA GPIOA = (GPIO_TypeDef *) GPIOA_BASE; #endif /*_GPIOA */ #ifdef _GPIOB GPIOB = (GPIO_TypeDef *) GPIOB_BASE; #endif /*_
10、GPIOB */ #ifdef _GPIOC GPIOC = (GPIO_TypeDef *) GPIOC_BASE; #endif /*_GPIOC */ #ifdef _GPIOD GPIOD = (GPIO_TypeDef *) GPIOD_BASE; #endif /*_GPIOD */ #ifdef _GPIOE GPIOE = (GPIO_TypeDef *) GPIOE_BASE; #endif /*_GPIOE */ #ifdef _AFIO AFIO = (AFIO_TypeDef *) AFIO_BASE; #endif /*_AFIO */ 为了访问 GPIO 寄存器,
11、_GPIO, _AFIO, _GPIOA, _GPIOB, _GPIOC, _GPIOD和_GPIOE必须在文件 中定义如下: #define _GPIO#define _GPIOA#define _GPIOB#define _GPIOC#define _GPIOD10.2 GPIO库函数 Table 179. 例举了GPIO 的库函数【见首页】10.2.1 函数GPIO_DeInit Table 180. 函数 GPIO_DeInit函数名GPIO_DeInit 函数原形void GPIO_DeInit(GPIO_TypeDef* GPIOx)功能描述将外设GPIOx寄存器重设为缺省值输入参
12、数GPIOx:x可以是A,B,C,D ,E,来选择GPIO外设输出参数无返回值无先决条件无被调用函数RCC_APB2PeriphResetCmd()例: /* Resets the GPIOA peripheral registers to their default reset values */ GPIO_DeInit(GPIOA); 函数原型如下:void GPIO_DeInit(GPIO_TypeDef* GPIOx) /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx); switch (*(u32*)&G
13、PIOx) case GPIOA_BASE: RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);/ 0x00000004 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE); break;/*void RCC_APB2PeriphResetCmd(u32 RCC_APB2Periph, FunctionalState NewState) /* Check the parameters */ assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)
14、; assert_param(IS_FUNCTIONAL_STATE(NewState); if (NewState != DISABLE) RCC-APB2RSTR |= RCC_APB2Periph; else RCC-APB2RSTR &= RCC_APB2Periph; */ case GPIOB_BASE: RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE); / 0x00000008 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE); break; case GPIOC_
15、BASE: RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE); / 0x00000010 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE); break; case GPIOD_BASE: RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE); / 0x00000020 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE); break; case GPIOE_BASE: RC
16、C_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE); / 0x00000040 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE); break; case GPIOF_BASE: RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, ENABLE); / 0x00000080 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE); break; case GPIOG_BASE: RCC_APB2Pe
17、riphResetCmd(RCC_APB2Periph_GPIOG, ENABLE); / 0x00000100 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, DISABLE); break; default: break; 10.2.2 函数GPIO_AFIODeInit Table 181. 函数 GPIO_AFIODeInit函数名GPIO_AFIODeInit 函数原形void GPIO_AFIODeInit(void)功能描述将复用功能(重映射事件控制和EXTI设置)重设为缺省值输入参数无输出参数无返回值无先决条件无被调用函数RCC_APB
18、2PeriphResetCmd()例: /* Resets the Alternate functions registers to their default reset values */ GPIO_AFIODeInit(); 函数原型如下:void GPIO_AFIODeInit(void) RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE); /0x00000001 RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE);10.2.3 函数GPIO_Init Table 182. 函数
19、 GPIO_Init函数名GPIO_Init函数原形void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)功能描述根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器输入参数 1GPIOx:x 可以是A,B,C,D,E,来选择GPIO外设输入参数 2GPIO_InitStruct:指向结构GPIO_InitTypeDef的指针,包含了外设GPIO的配置信息输出参数无返回值无先决条件无被调用函数无GPIO_InitTypeDef structure定义于文件“stm2f10x_gpio.h
20、”:typedef structu16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed;GPIOMode_TypeDef GPIO_Mode;GPIO_InitTypeDef;GPIO_Pin:该参数选择待设置的 GPIO 管脚,使用操作符可以一次选中多个管脚。可以使用下表中的任意组合。 Table 183. GPIO_Pin 值 参数GPIO_Pin值描述#defineGPIO_Pin_None无管脚被选中0x0000GPIO_Pin_0选中管脚00x0001GPIO_Pin_1选中管脚10x0002GPIO_Pin_2选中管脚20x0004GPIO_Pin_3
21、选中管脚30x0008GPIO_Pin_4选中管脚40x0010GPIO_Pin_5选中管脚50x0020GPIO_Pin_6选中管脚60x0040GPIO_Pin_7选中管脚70x0080GPIO_Pin_8选中管脚80x0100GPIO_Pin_9选中管脚90x0200GPIO_Pin_10选中管脚100x0400GPIO_Pin_11选中管脚110x0800GPIO_Pin_12选中管脚120x1000GPIO_Pin_13选中管脚130x2000GPIO_Pin_14选中管脚140x4000GPIO_Pin_15选中管脚150x8000GPIO_Pin_All选中全部管脚0xFFFF
22、【备注】:如下寄存器可用本表: IDR输入数据、ODR输出数据、 BSRR位设置/复位、BRR位复位、LCKR锁定管脚。GPIO_Speed: 用以设置选中管脚的速率。Table 184. 给出了该参数可取的值Table 184. GPIO_Speed 值参数GPIO_Speed值描述/GPIOx_CRL/H定义值端口意义-0输入模式GPIO_Speed_10MHz最高输出速率10MHz 1输出频率GPIO_Speed_2MHz最高输出速率2MHz 2GPIO_Speed_50MHz最高输出速率50MHz 3GPIO_Mode:用以设置选中管脚的工作状态。Table 185. 给出了该参数可取
23、的值 Table 185. GPIO_Mode 值参数GPIO_Mode参数描述/CRL/H定义值备注1备注2输入模式:0b00GPIO_Mode_AIN模拟输入0x00Analog InputGPIO_Mode_IN_FLOATING浮空输入0x04Floating Input直接输入复位默认GPIO_Mode_IPD下拉输入0x28Pull_Down Input输入端与电源间接有电阻GPIO_Mode_IPU上拉输入0x48Pull_Up Input输入端与地间接有电阻输出模式:0b00GPIO_Mode_Out_PP推挽输出0x10Pull_Push OutputPNP_C极和NPN_C
24、极相连输出GPIO_Mode_Out_OD开漏输出0x14Open Drain Output漏极不接电源,作为输出端GPIO_Mode_AF_PP复用推挽输出0x18AF Pull_Push OutputGPIO_Mode_AF_OD复用开漏输出0x1CAF Open Drain Output 【注意】:当某管脚设置为上拉或者下拉输入模式,使用寄存器 Px_BSRR 和 PxBRR GPIO_Mode 允许同时设置 GPIO 方向(输入/输出)和对应的输入/输出设置:位 7:4对应 GPIO 方向,位4:0对应配置。GPIO 方向有如下索- GPIO 输入模式 = 0x00- GPIO 输出模
25、式 = 0x01Table 186.给出了所有GPIO_Mode 的索引和编码 Table 186. GPIO_Mode的索引和编码 GPIO方向索引模式寄存器设置模式代码备注GPIO Input0x00GPIO_Mode_AI0x000x00CNF=0b00GPIO_Mode_IN_FLOATING0x040x04CNF=0b01复位默认GPIO_Mode_IPD0x080x28CNF=0b100b11此时保留GPIO_Mode_IPU0x080x48GPIO Output0x01GPIO_Mode_Out_PP0x000x10CNF=0b00GPIO_Mode_Out_OD0x040x14
26、CNF=0b01GPIO_Mode_AF_PP0x080x18CNF=0b10GPIO_Mode_AF_OD0x0C0x1CCNF=0b11例: /* Configure all the GPIOA in Input Floating mode */GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLO
27、ATING;GPIO_Init(GPIOA, &GPIO_InitStructure);函数原型如下:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) u32 currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00; u32 tmpreg = 0x00, pinmask = 0x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx); assert
28、_param(IS_GPIO_MODE(GPIO_InitStruct-GPIO_Mode); assert_param(IS_GPIO_PIN(GPIO_InitStruct-GPIO_Pin); /*-在使用本函数之前,必须对GPIO_TypeDef结构体的三个参数进行初始化【见上面实例代码】-*/*- GPIO Mode Configuration -*/ currentmode = (u32)GPIO_InitStruct-GPIO_Mode) & (u32)0x0F);/I/O方式模式:如上拉输入、开漏输出等。 if (u32)GPIO_InitStruct-GPIO_Mode) & (u32)0x10) != 0x00)/为输出模式,配置输出频率。否则不管。 /输出方式模式:推挽、开漏、复用推挽、复用开漏。 /* Check the parameters */ assert_param(IS_GPIO_SPEED(GPIO_InitStruct-GPIO_Speed);/输出频率模式:10M为0x1;2M为0x2;50M为0x3。 /* Output mode */ currentmode |
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1