32GPIO输入LED闪烁蜂鸣器

news2025/1/18 21:03:37

一.GPIO简介

所有的GPIO都挂载到APB2上,每个GPIO有16个引脚

内核可以通过APB2对寄存器进行读写,寄存器都是32位的,但每个引脚端口只有16位

驱动器用于增加信号的驱动能力

二.具体电路结构



-------------------------------------------------------------------------------------------------------------------------

保护二极管:

如果IO引脚输入电压高于3.3V,那么上面的二极管就会导通,电流会流到VDD

如果IO引脚输入电压低于0V,那么下面的二极管就会导通,电流会流到VSS

如果IO引脚输入电压在0-3.3V之间,那么电流会流到内部电路

这里设置的上下拉电阻,是为了防止设备进入浮空状态,

在使用浮空输入是,端口一定要接上一个连续的驱动源,不能出现悬空状态

-------------------------------------------------------------------------------------------------------------------------

施密特触发器的执行逻辑

如果输入电压大于某一阈值,输出就会瞬间升为高电平

如果输入电压小于某一阈值,输出就会瞬间降为低电平

-------------------------------------------------------------------------------------------------------------------------

推挽模式

所以可以叫强推输出模式

-------------------------------------------------------------------------------------------------------------------------

开漏模式

上面的MOS管会断开,所以只有低电平有驱动能力,高电平没有驱动能力,可以作为通信协议的驱动方式,I2C通信的引脚就是使用的开漏模式,可以避免多个设备的干扰

开漏模式还可以输出5V的电平信号

-------------------------------------------------------------------------------------------------------------------------

三.具体的GPIO模式

一个端口只能有一个输出,但可以有多个输入

四.GPIO的寄存器

GPIO配置寄存器

每个端口的模式由4位进行配置,16个端口需要64位,所以配置寄存器有2个(CRL,CRH)

目的是为了低功耗和稳定性

可以实现同时对多个端口进行位设置和位清除,可以保障位设置和位清除的同步性

但BSRR也可以结合BRR进行先位设置再位清除

五.stm32外部的设备和电路

六.代码实现

一.点亮LED

#include "stm32f10x.h"                  // Device header
//#include "Delay.h"                  
int main()
{
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    while(1)
    {
//        GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
        GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);

    }
    
}

二.LED闪烁

#include "stm32f10x.h"                  // Device header
#include "Delay.h"                  
int main()
{
	GPIO_InitTypeDef GPIO_InitStructure; 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	while(1)
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_0);
		Delay_ms(500);

		GPIO_SetBits(GPIOA,GPIO_Pin_0);
		Delay_ms(500);

		
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
		Delay_ms(500);
	}
	
}

三种LED闪烁书写方式, 最后一种的0和1要转换类型

三.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引脚,赋值为第0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
															//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOA的初始化
	
	/*主循环,循环体内的代码会一直循环执行*/
	while (1)
	{
		GPIO_Write(GPIOA,~0x0001);//0000 0000 0000 0001
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0002);//0000 0000 0000 0010
		Delay_ms(100);	
		GPIO_Write(GPIOA,~0x0004);//0000 0000 0000 0100
		Delay_ms(100);	
		GPIO_Write(GPIOA,~0x0008);//0000 0000 0000 1000
		Delay_ms(100);	
		GPIO_Write(GPIOA,~0x0010);//0000 0000 0001 0000
		Delay_ms(100);	
		GPIO_Write(GPIOA,~0x0020);//0000 0000 0010 0000
		Delay_ms(100);	
		GPIO_Write(GPIOA,~0x0040);//0000 0000 0100 0000
		Delay_ms(100);	
		GPIO_Write(GPIOA,~0x0080);//0000 0000 1000 0000
		Delay_ms(100);
		
	}
}

四.蜂鸣器

使用GPIOB_PB12端口

#include "stm32f10x.h"                  // Device header
#include "Delay.h"                  
int main()
{
	GPIO_InitTypeDef GPIO_InitStructure; 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	while(1)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_12);
		Delay_ms(100);

		GPIO_SetBits(GPIOB,GPIO_Pin_12);
		Delay_ms(100);
		GPIO_ResetBits(GPIOB,GPIO_Pin_12);
		Delay_ms(100);

		GPIO_SetBits(GPIOB,GPIO_Pin_12);
		Delay_ms(700);
		
	}
	
}

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

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

相关文章

Android系统开发之TimeZoneDetectorService浅析--下

TimeZoneDetectorService类图 可以看出TimeZoneDetectorService类,其具体实现是由TimeZoneDetectorStrategy类完成的。 在TimeZoneDetectorService类中,三种更新时区的接口分别为: suggestGeolocationTimeZone() //更新时区主要有三种方式…

linux安装docker-compose

前言 如果你的docker版本是23,请移步到linux安装新版docker(23)和docker-compose这篇博客 查看docker版本命令: docker --version今天安装docker-compose的时候,找了很多教程,但是本地一直报错&#xff0…

【mongoDB】图形化界面工具(mongoDB Compass)

官网地址:https://www.mongodb.com/try/download/compass 下载完之后直接安装 桌面上会产生一个快捷方式 双击就会进入mongoDB图形化界面工具

MMDetection

什么是MMDetection MMDetection实际上是一个用于目标检测的工具包,面向深度学习时代的。 任务支持 目标检测 实例分割 覆盖广泛 440个预训练模型 60篇论文复现 常用学术数据集 算法丰富 两阶段检测器 一阶段检测器 级联检测器 无锚框检测器 Transform…

【HTML 基础】介绍

文章目录 定义作用基本概念1. 标签(Tags)2. 元素(Elements)3. 属性(Attributes)4. 文档结构 总结 HTML(HyperText Markup Language)是构建世界各地互联网页面的基本构建块之一。作为…

BIOS与CMOS的区别

在日常操作和维护计算机的过程中,常常可以听到有关BIOS设置和CMOS设置的一些说法,许多人对BIOS和CMOS经常混为一谈。下面介绍一些BIOS设置和CMOS设置在基本概念上的区分与联系。 BIOS是什么? 所谓BIOS,实际上就是微机的基本输入输出系统&…

实现上下文初始化参数

实现上下文初始化参数 问题方案 要解决上述问题,需要执行以下任务: 创建Web应用程序。创建检索初始化参数的servlet。指定初始化参数。构建Web应用程序。访问servlet。1. 创建Web应用程序 要使用NetBeans IDE创建Web应用程序,需要执行以下步骤: 选择“开始”→“所有程序”…

MySQL-进阶-SQL优化

一、insert优化 插入大量数据 二、主键优化 1、数据组织方式 2、页分裂 3、页合并 4、逐渐设计原则 三、order by优化 四、group by优化 五、limit优化 六、count优化 七、update优化

如何通过 Nginx 反向代理提高网站安全性和性能?

如何通过 Nginx 反向代理提高网站安全性和性能? 引言Nginx 反向代理的基本原理什么是反向代理?反向代理的工作方式反向代理的好处 配置 Nginx 反向代理的基本步骤1. 安装 Nginx2. 编辑 Nginx 配置文件3. 设置反向代理配置4. 测试并重启 Nginx 提高安全性…

函数式接口当参数使用

如果函数式接口作为一个方法的参数,就以为着要方法调用方自己实现业务逻辑,常见的使用场景是一个业务整体逻辑是不相上下的,但是在某一个步骤有不同的逻辑,例如数据处理有不同的策略。上代码 package com.dj.lambda;import java.…

Docker Image(镜像)

Docker镜像是什么 Docker image 本质上是一个 read-only 只读文件,这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。image 里面…

Nestjs 全局拦截器

一、拦截器 拦截器作用: 在函数执行之前、之后绑定额外的逻辑转换函数的返回结果转换从函数抛出的异常扩展基本函数的行为根据所选条件重写函数 期望接口返回一个标准的json格式,利用拦截器对数据做全局的格式化 {code: "200",data: [],mess…

Nginx解析漏洞(nginx_parsing_vulnerability)

目录 Nginx解析漏洞 环境搭建 复现 漏洞利用 Nginx解析漏洞 NGINX解析漏洞主要是由于NGINX配置文件以及PHP配置文件的错误配置导致的。这个漏洞与NGINX、PHP版本无关,属于用户配置不当造成的解析漏洞。具体来说,由于nginx.conf的配置导致nginx把…

在JavaScript中创建自定义错误

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ 目录 ✨ 前言 ✨ 正文 简介 创建自定义错误 自定义错误属性 instanceof 检…

C#实现对任意区域任意大小的截图

1,目的: 实现类似系统截图工具那样对屏幕任何区域自定义大小的截图。 2,效果展示: 点击截图 选择需要截图的区域: 区域选择完成后,单击右键完成截图: 在合适的载体上粘贴截图: 3,…

【笔记】顺利通过EMC试验(1-15)-视频笔记

目录 视频链接 P2:电子设备的电磁兼容性要求 P3:怎样分析一个电磁兼容的问题 P4:EMC试验注意事项 P5:骚扰源有什么特征 P6:什么是传导骚扰发射 P7:什么是辐射骚扰发射 P8:环路天线的辐射特性 P9:偶极天线的辐…

QT之 QDebug 调试(一)

在QT中&#xff0c;进行调试&#xff0c;则需要在头文件地方加上 #include <QDebug> 加上之后&#xff0c;在编译之后则其输出的信息则在应用程序输出那里显示信息。 其QDebug 信息调试则如&#xff1a; qDebug() << " 需要插入的信息 "…

【Linux】从C语言文件操作 到Linux文件IO | 文件系统调用

文章目录 前言一、C语言文件I/O复习文件操作&#xff1a;打开和关闭文件操作&#xff1a;顺序读写文件操作&#xff1a;随机读写stdin、stdout、stderr 二、承上启下三、Linux系统的文件I/O系统调用接口介绍open()close()read()write()lseek() Linux文件相关重点 复习C文件IO相…

南京观海微电子---如何减少时序报告中的逻辑延迟

1. 引言 在FPGA逻辑电路设计中&#xff0c;FPGA设计能达到的最高性能往往由以下因素决定&#xff1a; ▪ 工作时钟偏移和时钟不确定性&#xff1b; ▪ 逻辑延迟&#xff1a;在一个时钟周期内信号经过的逻辑量&#xff1b; ▪ 网络或路径延迟&#xff1a;Vivado布局布线后引…

网络服务综合练习

综合练习&#xff1a;请给openlab搭建web网站 网站需求&#xff1a; 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料 和缴费网站&#xff0c;基于&#xff0c;www.openlab.com/data网…