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); //亮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完成
是不是非常简单?有问题留言,尽力回复。
本文不接收任何复制和转载