Stm32f407zgt6学习笔记1——GPIO之点灯

一.概述
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;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值