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的路径。添加办法我想你已经知道了,(不知道的话见上一篇文章,或者上浏览器,哈哈哈)添加后的工程界面如下:(这个是我重新建了个工程,上次的工程名字不好听)
此时我们的LED_KEY.c的文件是空白的,我们先打上一行代码:#include "LED_KEY.h"
此时我们可以通过右键--->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",表示引用该文件
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前,有时事多需熬夜,望大家监督,如果可以希望大家多多给建议)