【库函数】简要举例STM32对GPIO进行SetBits和ResetBits

xiaoxiao2021-02-28  341

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头文件中某代码片段拿出来举例:

#define ON 0 #define OFF 1这里是进行宏定义,把0赋值给ON;把1赋值给OFF,我们再看下面代码

#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); //亮500ms LED1(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完成

是不是非常简单?有问题留言,尽力回复。

本文不接收任何复制和转载

转载请注明原文地址: https://www.6miu.com/read-514471.html

最新回复(0)