1.若为输入模式(可用于KEY等外设的输入检测)
引用结构体: GPIO_InitTypeDef GPIO_InitStructure;
开启时钟: RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOX, ENABLE);
设置输入模式: GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
上拉/下拉/浮空 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_(UP/DOWN/NOPULL);
选择控制的IO口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_X;
初始化 GPIO_Init(GPIOX,&GPIO_InitStructure);
2.若为输出模式(对外输出高低电平)
引用结构体: GPIO_InitTypeDef GPIO_InitStructure;
开启时钟: RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOX, ENABLE);
设置输出模式: GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
配置为推挽模式: GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //一般为推挽模式
配置输出速率: GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //一般都为高速
上拉/下拉 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_(UP/DOWN);
选择控制的IO口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_X;
初始化 GPIO_Init(GPIOX,&GPIO_InitStructure);
配置逻辑(感觉这个挺重要的,这个记住学起轻松很多)
1.结构体引用
2.时钟使能
3.输出/输入模式具体配置(输出输入配置不同的主要区别)
4.选择控制的IO口
5.调用库函数进行初始化
练习示例:点亮LED灯并用按键控制
写了一个简单的程序实现红灯亮灭控制,按下按键就从亮变灭,再按一下就变亮,相当于普通开关
主程序:
int main(void)
{
LED_GPIO_Config(); //初始化LED的IO口
KEY_GPIO_Config(); //初始化按键的IO口
GPIO_ResetBits(GPIOF,GPIO_Pin_6); //对控制红灯的GPIO口设置低电平,即亮
GPIO_SetBits(GPIOF,GPIO_Pin_7); //对控制绿灯的GPIO口设置高电平,即灭
GPIO_SetBits(GPIOF,GPIO_Pin_8); //对控制蓝灯的GPIO口设置高电平,即灭
while(1)
{
if (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0) //调用库函数读取按键状态
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0); //消抖
GPIOF->ODR ^=GPIO_Pin_6; //直接对寄存器进行配置,对红灯IO口的电平状态求反
}
}
}
看懂了下面的LED.c配置文件,主程序应该比较清晰易懂,注意的是红绿蓝三个颜色的灯分别对应三个IO口,一个按键也对应一个特定的IO口,需从手册里提前查得分别对应的IO口。
GPIO配置文件LED.c:
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_Init(GPIOF,&GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8);
}
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
这段配置GPIO的程序就很清晰了,同时两个初始化分别配置的是GPIO的输入和输出模式,如果记住了文章最开始说的配置模板,那这些也很简单了
关于灯的GPIO的配置和按键GPIO的配置我都放在了新的LED.c文件里(其实如果更清晰可以把按键配置放在别的地方,比如新建个KEY.c文件等,我这里为了方便都放在了LED.c里)
还有挺重要的一点,凡是主程序需要调用其他程序的函数,需要在主程序中#include对应程序的头文件,并提前在头文件中声明该函数,我第一次上手练习就因为这点没理解透彻卡了很久。
具体上图来理解
LED.h文件
#ifndef LED_H
#define LED_H
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
void LED_GPIO_Config(void); //主函数用到了LED_GPIO_Config函数,于是在此声明
void KEY_GPIO_Config(void); //主函数用到了KEY_GPIO_Config函数,于是在此声明
#endif
//主程序最初的一行(当然也不一定是第一行,但在前几行的声明里一定要有这句)
#include "led.h"
萌新自学中,该文作为自己的笔记来帮助理解,很多知识点没涉及到,目前未完全理解复用,开漏等模式,理解透彻了会随时进行补充。