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完成