STM32自学笔记--1.GPIO初始化配置

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"

萌新自学中,该文作为自己的笔记来帮助理解,很多知识点没涉及到,目前未完全理解复用,开漏等模式,理解透彻了会随时进行补充。

  • 11
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32F4中,GPIO初始化是通过调用HAL_GPIO_Init()函数来实现的。在初始化之前,需要包含"stm32f4xx.h"和"stm32f4xx_gpio.h"头文件。具体的初始化配置可以在GPIO_InitTypeDef结构体中设置,包括引脚、模式、上下拉等参数。例如,如果要将GPIO配置为输出模式,可以在初始化之后调用HAL_GPIO_WritePin()函数来设置输出的高低电平。另外,如果要将GPIO配置为外部中断模式,可以将GPIO_InitTypeDef的成员变量Mode配置为中断模式,并设置好触发方式,然后调用HAL_GPIO_Init()函数来配置GPIO复用功能寄存器。同时,还需要进行中断的初始化配置,包括中断优先级和使能。具体的代码实现可以参考引用\[1\]和引用\[3\]中的示例代码。 #### 引用[.reference_title] - *1* *3* [初探STM32F4(5)--GPIO(2)](https://blog.csdn.net/qq_40977850/article/details/106122648)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32自学笔记--1.GPIO初始化配置](https://blog.csdn.net/qq_57346347/article/details/124599976)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值