STM32F4之GPIO的使用

   上次学STM32F103是在大二的暑假,学了一段时间之后也没有项目做,渐渐地就转向其他的方向,最近实习要用到STM32F407,就打算从头学,但是一些基础还在,并决定将学习的过程记录一下,以备使用。

 一.STM32F407ZGT6的GPIO资源介绍

STM32F407ZGT6
    -  一共有7组IO口
    - 每组IO口有16个IO
    - 一共16X7=112个IO
外加2个PH0和PH1
一共114个IO口
    

二.GPIO的相关寄存器

    一组IO口相关的寄存器有10个,也就是说,10个寄存器控制一组IO口;

一个端口模式寄存器(GPIOx_MODER)
一个端口输出类型寄存器(GPIOx_OTYPER)
一个端口输出速度寄存器(GPIOx_OSPEEDR)
一个端口上拉下拉寄存器(GPIOx_PUPDR)
一个端口输入数据寄存器(GPIOx_IDR)
一个端口输出数据寄存器(GPIOx_ODR)
一个端口置位/复位寄存器(GPIOx_BSRR)
一个端口配置锁存寄存器(GPIOx_LCKR)
两个复位功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)

三.GPIO的配置流程

	//声明一个GPIO结构体变量
	GPIO_InitTypeDef GPIO_InitStructure;
	delay_init(84);	
	//使能GPIO所在的总线的时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    //定义该结构体
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//使用的IO口 (总共有16个IO口)
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;         //设置IO的模式
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;    //100MHz
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;				//推挽
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;					//上拉
    //初始化该结构体
	GPIO_Init(GPIOF,&GPIO_InitStructure);

分析:   

(1) 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;

 

( 1) GPIO_Mode_AIN 模拟输入
( 2) GPIO_Mode_IN_FLOATING 浮空输入
( 3) GPIO_Mode_IPD 下拉输入
( 4) GPIO_Mode_IPU 上拉输入
( 5) GPIO_Mode_Out_OD 开漏输出
( 6) GPIO_Mode_Out_PP 推挽输出
( 7) GPIO_Mode_AF_OD 复用开漏输出
( 8) GPIO_Mode_AF_PP 复用推挽输出

8种配置模式的使用场景

二.GPIO的时钟使能

     

     时钟使能的函数在stm32f4xx_rcc.h中,根据上图,外设在哪一条时钟总线上进行函数选择,所以GPIOF在AHB1总线上,此时选择的函数为:

RCC_AHB1PeriphClockCmd();

四.GPIO相关重要函数

重要函数:
1个初始化函数:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

4个设置输出电平函数:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

 因此此时就可以用,以下函数进行点亮,熄灭LED了

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

具体代码如下:

int main(void)
{
	
	//声明一个GPIO结构体变量
	GPIO_InitTypeDef GPIO_InitStructure;
	delay_init(84);	
	//GPIO时钟使能
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//PIN9 PIN10 分别连接LED0 LED1
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;         //设置GPIO为输出模式
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;    //100MHz的时钟
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;		//Í推挽输出
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;		    //上拉­
	GPIO_Init(GPIOF,&GPIO_InitStructure);
	
	while(1)
	{
		GPIO_SetBits(GPIOF,GPIO_Pin_9 |GPIO_Pin_10);//同时点亮LED
		delay_ms(1000);
		GPIO_ResetBits(GPIOF,GPIO_Pin_9 |GPIO_Pin_10);//同时熄灭LED
		delay_ms(1000);		
	}

}

 

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
STM32F4芯片的GPIO模式可以通过设置相应的寄存器来实现。具体的步骤如下: 1. 首先,确定要配置的GPIO引脚的端口号和引脚号。例如,如果要配置PA5引脚,则端口号为A,引脚号为5。 2. 找到对应的GPIO端口的MODER寄存器。每个GPIO端口都有一个MODER寄存器,用于配置引脚的工作模式。 3. 根据引脚的工作模式,设置MODER寄存器的相应位。MODER寄存器中每两位表示一个引脚,可以设置为以下几种模式之一: - 输入模式(00) - 输出模式(01、10、11) - 复用功能模式(10、11) - 模拟模式(11) 4. 如果需要,还可以设置引脚的输出类型(推挽输出或开漏输出)、输出速度(低速、中速或高速)、上拉/下拉方式等。 5. 最后,根据需要,使能GPIO端口的时钟。 下面是一个简单的示例代码,用于将PA5引脚配置为推挽输出模式: ```c #include "stm32f4xx.h" int main(void) { // 使能GPIOA端口的时钟 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 将PA5引脚配置为推挽输出模式 GPIOA->MODER &= ~(GPIO_MODER_MODER5); // 先清零 GPIOA->MODER |= GPIO_MODER_MODER5_0; // 设置为输出模式(01) while (1) { // 在这里可以控制PA5引脚的电平 GPIOA->BSRR = GPIO_BSRR_BS_5; // 输出高电平 // 或者 GPIOA->BSRR = GPIO_BSRR_BR_5; // 输出低电平 } } ``` 请注意,以上只是一个简单的示例。具体的配置步骤和寄存器名字可能与不同的STM32F4系列芯片有所不同,具体应根据芯片的参考手册进行配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_33974167

有价值,请赏瓶水喝

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值