欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

STM32工程--IO口--按键控制点灯程序

程序员文章站 2022-07-07 16:34:33
STM32F4工程--IO口--按键控制点灯程序(库函数) ----芯片:STM32F429IGT6本文章介绍使用STM32F4单片机,利用按键控制LED灯的亮灭,通过按键和LED的控制,达到学习单片机IO口配置的目的。本文章的工程链接如下,可自行保存。aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1、STM32F4单片机IO的基本知识STM32F4单片机,IO 可以由软件配置成如下 8 种模式中的任何一种:.....

STM32F4工程--IO口--按键控制点灯程序(库函数)

  ----芯片:STM32F429IGT6


本文章介绍使用STM32F4单片机,利用按键控制LED灯的亮灭,通过按键和LED的控制,达到学习单片机IO口配置的目的。本文章的工程链接如下,可自行保存。

链接:https://pan.baidu.com/s/1lfhJiBIoiZuD_DldKdFwRw 
提取码:p5i1 


1、STM32F4单片机IO的基本知识

STM32F4单片机, IO 可以由软件配置成如下 8 种模式中的任何一种:

(1)GPIO_Mode_AIN 模拟输入 ------用于检测模拟信号

(2)GPIO_Mode_IN_FLOATING 浮空输入------可以做KEY的按键输入

(3)GPIO_Mode_IPD 下拉输入------内部连接有下拉电阻

(4)GPIO_Mode_IPU 上拉输入------内部连接有上拉电阻

(5)GPIO_Mode_Out_OD 开漏输出

(6)GPIO_Mode_Out_PP 推挽输出

(7)GPIO_Mode_AF_OD 复用开漏输出

(8)GPIO_Mode_AF_PP 复用推挽输出

(在这就说着一个知识吧,说的有点少,大佬见笑了)


2、添加LED_KEY工程

建立一个LED_KEY.c和LED_KEY.h两个文件,放到工程的HARDWARE文件夹下,建立的办法是新建一个记事本,把名字改为LED_KEY.c和LED_KEY.h就可以了,记住把原来的.txt后缀名给他删掉。

然后在工程的HARDWARE文件下添加LED_KEY.c,然后再包含LED_KEY的路径。添加办法我想你已经知道了,(不知道的话见上一篇文章,或者上浏览器,哈哈哈)添加后的工程界面如下:(这个是我重新建了个工程,上次的工程名字不好听)

STM32工程--IO口--按键控制点灯程序

此时我们的LED_KEY.c的文件是空白的,我们先打上一行代码:#include "LED_KEY.h"

STM32工程--IO口--按键控制点灯程序

此时我们可以通过右键--->Open document LED_KEY.h来打开LED_KEY.h文件。我们先打开这个文件输入

#ifndef _LED_KEY_H
#define _LED_KEY_H


#endif

输入这个的意思是:如果LED_KEY.h第一次被引用,那么_LED_KEY_H没有被定义,所以#define _LED_KEY_H#endif 中间的头文件内容就被执行,也就是头文件内容被定义。那么如果led.h第二次被引用,由于_LED_KEY_H 已经被第一次引用时定义了,所以不会执行#define _LED_KEY_H #endif 中间的头文件内容,也就是不会重复定义头文件内容。

在mian.c文件上方添加代码#include "LED_KEY.h",表示引用该文件

STM32工程--IO口--按键控制点灯程序


3、添加代码

LED_KEY.c下加入以下代码:

#include "LED_KEY.h"

void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
	
    GPIO_Initure.Pin=GPIO_PIN_0;            //PB0
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);	//PB0置1,默认初始化后灯灭
}

void KEY_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;    
    __HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟
 
    GPIO_Initure.Pin=GPIO_PIN_0;            //PA0
    GPIO_Initure.Mode=GPIO_MODE_INPUT;      //输入
    GPIO_Initure.Pull=GPIO_PULLDOWN;        //下拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
    
}

LED_KEY.h下加入以下代码:

#ifndef _LED_KEY_H
#define _LED_KEY_H
#include "sys.h"    //包含头文件

#define LED PBout(0)   //定义LED0
#define KEY_LED   HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)  //KEY_LED按键PA0

void LED_Init(void);  //LED灯初始化函数
void KEY_Init(void);  //按键初始化函数

#endif

在main.c下加入以下代码:

#include "sys.h"
#include "LED_KEY.h"
int main(void)
{
    HAL_Init();                     //--初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //--设置时钟,180Mhz
    delay_init(180);                //---初始化延时函数	
	KEY_Init();//------------------------按键初始化函数
	LED_Init();//------------------------LED初始化函数
		
    while(1)
    {		
      if(KEY_LED==1)
		{						
		delay_ms(10);
		    if(KEY_LED==1)
			 {					
			 LED=!LED;	
			 }				
		}
		
	}
}
 

4、主要代码解释

1、main.c   下函数解释

    KEY_Init();     LED_Init();这两个函数是声明,想必大家都懂,函数使用前需要声明一下。

    while(1){ }  这里面的函数也特别简单,检测按键是否被按下,如果按下就LED灯亮灭翻转一下。

2、LED_KEY.c   下函数解释

    IO口初始化如下

    GPIO_InitTypeDef GPIO_Initure;     这个是GPIO的结构体函数

     __HAL_RCC_GPIOB_CLK_ENABLE();            这个是时钟函数,使用时选对应时钟

    GPIO_Initure.Pin=GPIO_PIN_0;            选择第几口

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;       选择输出方式

    GPIO_Initure.Pull=GPIO_PULLUP;            这里选择上拉还是下拉,

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     选择输出的翻转速度

    HAL_GPIO_Init(GPIOB,&GPIO_Initure);  
}

3、LED_KEY.h   下函数解释

 PBout(0)     PB0的输出状态,PBout(0) =1;表示PB0口输出高电平,PBout(0) =0;表示PB0口输出低电平。
 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)        读取PA0的引脚状态

 void LED_Init(void);  //LED灯初始化函数声明
 void KEY_Init(void);  //按键初始化函数声明


5、补充

1、这里的按键为电阻下拉,LED灯为电阻下拉。

2、这里的按键为PA0口,LED灯为PB0口。

3、我为什么在每个文件里都包含#include "sys.h"   答:我把所有的头文件都放到了sys.h下,之后其他文件只引用这一个文件就可以包含sys.h下的所有头函数。(这也是一个小技巧,可以使用一下)


每天更新一篇文章,用于督促自己学习,同时更希望能帮助到大家,若有侵权请联系删掉。

(每天更新时间为第二天06:00前,有时事多需熬夜,望大家监督,如果可以希望大家多多给建议)

本文地址:https://blog.csdn.net/qq_38326581/article/details/109004517