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

在这里插入图片描述
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速度,赋值为50MHzGPIO_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);										//延时500msGPIO_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);										//延时500msGPIO_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);										//延时500msGPIO_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速度,赋值为50MHzGPIO_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);				//延时100msGPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010,PA1引脚为低电平,其他引脚均为高电平Delay_ms(100);				//延时100msGPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100,PA2引脚为低电平,其他引脚均为高电平Delay_ms(100);				//延时100msGPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000,PA3引脚为低电平,其他引脚均为高电平Delay_ms(100);				//延时100msGPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000,PA4引脚为低电平,其他引脚均为高电平Delay_ms(100);				//延时100msGPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000,PA5引脚为低电平,其他引脚均为高电平Delay_ms(100);				//延时100msGPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000,PA6引脚为低电平,其他引脚均为高电平Delay_ms(100);				//延时100msGPIO_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速度,赋值为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数//函数内部会自动根据结构体的参数配置相应寄存器//实现GPIOB的初始化/*主循环,循环体内的代码会一直循环执行*/while (1){GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为低电平,蜂鸣器鸣叫Delay_ms(100);							//延时100msGPIO_SetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为高电平,蜂鸣器停止Delay_ms(100);							//延时100msGPIO_ResetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为低电平,蜂鸣器鸣叫Delay_ms(100);							//延时100msGPIO_SetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为高电平,蜂鸣器停止Delay_ms(700);							//延时700ms}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【golang-ent】go-zero框架 整合 ent orm框架 | 解决left join未关联报错的问题

一、场景 1、子表:cp_member_point_history cp_member_point_history表中字段:cp_point_reward_id 是cp_point_reward的主键id 当本表中的cp_point_reward_id字段为0(即:没有可关联主表的) CREATE TABLE cp_member_poi…

“社群+”生态下的开源AI智能名片源码:驱动商业与社会连接的新引擎

摘要:在“社群”生态日益成为主流趋势的今天,开源AI智能名片源码作为技术创新与社群运营的深度融合体,正逐步展现出其重塑商业格局、深化社会连接的巨大潜力。本文旨在深入探讨开源AI智能名片源码的技术特性、在“社群”生态中的具体应用、对…

Java线程池ThreadPoolExecutor原理、源码分析

目录 为什么要使用线程池? 线程池执行任务的具体流程是怎样的? 线程池的五种状态是如何流转的? 线程池中的线程是如何关闭的? 线程池为什么一定得是阻塞队列? 线程发生异常,会被移出线程池吗&#xff…

【产品那些事】固件安全-关于OTA升级包分析

文章目录 前言什么是OTA?升级包(固件)的类型和架构案例tp-link路由器升级包怎么解包分析?binwalk安装及使用ubi_reader安装及使用unsquashfs安装及使用某车企OTA升级包通用Android OTA解包相关分区第二层解包前言 什么是OTA? OTA(Over-the-Air)是一种通过无线通信网络(…

Golang | Leetcode Golang题解之第237题删除链表中的节点

题目: 题解: func deleteNode(node *ListNode) {node.Val node.Next.Valnode.Next node.Next.Next }

华为“铁三角模式”在数据类项目中的应用和价值

引言:随着信息技术的飞速发展,企业纷纷踏上数字化转型的道路,希望通过数据分析和智能决策来提升企业竞争力。在这一过程中,数据类项目成为关键,它们旨在构建高效的数据治理和分析平台,为企业决策提供有力支…

如何打造高效电子邮件流程?附客户生命周期邮件策略!

一个成功的EDM邮件需要包含多个关键元素,从内容、设计到呼唤行动,每个环节都至关重要。今天咱们来聊聊怎么通过电子邮件,帮那些想要出海的中国中小企业吸引更多客户。别小看这一封封邮件,它们可是连接你和客户的秘密武器&#xff…

Qt模型/视图架构——委托(delegate)

一、为什么需要委托 模型(model)用来数据存储,视图(view)用来展示数据。因此,模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示: 由图可知,模型向视图提供数…

react 快速入门思维导图

在掌握了react中一下的几个步骤和语法,基本上就可以熟练的使用react了。 1、组件的使用。react创建组件主要是类组件和函数式组件,类组件有生命周期,而函数式组件没有。 2、jsx语法。react主要使用jsx语法,需要使用babel和webpa…

C/C++蓝屏整人代码

文章目录 📒程序效果 📒具体步骤 1.隐藏任务栏 2.调整cmd窗口大小 3.调整cmd窗口屏幕颜色 4.完整代码 📒代码详解 🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主&a…

Spring Web MVC入门(2)(请求2)

目录 1.传递JSON数据 传递JSON对象 2.获取URL中的参数PathVariable 3.上传文件RequestPart 4.获取Cookie/Session (1)获取Cookie 简洁获取Cookie (2)获取Session Sesson读取 简洁获取Session(1) 简洁获取Session(2) 5.获取Header 简洁获取Header 1.传递JSON数据 J…

如何写好建模论文

如何写好建模论文 一、 写好数模答卷的重要性 1.评定参赛队的成绩好坏、高低,获奖级别, 数模答卷, 是唯一依据。 2.答卷是竞赛活动的成绩结晶的书面形式。 3.写好答卷的训练,是科技写作的一种基本训练。 二、 答卷的基本内容&…

从零开始学量化~Ptrade使用教程(六)——盘后定价交易、港股通与债券通用质押式回购

盘后固定价交易 实现科创板、创业板的盘后固定价交易,界面如下显示: 交易 输入科创板或创业板代码,选择委托方向,输入委托价格、委托数量,点击“买入”或“卖出”按钮进行委托。可出现一个委托提示框提示是否继续委托操…

QtC++ 设计模式(五)——状态模式

状态模式 序言理解源码 序言 设计模式只是一个抽象的设计模式方法,并不是一个固定使用的搭配,就算是普通switch语句,Map,乃至状态机都是状态模式的其中一种实现方法 状态模式看起来好像和策略模式差不多,主要是其的侧…

MySQL下载安装使用教程图文教程(超详细)

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们使…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】 Message Queue 消息队列异步处理应用解耦流量控制 消息中间件概念RabbitMQ概念MessagePublisherExchangeQueueBindingConnectionChannelConsumerVirtual HostBroker图…

内容长度不同的div如何自动对齐展示

平时我们经常会遇到页面内容div结构相同页,这时为了美观我们会希望div会对齐展示,但当div里的文字长度不一时又不想写固定高度,就会出现div长度长长短短,此时实现样式可以这样写: .e-commerce-Wrap {display: flex;fle…

WebSocket、服务器推送技术

WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议,它可以让客户端和服务器之间进行实时的双向通信,且不存在同源策略限制 WebSocket 使用一个长连接,在客户端和服务器之间保持持久的连接,从而可以实时地发送和接收数据…

基于JAVA+SpringBoot+uniapp的心理小程序(小程序版本)

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

如何在web页面下做自动化测试?

自动化测试是在软件开发中非常重要的一环,它可以提高测试效率并减少错误率。在web页面下进行自动化测试,可以帮助我们验证网页的功能和交互,并确保它们在不同浏览器和平台上的一致性。本文将从零开始,详细介绍如何在web页面下进行…