当前位置:   article > 正文

04:【stm32】LED编程和按键控制

04:【stm32】LED编程和按键控制

1、LED编程

1.1、点亮一课LED灯

   首先,我们想象一下,让LED灯点亮,引脚应该是输出模式,那么应该是通用模式,还是复用模式喃?我们只是让LED灯亮,并没有使用是什么特殊功能,不需要其他的片上外设。使用引脚使用通用模式。那使用推挽模式还是开漏模式喃?其实2种模式都可以。
在这里插入图片描述
我们一般选择开漏模式,当输出0时,LED点亮,输出1时,LED熄灭。

在这里插入图片描述
我们连接PA0引脚。下面是使用PA0,把他设置为通用开漏输出模式编写程序的步骤:

  • ①我们先将我们创建好的模板工程复制粘贴一份,文件夹命名为点亮LED

在这里插入图片描述

  • ②开启APB2总线上的片上外设的时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,Enable);//开启GPIOA的时钟,相当于把GPIOA的开关打开
    
    • 1

在这里插入图片描述

  • ③对GPIOA进行配置(GPIOA几,输出模式,最大的输出速度)

在这里插入图片描述

我们对这个函数名双击然后右键,点击go to,查看这个函数是怎么定义的。

在这里插入图片描述

这个函数有2个形式参数,我们看见上面的注释中,GPIOx can be (A…G)。所以GPIOx我们填写GPIOA,而GPIO_InitStruct:pointer to a GPIO_InitTypeDef structure that contains the configuration information for the specified GPIO peripheral.(指向GPIO_InitTypeDef结构体的指针,该结构体包含指定GPIO外设的配置信息)
我们对GPIO_InitTypeDef双击然后右键,点击go to,

在这里插入图片描述

我们找到了这个结构体的定义
在这里插入图片描述

这个结构体里面由3部分组成,我们可以在红色框里面,找到这3部分的取值。我们双击然后Ctrl+F就会跳转过去

uint16_t GPIO_Pin:

在这里插入图片描述 GPIOSpeed_TypeDef GPIO_Speed;

在这里插入图片描述
由此可见:GPIOSpeed_TypeDef等于这个枚举中的一个变量。

GPIOMode_TypeDef GPIO_Mode;
在这里插入图片描述
在这里插入图片描述

所以我们先创建一个GPIO_InitTypeDef类型的结构体变量,变量名为GPIO_InitStruct,我们将结构体中的3个元素按我们是需求取值。

GPIO_InitTypeDef GPIOInitStruct;
GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出
GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIOInitStruct);
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

  • ③IO的读取与写入
    输出寄存器ODR的写入
    在这里插入图片描述
    输出寄存器ODR的读取
    读取的值是上一次写入的值
    在这里插入图片描述
    输入寄存器IDR的读取
    在这里插入图片描述

好了,我们分析完毕后开始写程序让LED灯点亮
程序1:

/*点亮一个LED灯*/
#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	PAL_Init();
	
	//1.打开APB2上面的GPIOA的时钟,
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//2.创建一个GPIO_InitTypeDef类型的结构体
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_Init(GPIOA ,&GPIOInitStruct);
	
	//3.给GPIOA0输出一个低电平,点亮LED
	//3.1给ODR的最低位写入一个低电平
//	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
	
	//3.2给ODR整体写入数据
//	GPIO_Write(GPIOA,0x0000);
	
	//3.3给ODR某一位写入数据0
	  GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	while(1)
	{
		
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

程序2:

/*让LED闪烁起来*/
#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	PAL_Init();
	//1.开启APB2上面的GPIOA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//2.创建一个GPIO_InitTypeDef类型的结构体变量GPIOInitStruct
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	while(1)
	{
		//3.让灯闪烁起来
		//3.1先让灯熄灭
		GPIO_WriteBit(GPIOA ,GPIO_Pin_0 ,Bit_SET);
		PAL_Delay(1000);
		//3.2先让灯点亮
		GPIO_WriteBit(GPIOA ,GPIO_Pin_0 ,Bit_RESET);
		PAL_Delay(1000);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

2、按键控制

2.1、通过一个按钮控制LED灯的亮灭

   我们通过检测按钮是否按下,来控制LED灯的状态。所以按钮连接的IO引脚应该配位输入模式,一般情况下,我们的输入模式配置为上拉输入模式。我们将按钮连接在PA1引脚

#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	PAL_Init();
	//1.打开APB2上面的GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//2.对GPIOA0进行配置,连接LED
	GPIO_InitTypeDef GPIOInitStruct;
	
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出
	GPIO_Init(GPIOA,&GPIOInitStruct);
	//3.对GPIOC1进行配置
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_1;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//4.先让LED点亮
	GPIO_ResetBits(GPIOA ,GPIO_Pin_0);
	
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == Bit_RESET)//按键按下
		{
			PAL_Delay(10);
			if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == Bit_SET)//按键抬起
			{
				PAL_Delay(10);
				if(GPIO_ReadOutputDataBit(GPIOA ,GPIO_Pin_0) == Bit_RESET)//读取PA0引脚的电平,如果是点亮
				{
					GPIO_SetBits(GPIOA ,GPIO_Pin_0);//让灯熄灭
				}
				else
				{
					GPIO_ResetBits(GPIOA ,GPIO_Pin_0);//点亮
				}
			}
		}
    }
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/940676
推荐阅读
相关标签
  

闽ICP备14008679号