本文主要是介绍【库函数】简要举例STM32对GPIO进行SetBits和ResetBits,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.要解决的问题: STM32 如何对几个GPIO引脚进行单独操作
2.第一步骤:在XXX.c文件中配置好相关GPIO定义
如果我们要开启GPIOA的Pin0和Pin1,那么就要先进行相关配置,这里举例一个GPIO配置
void LED_GPIO_Config(void)
{ /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIOA的外设时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*选择要控制的GPIOA引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;/*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/*调用库函数,初始化GPIOA*/GPIO_Init(GPIOA, &GPIO_InitStructure);
}
我们可以看到,配置GPIO的时候要先定义一个GPIO结构体,再给结构体内的成员赋值。其相关值都是设定好的,我们只需要配置和使用,配置完成即可调用。相关名称与函数定义在stm32f10x_gpio.c文件中,所以说要多看《STM32用户手册》,不知道的地方就查询用户手册,笔者在这里就是简单的举例。
如果要针对某个GPIO引脚进行输出高;输出低,则可以在.c文件中这样写
GPIO_SetBits(GPIOA,GPIO_Pin_0) \\PA0 = 1
GPIO_ResetBits(GPIOA,GPIO_Pin_0) \\PA0 = 0
.c文件写好之后我们就开始写.h头文件,头文件十分重要,我们可以进行很多的宏定义,减少我们代码的复杂度,增加可读性。把.h头文件中某代码片段拿出来举例:
这里是进行宏定义,把0赋值给ON;把1赋值给OFF,我们再看下面代码#define ON 0 #define OFF 1
#define PA0(a) if (a) \GPIO_SetBits(GPIOA,GPIO_Pin_0);\else \GPIO_ResetBits(GPIOA,GPIO_Pin_0)
那么我们在.c文件中的使用就可以如下:
PA0(1) //PA0 = 1
PA0(0) //PA0 = 0
或者
PA0(OFF) //PA0 = 1
PA0(ON) //PA0 = 0
这样用起来就大大的增加了代码的可读性和编写效率。
我们再来看最后的完成代码
led.c文件代码如下
#include "led.h" //导入led头文件
#include "stm32f10x.h" //导入STM32官方库
#include "stm32f10x_rcc.h" //导入STM32的RCC时钟库
#include "delay.h" //导入延时函数void LED_GPIO_Config(void) //定义LED的引脚的初始化函数
{GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO_InitTypeDef结构体RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); //开启引脚时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //定义LED的引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出功率GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOC的引脚参数,写进
}void LED_Run(void) //定义一个流水灯程序
{LED1(ON); //LED1亮Delay_ms(500); //亮500msLED1(OFF) //LED2熄灭,下同LED2(ON);Delay_ms(500);LED2(OFF);LED3(ON);Delay_ms(500);LED3(OFF);
}
led.h文件代码如下
#ifndef __LED_H //如果未定义__LED_H
#define __LED_H //如果未定义__LED_H#include "stm32f10x.h" //导入STM32库文件
#include "stm32f10x_gpio.h" //导入STM32库GPIO文件#define OFF 1 //定义ON 为0
#define ON 0 //定义OFF为1//如果a的值是1则调用STM32官方库调用引脚电流拉高函数 GPIO_SetBits;若a的值是0 则调用STM32官方库调用引脚电流拉高函数GPIO_ResetBits.
//设置GPIOC_Pin_0的引脚是LED1#define LED1(a) if (a) \GPIO_SetBits(GPIOA,GPIO_Pin_0);\
else \GPIO_ResetBits(GPIOA,GPIO_Pin_0)#define LED2(a) if (a) \GPIO_SetBits(GPIOA,GPIO_Pin_1);\
else \GPIO_ResetBits(GPIOA,GPIO_Pin_1)#define LED3(a) if (a) \GPIO_SetBits(GPIOA,GPIO_Pin_2);\
else \GPIO_ResetBits(GPIOA,GPIO_Pin_2)#define LED4(a) if (a) \GPIO_SetBits(GPIOA,GPIO_Pin_3);\
else \GPIO_ResetBits(GPIOA,GPIO_Pin_3)void LED_GPIO_Config(void); #endif //定义__LED_H完成
是不是非常简单?有问题留言,尽力回复。
本文不接收任何复制和转载
这篇关于【库函数】简要举例STM32对GPIO进行SetBits和ResetBits的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!