打印
[STM32F1]

stm32按下按键灯常量

[复制链接]
154|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alvpeg|  楼主 | 2023-12-30 22:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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);  //按键初始化函数声明


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

1390

帖子

0

粉丝