STM32F407库函数开发之GPIO

库函数介绍

为什么要使用库函数

从上一节我们了解到如何去用寄存器驱动外设,但我们也同时了解到 STM32 的寄存器数量非常多,这么多的寄存器光是定义就需要花费很多的时间,更不用说还要去查找对应的功能,找到对应的地址,然后配置需要的值,这在难度和时间上都是不可取的。为此,库函数就在这种情况下应运而生,库函数能使我们的开发效率大大提高。关于 STM32 的标准外设库函数,STM32 的官方已经给我们开发好了,我们只需要移植到我们的工程使用即可。库函数的使用不需要让我们去了解硬件的机制,只需要根据需要的功能去查找对应的函数,然后调用即可,大大降低了开发要求。

库函数简单介绍

从前面的章节可以知道创建的工程模板里面有 STM32F4 的标准外设库,我们可以打开其中的 STM32f4xx_gpio.h 和 STM32f4xx_gpio.c 文件进行查看,也可以参考 STM32F40x 的固件库使用手册进行参考。

说白了,其实库函数就是在寄存器的基础上又封装了一层,使操作起来更简单,最后还是通过寄存器来实现的。

库函数点亮LED

1、使能时钟

从上一节我们了解到要点亮板子上的LED灯就需要IO口输出一个高电平,那么我们如何使用库函数去点亮LED灯呢

同意的,我们知道GPIOB是挂载在AHB1上的,所以我们一样要打开它的时钟,那我们怎么去找到开启时钟的函数呢?当然我们可以去网上查找,也可以询问AI,这里我就告诉大家,时钟一般都是简称RCC,所以我们找到stm32f4xx_rcc.c或者.h

这里可以看到有许多开启时钟的函数,我们找到RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);由此可知,这个函数的一个参数就是要使能的时钟,我们要使用的时钟是 GPIOB,开启 GPIOB 时钟转换为代码就是:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

2、GPIO配置

和上面一样,我们可以打开stm32f4xx_gpio.h文件在里面查找相关函数;

在对stm32每个外设操作时,我们都会对他的时钟进行使能,同时会对外设进行初始化,初始化就是对GPIO结构体参数进行配置,让我们的GPIO按我们的要求输出,而不是乱输出,下面我来介绍一下各个参数代表什么含义,大家也可以在.h文件中查找结构体成员,参数类型,方便我们配置相关函数。

  • GPIOx: 这个参数指定了要初始化的 GPIO 端口。
  • GPIO_InitStruct: 这是一个指向 GPIO_InitTypeDef 结构的指针,该结构体包含了 GPIO 端口的配置信息。GPIO_InitTypeDef 结构体通常包括以下几个重要的成员:
  • Pin: 指定要配置的 GPIO 引脚。可以是一个引脚或多个引脚的组合。
  • GPIO_Mode: 设置引脚的工作模式,如输出模式、输入模式、复用功能模式等
  • GPIO_PuPd: 设置引脚的上拉/下拉电阻状态。
  • GPIO_Speed: 设置引脚的输出速度(低速、中速、高速、极高速)。
  • GPIO_OType: 输出类型。

结构体具体成员:

那到了这里,相信大家应该也学会了如何去配置GPIO了吧,步骤就是打开时钟,定义结构体,对结构体成员赋值或者操作,在初始化GPIO就可以了。

GPIO_InitTypeDef  GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOB, &GPIO_InitStructure);

3、点亮LED灯

配置好 GPIO 之后,我们就可以进行点灯了。其实也就是让 GPIO 引脚输出高低电平,到我们的开发板上就是让 PB2 输出高电平。 如何让 PB2 输出高电平呢?通过查阅库函数,这里为大家总结了几种操作的方式。

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);将指定IO口输出高电平,第一个参数是要操作的GPIO,第二个参数是对应的端口,比如我现在要将PB2设置为高电平:

GPIO_SetBits(GPIOB,GPIO_Pin_2);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);将指定IO口输出低电平,第一个参数是要操作的GPIO,第二个参数是对应的端口,比如我现在要将PB2设置为低电平:

GPIO_ResetBits(GPIOB,GPIO_Pin_2);

我们还有一个函数,既可以写入高电平,也可以写入低电平,那么既然可以写,那可不可以读呢,当然可以,后续会继续更新相关内容,可以点个关注哦。

GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);第一个参数是要操作的GPIO,第二个参数是对应的端口,第三个参数是BitAction

typedef enum
{ 
  Bit_RESET = 0,
  Bit_SET
}BitAction;

比如我现在要将PB2设置为低电平:

GPIO_WriteBit(GPIOB, GPIO_Pin_2, 0);

那么总结下来,我们可以使用2个函数来点亮LED,下面我就使用第一种吧

int main(void)
{
	
	board_init();
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB ,ENABLE );
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	GPIO_SetBits(GPIOB,GPIO_Pin_2);
	while(1)
	{

	}
	

}

当然我们可以在循环里面添加延迟来实现闪烁功能

int main(void)
{
	
	board_init();
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB ,ENABLE );
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	while(1)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_2);
		delay_ms(500);
		
		GPIO_ResetBits(GPIOB,GPIO_Pin_2);
		delay_ms(500);
		
	}
	

}

led

好了,今天的内容就到这里了,后续还会继续更新相关内容,大家可以给我点点赞,关注一下,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值