一.概述
GPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口。通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15,并且F4系列是基于Cortex-M4内核。
GPIO的复用:
STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。比如说串口就是GPIO复用为串口。
二.库函数,点灯
GPIO初始化结构体
typedef struct
{
uint32_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOOType_TypeDef GPIO_OType; /*!< Specifies the operating output type for the selected pins.
This parameter can be a value of @ref GPIOOType_TypeDef */
GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull-up/Pull down for the selected pins.
This parameter can be a value of @ref GPIOPuPd_TypeDef */
}GPIO_InitTypeDef;
//LED对应IO初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO结构体初始化
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOG, ENABLE); //端口硬件使能GPIOG时钟
//PG13、PG14和PG15初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; //LED0、LED1对应IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIO
GPIO_SetBits(GPIOE, GPIO_Pin_3 | GPIO_Pin_4); //灯的GPIO组不一样,E和G
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //LED2对应IO口
GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化GPIO
GPIO_SetBits(GPIOG, GPIO_Pin_9);
while(1)
{
//检测引脚电平的状态
if(Bit_RESET == GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_9))
{
//led1点亮
GPIO_ResetBits(GPIOE,GPIO_Pin_4);
}
else
{
//led1熄灭
GPIO_SetBits(GPIOE,GPIO_Pin_4);
}
}
}
2.也可以用位段点灯
/*
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400)
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
#define PERIPH_BASE ((uint32_t)0x40000000)
端口F的ODR寄存器地址 = 0x40000000+0x20000+0x1400+0x14=0x40021414;
映射地址,别名区域地址=0x42000000+(0x40021414-0x40000000)32+94=0x404282A4
*/
#define PEout(n) *(volatile uint32_t *)(0x42000000+((uint32_t)&GPIOE->ODR - 0x40000000)*32+n*4)
#define PFout(n) *(volatile uint32_t *)(0x42000000+((uint32_t)&GPIOG->ODR - 0x40000000)*32+n*4)
PFout(3)=1;
PFout(4)=1;