STM32(F103ZET6)第一课:按键控制LED灯和蜂鸣器

news2025/2/26 9:56:08

目录

  • 功能要求
    • 一、开发思路
    • 二、详细过程
      • 1.查看原理图
      • 2.各模块编写
        • LED灯
        • 按键使用
        • 蜂鸣器

功能要求

设备上电,4个灯灭
按键1按下,4个灯灭
按键2按下,4个灯亮
按键3按下,蜂鸣器响
按键4按下,蜂鸣器关闭

一、开发思路

1.打开原理图找到对应模块的引脚,分析电路工作的原理。
2.顺着引脚找到连接芯片的对应位置,看看到底是PX几。
3.打开参考手册找到GPIOX的位置,并顺着GPIOX的位置找到该部分的时钟总线。
4.在参考手册中找到该总线的寄存器,查看如何配置能够开启对应的时钟。
5.配置引脚模式。低八位(0-7)配置GPIOx_CRL,高八位(8-15)配置GPIOx_CRH。
6.通过ODR/IDR,配置默认输出/输入数据。
7.根据以上编写好对应模块的.c和.h文件。
8.在main函数中进行综合编程,以满足功能要求。

二、详细过程

1.查看原理图

在这里插入图片描述
由图分析可知灯低电平亮,高电平灯灭。
在这里插入图片描述
由图可知按键1默认低电平,按下是高电平。
按键2,3,4默认高电平,按下低电平。

在这里插入图片描述
有图可知蜂鸣器高电平响,低电平不响

在这里插入图片描述
在芯片上找到对应的引脚。

2.各模块编写

LED灯

首先进行开时钟。
由寄存器图可知

	RCC->APB2ENR |= 0X01 << 6;

此时我们还要配置引脚模式,引脚为低八位查看数据手册的GPIOx_CRL,引脚为低八位查看数据手册的GPIOx_CRH。
该LED灯为低八位,所以我们查看数据手册的GPIOx_CRL:
在这里插入图片描述
先对该寄存器有一下了解:
配置模式前我们要简单了解一下各个模式的意思:
输入模式
00:模拟输入模式
在这种模式下,引脚的输入缓冲器被禁用,通常用于模拟信号输入,例如 ADC。

01:浮空输入模式
这是复位后的默认状态。在这种模式下,没有内部上拉或下拉电阻,适用于需要外部电路提供信号驱动的情况。

10:上拉/下拉输入模式
这种模式下,可以使用内部上拉或下拉电阻。具体是上拉还是下拉通过 ODR(输出数据寄存器)来决定:
ODR 为 1 时,上拉。
ODR 为 0 时,下拉。

11:保留
这种模式在输入模式下是保留的,通常不使用。
输出模式

00:通用推挽输出模式(最常用)
在这种模式下,GPIO 引脚可以输出高电平和低电平,适用于大多数需要输出固定电平的场景。

01:通用开漏输出模式
在这种模式下,GPIO 引脚只能拉低电平或者处于高阻状态,适用于需要连接到多路总线的场景,如 I2C。

10:复用功能推挽输出模式
在这种模式下,GPIO 引脚被配置为外围设备的推挽输出,例如 USART 的 TX 引脚。如果外设需要推挽输出,这种模式非常合适。

11:复用功能开漏输出模式
在这种模式下,GPIO 引脚被配置为外围设备的开漏输出,例如 I2C 的 SDA 和 SCL 引脚。这种模式适用于需要外设驱动的开漏输出。

了解以上各种模式之后,就可以得知LED灯引脚只需要配置为0011。(4位配置一个引脚)

下面了解一下八种模式:
模拟输入,接片上外设ADC使用模拟输入,输入进来是个模拟量
浮空输入:之间外部电压转换成逻辑电平1/0
上拉:内部接上拉电阻,默认就是高电平
下拉:内部接下拉电阻,默认就是低电平
输出:
通用推挽
通用开漏
复用推挽
复用开漏
复用和通用区别:
通用:是IO口的基本功能,IO口自己的寄存器控制输出
复用:由片上外设控制IO口输出
推挽:能够正常输出1/0
开漏:输出1处于高阻态,相当于断开,输出0正常(特点:可以读取输入电平)
灯配置:推挽输出

void Led_Init()
{
	//配置好模式,然后全灭
	//开APB2时钟
	RCC->APB2ENR |= 0X01 << 6;
  //配置PE2--PE5为通用推挽输出
	GPIOE->CRL &=~(0X0F << 20);//PE5
	GPIOE->CRL |= 0X03 << 20;
	GPIOE->CRL &=~(0X0F << 16);//PE4
	GPIOE->CRL |= 0X03 << 16;
    GPIOE->CRL &=~(0X0F << 12);//PE3
	GPIOE->CRL |= 0X03 << 12;
	GPIOE->CRL &=~(0X0F << 8);//PE2
	GPIOE->CRL |= 0X03 << 8;
	//4个引脚均输出高电平
	GPIOE->ODR |= (0x0F << 2);
	
}
按键使用

void key_Init()
{
	//开时钟
	RCC->APB2ENR |= 0x01<<4;//PC
	RCC->APB2ENR |= 0x01<<2;//PA
	//配置模式
	GPIOC->CRL &=~(0X0F << 24);//PC6   key4
	GPIOC->CRL |= 0X04 << 24;
  GPIOC->CRL &=~(0X0F << 20);//PC5   key3
	GPIOC->CRL |= 0X04 << 20;
	GPIOC->CRL &=~(0X0F << 16);//PC4   key2
	GPIOC->CRL |= 0X04 << 16;
	GPIOA->CRL &=~0X0F;//PA0   key1
	GPIOA->CRL |= 0X04;
	
}

需要注意的是:KEY1按下时发出的是一个高平信号,与其他三个不同。

int Get_Key_Val(void)
{
	int key_val = 0;
	if(!!(GPIOA->IDR &(0X01 << 0))==1)
		key_val = 1;
	if(!!(GPIOC->IDR &(0X01 << 4))==0)
		key_val = 2;
	if(!!(GPIOC->IDR &(0X01 << 5))==0)
		key_val = 3;
	if(!!(GPIOC->IDR &(0X01 << 6))==0)
		key_val = 4;
	
	return key_val;
}

此处是为了确定那个按键按下的,按下后返回按键值。

蜂鸣器

引脚配置为推挽输出

void Beep_Init()
{
	//开时钟
	RCC->APB2ENR |= 0x01<<4;//PC
	//配置模式
	GPIOC->CRL &=~(0X0F << 0);//PC0
	GPIOC->CRL |= 0X03 << 0;
	GPIOC->ODR &= ~0x01;//默认低电平,关闭
}

开始给一个低电平,默认是关闭的。
以上均为寄存器编写。编写时重点是能看懂说名书。
在配引脚前都要进行开时钟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2077442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM32开发——(八)中断

1. 中断概念 中断是计算机系统中的一种机制&#xff0c;用于响应外部事件或内部事件,它可以使单片机暂时中断正在执行的程序&#xff0c;转而去执行一个中断处理函数&#xff0c;待中断处理函数执行完毕后&#xff0c;再回到原来的程序继续执行。中断机制使得计算机可以响应各…

【已解决】Win11任务栏怎么使用小图标_Win11任务栏调整图标大小方法

使用注册表编辑器 1、打开运行&#xff0c;并输入 regedit 命令&#xff0c;确定或回车&#xff0c;可以打开注册表编辑器。 2、注册表编辑器窗口&#xff0c;依次展开到以下路径&#xff1a; HKEY_CURRENT_USER-Software-Microsoft -Windows-CurrentVersion-Explorer-Advanc…

『功能项目』技能释放【08】

我们打开上一篇07摄像机跟随角色的项目&#xff0c; 本章要做的事情是摄像机跟随主角移动&#xff0c; 首先创建一个空文件夹Resources 创建一个球体Shpere 修改球体缩放尺寸 创建一个材质Material 将材质重命名为Yellow&#xff0c;色板调至为黄色 将Yellow材质球拖拽至球体S…

0基础学习spark

零、pyspark模板 import os from pyspark import SparkContext, SparkConf os.environ[SPARK_HOME] /export/server/spark os.environ[PYSPARK_PYTHON] /root/anaconda3/bin/python3 os.environ[PYSPARK_DIRVER_PYTHON] /root/anaconda3/bin/python3 if __name__ __main__:…

物联网---ESP32

物联网---ESP32 一、TCP/IP协议(互联网协议)二、MQTT协议(通信协议)2.1 MQTT基本原理2.2 连接MQTT服务端 三、ESP323.1 ESP介绍3.2 ESP32连接云端3.2.1 ESP32连接WIFI/MQTT3.2.2 OneNET云端 一、TCP/IP协议(互联网协议) TCP/IP是一组用于互联网及其他网络中数据传输的通信协议…

MySQL集群 主从复制 和 高可用 配置详解

安装数据库 1、环境依赖 [rootmysql-node10 ~]# yum install cmake gcc-c openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 -y2、下载软件包 3、进行解压 [rootmysql ~]# tar zxf mysql-boost-5.7.44.tar.gz4、生成源码 #进入…

zotero同步之infiniteCLOUD网盘 WebDAV

zotero zotero打开 编辑->首选项->同步 一、数据同步 数据同步&#xff0c;申请并登录zotero账号&#xff0c;免费额度300M&#xff0c;用于存储条目信息。 二、文件同步 有zotero和WebDAV两种形式&#xff0c;zotero是直接把pdf存储在zotero账号中&#xff0c;免费…

【面试问题汇总】

面试问题汇总: Math.round函数:基础加0.5,向下取整 MySQL查询执行流程: 当我们执行一条SQL查询语句时,MySQL数据库会按照以下步骤进行处理: 语法解析器会对SQL语句进行解析,检查SQL语法是否正确。元数据查询器会检查查询的表和字段是否存在,以及当前用户是否具有相应…

前端通过draggable结合fabricjs实现拖拽至画布生成元素自定义编排功能

前端通过draggable结合fabricjs实现拖拽自定义编排功能 太久没有更新了&#xff0c;主要最近行情不太好失业了一段时间&#xff0c;一度到怀疑人生&#xff0c;然后就是做的东西大多没有什么含金量&#xff0c;没什么好分享的就很尴尬。 刚好最近遇到一个奇葩的需求&#xff0…

SparkSQL日期时间模式详解

datatime使用场景 CSV/JSON数据源使用模式字符串来解析和格式化日期时间内容。日期时间函数用于转换StringType类型到DateType或TimestampType类型&#xff0c;反之亦然。例如&#xff0c;unix_timestamp, date_format, to_unix_timestamp, from_unixtime, to_date, to_timest…

SQL AI 工具:颠覆数据库管理与分析的创新力量

一、SQL AI 工具的兴起与发展 在当今数字化的时代&#xff0c;数据量呈现爆炸式增长&#xff0c;企业和个人对于高效管理和分析数据的需求日益迫切。传统的数据库管理和查询方式&#xff0c;对于非技术人员来说存在较高的门槛&#xff0c;操作复杂且耗时。这一背景为 SQL AI 工…

Redis Cluster(无中心化设计)

目录 1 Redis Cluster 的介绍 1.1 Redis Cluster 工作原理 1.2 Redis Cluster特点如下 1.3 Redis cluster 架构 1.4 Redis cluster 主从架构 1.5 Redis Cluster 部署架构说明 1.6 创建redis cluster的前提 2 部署redis cluster 2.1 修改Redis主配置文件参数 2.2 查看端口是否启…

vue 实现简单AI聊天程序(二): python 对接通义千问API

申请账号流程&#xff0c;参考&#xff1a;https://blog.csdn.net/u012917925/article/details/140794192 登录阿里云&#xff0c;然后找到阿里云百炼&#xff0c;创建一个API KEY 配置环境变量&#xff1a;https://help.aliyun.com/zh/model-studio/developer-reference/con…

java直接内存

Java中的内存从广义上可以划分为两个部分&#xff0c;一部分是受JVM管理的堆内存&#xff0c;另一部分则是不受JVM管理的堆外内存&#xff0c;也称为直接内存。直接内存由操作系统来管理&#xff0c;这部分内存的应用可以减少垃圾收集对应用程序的影响。 直接内存概述 直接内…

酒店PMS系统源码之会员系统读取身份证-CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、酒店 PMS&#xff08;&#xff09;会员系统 1. 客户关系管理&#xff1a;帮助酒店有效地管理会员信息&#xff0c;包括个人资料、消费记录、偏好等&#xff0c;从而更好地了解会员需求&#xff0c;提供个性化的服务和优惠。 2. 会员忠诚度提升&#xff1a;通过积分、折扣、…

使用CORS解决跨域问题

CORS&#xff08;Cross-Origin Resource Sharing&#xff09;跨域资源共享 因为浏览器的同源策略才出现了跨域问题。 CORS是一套机制&#xff0c;用于浏览器校验跨域请求。 它的基本理念是&#xff1a; 只要服务器明确表示允许&#xff0c;则校验通过服务器明确拒绝或没有表…

读取FTP中不同文件格式的文件流后导出到浏览器

序言 有一个新的需求&#xff0c;前端提供下载的入口&#xff0c;后端能将指定了全路径的各种文件格式的文件下载到浏览器。 对于压缩的zip文件格式需要解析后写入到txt文件格式的文件中&#xff0c;其他的写入原本的文件格式的文件中。 1、连接ftp <!-- jsch-sftp连接…

构建第一个zk

1 必要步骤 视频学习&#xff1a;5. Circcom 中的基本算术电路_哔哩哔哩_bilibili 文字学习&#xff1a;https://hackmd.io/YlNLZS2ESI21OSqdTW_mPw/S1jqN-h80/edit 第五课&#xff0c;circom实践&#xff0c;需要安装 1 vscode 2 rust&#xff1a;Windows安装Rust环境&…

【C++】模拟(例题 学习)

引言 模拟就是用计算机来模拟题目中要求的操作。 模拟题目通常具有码量大、操作多、思路繁复的特点。由于它代码量大&#xff0c;经常会出现难以查错的情况&#xff0c;如果在考试中写错是相当浪费时间的。 注&#xff1a;模拟没有基础思路和模板&#xff0c;所以要多刷题锻…

vscode中文设置(一招解决)

打开vscode 点击这个Estentions图标 搜索Chinese,直接安装,重启就生效了