首页 > 其他分享 >STM32按键开关灯

STM32按键开关灯

时间:2024-11-03 18:51:31浏览次数:3  
标签:输出 高电平 -- 按键 低电平 STM32 开关 GPIOE 寄存器

文章目录

概要

使用Stm32F103ZET6型号芯片开发项目中灯led、IO口、抵达定时器SysTick的配置使用。

整体架构流程

提示:这里可以添加技术整体架构

例如:
在语言模型中,编码器和解码器都是由一个个的 Transformer 组件拼接在一起形成的。

灯LED

灯的作用:

灯亮 --人眼能看到 --通过灯的状态来检查错误
1、电源指示–先告诉你 你接电了没
2、状态指示 --红绿黄 错误 运行 暂停
–通过闪烁 来判断代码是否卡死,灯如何亮? --led 灯是发光二极管–利用单向导通 --可以分析物理导线接线方向,能知道单向导通方向。

在这里插入图片描述
在这里插入图片描述

LED 灯电路分析

在哪查看电路分析???
原理图:模拟实际电路的连接方式的一种原理示意图。即我这里用的是STM32开发板原理图
LED1 -LED2- LED3-LED4 —在原理图当中 叫网络标签。
在原理图当中,相同的网络标签表示连接在一起。
另一端接在了 单片机的引脚上面。

STM32F103 的 IO 口 --IN /OUT 输入输出的接口

IO口

IO口对外输出一个控制信号,接收(采集)外部的信号。它就是我们 stm32 单片机 与 外部连接的 桥梁。 —Z 型号总共有 144 根 引脚数,有些不是 I/O。

资源和命名方式

SM32 当中以 A B C D E F G…来命名端口 ,一个端口 16 个引脚 (0-15)。
PE2-- P:port E:E 端口号 2:2 号引脚
LED1–PE2 LED2–PE3 LED3–PE4 LED4–PE5
如何控制 PE2 PE3 PE4 PE5, 4 个引脚(管脚)输出低电平 GND 0V,灯就会的点亮。

stm32 中 GPIO 的内部结构以及工作模式

GPIO --通用 目的 IO 口 --具体查看对应类型的参考手册
在这里插入图片描述
R -register 英文是寄存器的意思,什么是寄存器????
寄存器也是一种存储器,他能存数据也能存功能指令–掉电丢失;往固定寄存器当中固定的位写入固定得数据,就能实现对应的功能;CR 配置寄存器: ----就是配置模式的 —(输入输出模式),DR 数据寄存器:存放数据的,可以写入也能读取
别的外设还会有:
SR 状态寄存器:通过状态标志位,显示外设运行的情况
根据外设不同
判断 io 口是对外输出信号控制,还是接收采集信号。输入输出一共有八种模式:输入浮空、上拉输入、下拉输入、模拟输入;开漏输出、推挽式输出、开漏复用输出、推挽式复用输出。
需要查看其内部结构图:
GPIO口对灯进行控制 —输出信号也就是输出模式(输出模式: 根据控制信号来源不同,分为通用,以及复用)
推挽模式 — 控制信号 1 能够输出高点平 3.3v 控制信号 0 输出低电平 0v。
开漏模式 — 控制信号为 1 内部高阻态相当于断路 控制信号 0 只能输出低电平,想要输出高电平 ,
外部接上拉电阻。------只输出低电平,控制信号为 1 ,进入高阻态,但是他能输入采集。
复用:控制信号来源不同。—片上外设

想要灯亮,需要空 PE2、PE3、PE4、PE5 输出低电平 — 输出模式 ,推挽 开漏。
在这里插入图片描述
输入模式:
浮空:空闲时不确定,能够 输入 高电平 以及 低电平。
上拉:空闲时为高电平,能够 输入 高电平 以及 低电平。
下拉:空闲时为低电平,能够 输入 高电平 以及 低电平。
模拟:单独给 ADC
我们的电子设备,是数字信号,TTL 电平 --电平标准:逻辑值 0 0-0v,逻辑值 1 3.3v-5v(TTL 电平)。PE -GPIOE

控制 PE2345 --GPIOE
1、–选择模式:推挽或开漏
2、—目的:io 口输出低电平 也就是控制信号输出为 0 (输出寄存器对应的位为 0)
如何去选择模式(如何配置模式)???以及让控制信号输出为 0 ???
去操作对应寄存器。

寄存器与配置

寄存器是一种存贮器,能存数据,还能存指令。也就是说开发单片机就是操作寄存器。
GPIOX_CRL x 可以是 A…B…E. 对应端口。 一个端口有多少引脚? 0-15 一共有 16 个。低寄存器 GPIOE_CRL 一个寄存器 32 位。 4 位 去配置一个引脚 ,那么一个寄存器能配置8 个PE0 -7 号引脚。
所以有了高寄存器 GPIOE_CRH . PE8-15. 即PE2345 --选择 低配置寄存器。
例如:
需要通过位运算去修改配置为 推挽输出 —就需要找到 对应的位 然后修改为 0011。X&0=0 与零清零,X|1=1 或 1 置 1。我们操作寄存器,用哪个部分操作哪个部分,其他部分保持不变。例如:
PE2 : GPIOE->CRL &= ~(0xf<<8); //清 0
GPIOE->CRL |= 0X3<<8; //置位 (0x3 0011 -推挽输出)
GPIOE->ODR |=1<<2; 置 1
GPIOE->ODR &=~(1<<2); 清零

时钟

在这里插入图片描述
通过寄存器打开时钟。RCC->APB2ENR |=1<<6; 使能时钟。

软件编程驱动 LED 灯

//开启GPIOE的时钟,参考手册6.3.7 RCC_APB2ENR寄存器第6位置1
	RCC->APB2ENR |=1<<6;

//PE2345  参考手册8.2.1GPIOE_CRL 寄存器对应位 目标值0011 --推挽模式
//清零  使用那几位就操作哪几位 其他位不能变
//参考手册8.2.1,为什么左移8位,PE2345在crl寄存器里 8-11、12-15、16-19、20-24位
	GPIOE->CRL &=~(0xf<<8);
//目标值 0011 (十六进制0x3)
    GPIOE->CRL |=(0x3<<8);
//PE2345 输出数据寄存器对应的位 置1 
	GPIOE->ODR |=1<<2;

通过操作具体的寄存器改变电压,以宏定义的模方式

//输出低电平 led灯亮
#define LED1_TOGGLE     GPIOE->ODR ^=1<<2;
#define LED1_OFF      GPIO_SetBits(GPIOE,GPIO_Pin_2);
#define LED1_ON       GPIO_ResetBits(GPIOE,GPIO_Pin_2);

延时函数使用嘀嗒定时器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

嘀嗒定时器对应的中断服务函数SysTick_Handler,需要重定向

//定义任务的时间点
u16 Led_Time=0;
u16 Key_Time=0;

void SysTick_Handler(void)
{
	Led_Time++;
	Key_Time++;
}

根据他的参数SysTick_Config(72000);(1毫秒) t=72000/72m=0.001s 也就是1ms触发一次。

//系统嘀嗒定时器初始化
//用内核提供的函数
SysTick_Config(72000);//1ms触发一次系统嘀嗒定时器中断

//寄存器版本:
//寄存器配置
SysTick->CTRL |=1<<0;
SysTick->CTRL |=1<<1;
SysTick->CTRL |=1<<2;
SysTick->LOAD =72000-1;//重装载值
NVIC_SetPriority(SysTick_IRQn,0); //设置优先级

系统定时器是一个向下计数 24 位的计数器。
想要配置它 需要到内核当中的寄存器找。处理器有一个 24bit (16777216)的定时器—SysTick,它从重装载值向下计数到 0,然后在新的时钟边沿上,加载装载值到计数器,然后继续计数。 ------对用内核里面的寄存器来说

按键驱动

按键电路图分析:
判断按键是否按下?
电平变化 传给 单片机的 io 口,检测 io 口的电平变化 -输入信号采集—输入模式。
问题: 分析电平怎么变化?
电平变化是一个突然的过程,从0V激增至3.3V,但是有一个很短的变化时间。
在这里插入图片描述
KEY1 --不按 低电平 按下 高电平
KEY2 --不按 高电平 按下 低电平
KEY3 --不按 高电平 按下 低电平
KEY4 --不按 高电平 按下 低电平
在这里插入图片描述
IO口去判断: KEY1 --PA0 KEY2–PC4 KEY3–PC5 KEY4–PC6
PA0 输入模式 --浮空输入

GPIOA->CRL &= ~(0XF<<0) 
GPIOA->CRL |=0X4<<0;

高低电平的变化在哪里看?
在输入数据寄存器中去查看。

(GPIOA->IDR & 1 <<0) == 0 检测为低电平
(GPIOA->IDR & 1 <<0) != 0 检测为高电平
If((GPIOA->IDR & 1 <<0) != 0 )
{
灯亮;
蜂鸣器响;
}

总体上就是:

1、开启时钟
2、配置模式 清零 置位
3、odr 输出寄存器控制灯 亮灭 idr 输入信号检测高低电平

标签:输出,高电平,--,按键,低电平,STM32,开关,GPIOE,寄存器
From: https://blog.csdn.net/qq_50866235/article/details/143467758

相关文章

  • 【STM32 Blue Pill编程实例】-4位7段数码管使用
    4位7段数码管使用文章目录4位7段数码管使用1、7段数码介绍2、硬件准备与接线3、模块配置4、代码实现在本文中,我们将介绍如何将STM32BluePill开发板与4位7段数码管连接,并在STM32CubeIDE中对其进行编程。在文章中首先将介绍4位7段数码管及其与......
  • Ubuntu系统如何实现键盘按键映射到其他按键(以 Ctrl+c 映射到 F3,Ctrl+v 映射到 F4 为
    文章目录写在前面1.功能描述2.实现步骤2.1安装`AutoKey`2.2软件设置2.2.1软件设置2.3测试是否安装成功参考链接写在前面自己的测试环境:Ubuntu20.041.功能描述  Ubuntu系统使用Ctrl+c、Ctrl+v进行复制粘贴操作的时候,时间长了就会出现小拇指比较累的情......
  • FPGA实例——按键消抖和自定义IP封装
    按键消抖:简介:目前,在大部分的FPGA开发板上都带有机械按键,由于机械按键的物理特性,按键在按下和释放的过程中,存在一段时间的抖动,这就导致在识别按键的时候可以检测到多次的按键按下,而通常检测到一次按键输入信号的状态为低电平,就可以确认按键被按下了,所以我们在使用按键时往往需......
  • 基于STM32的激光通信系统设计
    备忘编者按:激光通信具有保密性强、通信容量大、重量轻、功耗和体积小、制造和维护费用低等特点。为满足民用领域对于激光通信的需求,设计了一种基于STM32的激光通信系统。该系统由激光发射模块、激光接收模块,STM32F407主控模块组成,采用双音多频方式进行调制。在实验室环境下进行了......
  • Windows PC通过网络控制PDU开关
    PDU开关原理,是通过跟一台设备进行通信,如果正常通信,则PDU不会进行操作,如果通信中断且超时多长时间多少次后,会进行保持、重启、断开等操作,可以此来对PDU的开关进行控制一 设置IP及循环变量    先设置一个IP,此IP一般为PDU的IP,可用于后续PC和它直接ping包确认是否通信......
  • STM32 第21章 DMA--直接存储器访问
    时间:2024.10.31-11.2参考资料:《零死角玩转STM32》“DMA--直接存储器访问”章节编程部分的代码基于12-GPIO输出-使用固件库点亮LED灯一、学习内容1、DMA功能框图和DMA初始化结构体1.1DMA功能框图1.1.1DMA简介DMA:DataMemoryAccess,直接存储器访问。和GPIO、串口等一......
  • stm32读取麦克风inmp441数据并实时播放
    概述最近在做一个功能类似于对讲机通话的功能,本来在网上感觉很容易找到同样的案例复刻,结果发现大多数都是用esp32,或者说电脑作为上位机传输wav音频解码播放的效果,也有很相仿的,但是都测试结果不尽人意,经过不断摸索下面是我给出的方案。但是本篇文章只限于单片机mcu芯片通......
  • 基于STM32F407系列外部中断学习
    STM32外部中断学习1)外部中断概述1.外部中断描述在日常生活中,例如早上在睡觉被闹钟吵醒,你去关闭闹钟就属于中断事件。在主函数里的代码是由CPU运行的,CPU在执行过程中突然发生了异常事件(中断),CPU必须暂停当前的工作(设下断点),然后跑去处理这个异常事件的函数(中断服务函数),处理......
  • STM32(4)输出比较和输入捕获
    OC输出比较OC(OutputCompare)输出比较输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出的功能 输......
  • stm32疑难杂症之电压不够程序跑飞
    在开发阶段,如果出现程序不断重启的情况。首先先检查是不是代码问题。1.数组越界。定义的数组只有50个单元,但是程序运行的过程中,却给他赋给50+个单元。2.中断耗时太长,刚出中断又进去了。这时的现象是程序一直在中断中执行,回不到主函数。一般出现在中断嵌套中。3.中断或主函......