【STM32】LED闪烁LED流水灯蜂鸣器(江科大)

news2025/1/24 14:02:16

在这里插入图片描述
LED正极:外部长脚、内部较小
LED负极:外部短脚、内部较大
在这里插入图片描述
LED电路
限流电阻:保护LED,调节LED亮度(本实验用面包板为了方便,省去了限流电阻,设计电路时要加上)
左上图:低电平驱动 左下图:高电平驱动
GPIO在推挽输出模式下,高低电平均有较强的驱动能力,在这里两种接法均可,但在单片机的电路里,一般倾向使用第一种接法,因为很多单片机或芯片,都使用了高电平弱驱动,低电平强驱动的规则,可以一定程度上避免高低电平打架,所以如果高电平驱动能力弱,就不能使用第二种接法。
蜂鸣器电路
三极管开关是最简单的驱动电路,对于功率稍微大一点的,直接用IO口驱动会导致STM32负担过重,这时就可以用一个三极管驱动电路来完成驱动的任务。
右上图是PNP三极管的驱动电路,三极管的左边是基极,带箭头的是发射极,剩下的是集电极。基极给低电平三极管就会导通,通过3.3V和GND就可以给蜂鸣器提供驱动电流;基极给高电平三极管截止,蜂鸣器没有电流。
右下图是NPN三极管的驱动电路,同样三极管的左边是基极,带箭头的是发射极,剩下的是集电极。它的驱动逻辑跟上面的相反,基极给高电平导通,低电平断开。
注意PNP的三极管最好接在上边,NPN的三极管最好接在下边,这时因为三极管的通断,是需要在发射极和基极直接产生一定的开启电压的,如果把负载(蜂鸣器)接在发射极这边,可能会导致三极管不能开启。
在这里插入图片描述

一、LED闪烁

在这里插入图片描述
操作STM32的GPIO共需要3个步骤
1.使用RCC开启GPIO的时钟
2.使用GPIO_Init函数初始化GPIO
3.使用输出或者输入的函数控制GPIO口
在这里总共涉及了RCC和GPIO两个外设
RCC库函数
在这里插入图片描述
在Library中找到rcc.h文件,RCC有很多库函数,但大部分用不到,最常用的只有三个函数:RCC AHB外设时钟控制、RCC APB2外设时钟控制、RCC APB1外设时钟控制


在这里插入图片描述
右键跳转到函数定义,AHB外设时钟控制的函数就是使能或者失能AHB外设时钟的


在这里插入图片描述
下面介绍第一个参数就是选择哪个外设


在这里插入图片描述
STM32互联型的设备可以在这个列表选择


在这里插入图片描述
其他设备在下面这个列表选择


在这里插入图片描述

接着第二个参数就是ENABLE或者DISABLE


然后下面的APB2外设时钟控制和APB1外设时钟控制都是一样的操作方法,第一个参数选择外设,第二个参数使能或失能
GPIO库函数
打开gpio.h的文件
在这里插入图片描述
目前需要了解这些函数
1.GPIO_DeInit,参数可以写GPIOA、GPIOB等等,调用这个函数后,所指定的GPIO外设就会被复位
2.AFIO_DeInit也是一样,可以复位AFIO外设
3.GPIO_Init是非常重要的函数,这个函数的作用是,用结构体的参数来初始化GPIO口。需要先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数,这个函数内部就会自动读取结构体的值,然后自动把外设的各个参数配置好,这种Init函数在STM32中基本所有的外设都有,一般初始化外设都是使用这个Init函数来完成的
4.GPIO_StructInit函数可以把结构体变量赋一个默认值
5.接下来四个是GPIO的读取函数,再下面四个是GPIO的写入函数,这些函数可以实现读写GPIO口的功能
调用RCC里面的APB2外设时钟控制函数
在这里插入图片描述
复制粘贴到main.c,右键跳转到定义
在这里插入图片描述
要点亮PA0口的LED,所以选择RCC_APB2外设_GPIOA这一项,放到第一个参数
在这里插入图片描述
第二个参数选择ENABLE,放到第二个参数
在这里插入图片描述
调用GPIO_Init函数
第一个参数选择GPIOA;第二个参数是一个结构体,先把结构体类型复制下来
在这里插入图片描述
在GPIO_Init上面粘贴,起个名字叫GPIO_InitStructure,这里这个结构体实际上也是一种局部变量
接着复制结构体名字,用点把结构体的成员都引出来,右键跳转,看一下说明,复制粘贴一下参数
最后把GPIO初始化结构体的地址放到GPIO_Init的第二个参数,这样初始化就完成了,当GPIO_Init函数执行完,这个GPIOA外设的0号引脚就自动被配置为推挽输出、50MHz的速度,它内部的主要执行逻辑就是读取结构体的参数、执行一堆判断和运算、最后写入到GPIO配置寄存器
在这里插入图片描述
在这里插入图片描述

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
															//使用各个外设前必须开启时钟,否则对外设的操作无效
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//GPIO引脚,赋值为第0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
															//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOA的初始化
	
	/*主循环,循环体内的代码会一直循环执行*/
	while (1)
	{
		/*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/
		
		/*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_SetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms
		
		/*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);		//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);			//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms
		
		/*方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型*/
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);		//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);		//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms
	}
}

二、LED流水灯

在这里插入图片描述

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
															//使用各个外设前必须开启时钟,否则对外设的操作无效
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;				//GPIO引脚,赋值为所有引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
															//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOA的初始化
	
	/*主循环,循环体内的代码会一直循环执行*/
	while (1)
	{
		/*使用GPIO_Write,同时设置GPIOA所有引脚的高低电平,实现LED流水灯*/
		GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001,PA0引脚为低电平,其他引脚均为高电平,注意数据有按位取反
		Delay_ms(100);				//延时100ms
		GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010,PA1引脚为低电平,其他引脚均为高电平
		Delay_ms(100);				//延时100ms
		GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100,PA2引脚为低电平,其他引脚均为高电平
		Delay_ms(100);				//延时100ms
		GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000,PA3引脚为低电平,其他引脚均为高电平
		Delay_ms(100);				//延时100ms
		GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000,PA4引脚为低电平,其他引脚均为高电平
		Delay_ms(100);				//延时100ms
		GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000,PA5引脚为低电平,其他引脚均为高电平
		Delay_ms(100);				//延时100ms
		GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000,PA6引脚为低电平,其他引脚均为高电平
		Delay_ms(100);				//延时100ms
		GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000,PA7引脚为低电平,其他引脚均为高电平
		Delay_ms(100);				//延时100ms
	}
}

三、蜂鸣器

在这里插入图片描述

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//开启GPIOB的时钟
															//使用各个外设前必须开启时钟,否则对外设的操作无效
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;				//GPIO引脚,赋值为第12号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
															//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOB的初始化
	
	/*主循环,循环体内的代码会一直循环执行*/
	while (1)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为低电平,蜂鸣器鸣叫
		Delay_ms(100);							//延时100ms
		GPIO_SetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为高电平,蜂鸣器停止
		Delay_ms(100);							//延时100ms
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为低电平,蜂鸣器鸣叫
		Delay_ms(100);							//延时100ms
		GPIO_SetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为高电平,蜂鸣器停止
		Delay_ms(700);							//延时700ms
	}
}

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

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

相关文章

ubuntu2204配置anacondacuda4090nvidia驱动

背景 某个机房的几台机器前段时间通过dnat暴露至公网后被入侵挖矿,为避免一些安全隐患将这几台机器执行重装系统操作; 这里主要记录配置nvidia驱动及cuda&anaconda。 步骤 大概分为几个步骤 禁用nouveau配置grub显示菜单install nvidia-driveri…

Linux——远程连接服务器

sshd服务端 ssh客户端 ssh 服务配置 #ssh 服务安装包 openssh-server [rootserver1 ~] # vim /etc/ssh/sshd_config 17 . #Port 22 # 监听端口,默认监听 22 端口 【默认可修改】 18 . #AddressFamily any #IPV4 和 IPV6 协议家族用哪个, any 表示二者…

Python莫兰生死抑制放大进化图

🎯要点 🎯种群离散时间莫兰生死动态图解 | 🎯良好混合种群的固定概率 | 🎯数值求解生成埃尔多斯-雷尼图 | 🎯计算马尔可夫链的转移矩阵概率 | 🎯出生死亡动态和死亡出生动态概率无向随机图和有向随机图&am…

【数据结构】树和二叉树——Lesson1

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

一个小问题导致,AI大模型集体翻车?

9.11大还是9.9大? 这两天大家都在说ChatGPT大模型翻车了 ! 这到底是怎么个事儿呢? 原来是最近有人想ChatGPT等大模型提了一个简单的问题: 9.11 大还是 9.9 大? 答案显而易见,然而众多大模型却给出了错误…

基于JAVA+SpringBoot+Vue的oa系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、SpringCloud、Layui、Echarts图表、Nodejs、爬…

【高性能服务器】poll模型

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 poll模型 关于sel…

算法-计数质数

题目: 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 思路: 使用埃式筛法 当n大于等于2时,如果当前遍历的数 i 是质数,那么从 i*i 开始,直到 n 为止,把 i 的倍数都标记为合数 代码&a…

一个关于STM32的DAC输出的遗忘点

众所周知熟练使用HAL库可以帮你解决不少stm32的开发难题,但是是谁让你陷入了这些难题,别问。 如上图所示,正常初始化这个模块后生成代码如下图所示; * DAC init function */ void MX_DAC_Init(void) {/* USER CODE BEGIN DAC_Ini…

【LabVIEW作业篇 - 3】:数组相加、for循环创建二位数组、数组练习(求最大最小值、平均值、中位数、提取范围内的数据、排序)

文章目录 数组相加for循环实现直接使用加函数 for循环创建二位数组数组练习 数组相加 要求:用两种方法实现两个数组相加 for循环实现 在前面板中分别创建两个数值类型的一维数组,并设置相应的值,然后在程序框图中创建一个for循环&#xff…

数据结构(Java):力扣牛客 二叉树面试OJ题(一)

👉 ​​​​​​目录 👈 1、题一:检查两棵树是否相同 1.1 思路分析 1.2 代码 2、题二:另一棵树的子树 2.1 思路分析 2.2 代码 3、题三:翻转二叉树 3.1 思路分析 3.2 代码 4、题四:判断树是否对称 …

小模型大突破!神经网络透视空间异质性,准确描述复杂地理现象

为推进 AI4S 的普适化,降低学术机构科研成果的传播壁垒,为更多行业学者、科技爱好者及产业单位提供交流平台,HyperAI超神经策划了「Meet AI4S」系列直播栏目, 邀请深耕 AI for Science 领域的科研人员或相关单位,以视频…

新时代多目标优化【数学建模】领域的极致探索——数学规划模型

目录 例1 1.问题重述 2.基本模型 变量定义: 目标函数: 约束条件: 3.模型分析与假设 4.模型求解 5.LINGO代码实现 6.结果解释 ​编辑 7.敏感性分析 8.结果解释 例2 奶制品的销售计划 1.问题重述 ​编辑 2.基本模型 3.模…

北京邮电大学,中央空调的分户计费系统

北京邮电大学 中央空调如何公平、公正、合理的收取费用,一直都是各建筑管理者的首要问题。北京邮电大学也面临着能源分配不公,学校管理者空调收费管理困难等问题。根据学校的具体情况,拓森为其制定了一套中央空调管理运营方案—无线中央空调…

jupyter学习笔记

简介 Jupyter Notebook是一个Web应用程序,它可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示。 安装使用 前提:必须安装python 先升级pip至最新版本 pip3 install --upgrade pip安装jupyter notebook pi…

springboot的简单应用

Mvc与三层架构 创建Spring项目 勾选web和mabais框架 配置yml文件,这里创建spring项目默认生成的是propertise文件,但是properties文件的格式看起来没有yml文件一目了然。yml文件配置数据库还有映射mapper层的xml文件以及设置日志级别,比如map…

刚起步的家庭海外仓:涉及到的全部业务优化流程

对于家庭海外仓来说,最难的阶段应该就是刚起步的时候。对业务流程不熟悉,也没有客户积累,本身的预算又十分有限。 在这个情况下应该注意什么,怎样才能顺利的开展业务?今天我们就针对这个问题详细的梳理了一下家庭海外…

尚品汇-(二十一)

目录: (1)使用redis实现分布式锁 (2)优化之设置锁的过期时间 (3.)优化之UUID防误删 (4)优化之LUA脚本保证删除的原子性 (1)使用redis实现分布…

go语言编程 小试牛刀 goroutine和reflect知识点

(一)goroutine package _caseimport "fmt"// sum 函数计算整数切片 values 的总和,并将结果发送到 resultChan 通道中 func sum(values []int, resultChan chan int) {sum : 0for _, value : range values {sum value}resultChan…

HarmonyOS NEXT学习——@Styles、@Extend、stateStyles

Styles装饰器 定义组件重用样式 仅支持通用属性和通用事件不支持参数可以定义全局和组件内使用,全局使用需要加function // 全局 Styles function functionName() { ... }// 在组件内 Component struct FancyUse {Styles fancy() {.height(100)} }组件内Styles的优…