GPIO相关寄存器,点灯

news2025/1/3 15:41:34

目录

一.输入模式

1.浮空输入

2.上拉输入

3.下拉输入

4.模拟输入

二.输出模式

1.推挽输出

2.开漏输出

三.寄存器

1.寄存器的作用

2.功能与类型

3.控制某一引脚输出电压来点灯所需要控制的寄存器

        1.打开对应时钟开关

        2.端口模式寄存器    ---输出模式

        3.输出类型寄存器    ---推挽模式

        4.输出速度寄存器    ---低速

        5.上下拉寄存器     ---既不上拉也不下拉

        6..输出数据寄存器  

四.库函数点灯

五.按键消抖

1.消抖

2.解决方法

2.1 延时消抖

2.抬手检测

六.光电开关

一.输入模式

1.浮空输入

        此模式下,GPIO引脚的高低电平完全由外部输入决定。由于电平状态不确定,因此该模式容易受到外部干扰。浮空输入模式最常用于检测按键的按下状态,因为按键按下时,引脚电平会发生变化。

2.上拉输入

        在此模式下,当GPIO引脚未连接外部信号时,通过内部的上拉电阻将引脚电平保持为高电平。如果外部对该引脚施加一个低电平信号,会改变引脚状态为低电平。这种模式常用于需要默认高电平的场合。

3.下拉输入

        与上拉输入相反,下拉输入模式下,当GPIO引脚未连接外部信号时,通过内部的下拉电阻将引脚电平保持为低电平。如果外部对该引脚施加一个高电平信号,会改变引脚状态为高电平。这种模式常用于需要默认低电平的场合。

4.模拟输入

        在此模式下,GPIO可以检测外部输入的模拟电压,并将其采样转化为数字信号。只要外部电压不高于Vcc(电源电压),就可以被GPIO检测。

二.输出模式

1.推挽输出

  • 工作原理:在此模式下,GPIO引脚可以输出高电平(通常为Vcc)或低电平(0V)。这是通过控制内部的P-MOS和N-MOS管来实现的。当P-MOS管闭合,N-MOS管断开时,输出高电平;当P-MOS管断开,N-MOS管闭合时,输出低电平。
  • 应用场景:推挽输出模式适用于需要高速切换和高负载能力的场合,如驱动LED指示灯、继电器等。
  • 复用推挽输出(Alternate Function Push-Pull Output):在此模式下,GPIO引脚不仅可以输出高电平或低电平,还可以通过内部上拉电阻确保高电平时的稳定性。这种模式常用于SPI、UART等通信协议中的MOSI、MISO、SCK线路。

2.开漏输出

  • 工作原理:在开漏输出模式下,P-MOS关闭,GPIO引脚只能输出低电平(接地),不能主动提供高电平。因此,通常需要外部或内部上拉电阻来提供高电平。
  • 应用场景:开漏输出模式常用于需要多个设备共享同一条总线的场合,如I²C总线通信。此外,它还可以用于电平转换和不同电压系统之间的信号传输。3.复用
  • 复用开漏输出(Alternate Function Open-Drain Output):与复用推挽输出类似,但只能输出低电平。这种模式同样适用于需要多个设备共享同一条总线的场合,如I²C总线通信。

三.寄存器

1.寄存器的作用

  1. 寄存器是单片机内部的一些存储单元
  2. 单片机的设置和寄存器直接关联,比如输出模式,比如输入输出的电压,比如上下拉电阻是否打开,所以,想要对单片机进行设置就是对寄存器进行改写的过程。

2.功能与类型

  1. 功能

    • 存储二进制代码:寄存器的主要功能是存储二进制代码,这些代码可以是数据、指令或地址。
    • 高速访问:由于寄存器位于CPU内部,其访问速度远快于内存和外部存储设备。
    • 暂存数据:寄存器可以用于存储中间结果,避免频繁访问内存,从而提高计算效率。
  2. 类型

    • 按照功能分类:基本寄存器和移位寄存器。基本寄存器只能并行送入和输出数据,而移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据输入输出方式更加灵活。
    • 按照用途分类:通用寄存器、专用寄存器、浮点寄存器、向量寄存器、状态寄存器和特殊寄存器等。通用寄存器用于存储临时数据,专用寄存器用于存储特定类型的数据或执行特定功能,浮点寄存器用于存储浮点数据,向量寄存器用于存储向量数据,状态寄存器用于存储运算结果的状态信息,特殊寄存器则用于实现特定的控制功能。

3.控制某一引脚输出电压来点灯所需要控制的寄存器

        1.打开对应时钟开关


 

思路:

        我们的目的是使用PC13,所以要先打开C引脚组时钟。通过寻找内存架构找到了RCC相关的寄存器组,RCC寄存器组里的寄存器太多了。找到控制引脚组的RCC寄存器需要找到GPIO属于哪个总线上的(AHB1\APB1\APB2\PHB2等),通过查内存分配架构图可知,GPIO在AHB2总线上,所以,我们定位到了RCC_AHB2ENR1

        2.端口模式寄存器    ---输出模式

        3.输出类型寄存器    ---推挽模式

        4.输出速度寄存器    ---低速

        5.上下拉寄存器     ---既不上拉也不下拉

        6..输出数据寄存器  

  1. 打开时钟:RCC_AHB2ENR1 给第2位写1
  2. 配置端口模式寄存器 配置为输出模式 GPIOC_MODER 第27、26位写 0 1
  3. 配置输出类型寄存器 配置为推挽输出 GPIOC_OTYPER 第13位写0
  4. 配置输出速度数据寄存器 配置为很低 GPIOC_OSPEEDR 第 27、26位写 0 0
  5. 配置上下拉寄存器 配置为既不用上拉也不下拉 GPIOC_PUPDR 第27、26位写0 0
  6. 配置输出数据寄存器 给PC13引脚写1 GPIOC_ODR 第13位写1
GPIOC_MODER    : 0x5202 0800+0X00=0x5202 0800
GPIOC_OTYPER   : 0x5202 0800+0X04=0x5202 0804
GPIOC_OSPEEDR :  0x5202 0800+0X08=0x5202 0808
GPIOC_PUPDR    :0x5202 0800+0X0C=0x5202 080C
GPIOc_ODR       :0x5202 0800+0X14=0x5202 0814
void SystemInit(void)
{
	*(unsigned int*) 0xE000ED88|=((3UL << 20U)|(3UL << 22U));

}
void delay(int T);

typedef struct{
	unsigned int	MODER;
	unsigned int	OTYPER;
	unsigned int  SPEED;
	unsigned int	PUPDR;
	unsigned int	IDR;	
	unsigned int	ODR;
}GPIO;

#define GPIOC 			(*(GPIO *)0x52020800)
#define RCC_AHB2ENR1		*(unsigned int *)0x56020C8C

int main(void)
{
	RCC_AHB2ENR1 |= 1<<2;//配置RCC_AHB2ENR1的第2位置1,打开时钟
	GPIOC.MODER |= 1<<26;//GPIOC_MODER 的第26位置1,配置输出
	GPIOC.MODER &= ~(1<<27);//GPIOC_MODER 的第27位置0,配置输出
	GPIOC.OTYPER &= ~(1<<13);//GPIOC_OTYPER 的第13位置0,配置推挽
	GPIOC.SPEED &= ~(3<<26);//GPIOC_OSPPEDR 第27、26位置0
	GPIOC.PUPDR &= ~(3<<26);//GPIOC_PUPDR 第27、26位置0
	GPIOC.ODR |= 1<<13;//GPIOC_ODR 第13位置1
		while(1)
		{
			  GPIOC.ODR |= 1<<13;//GPIOC_ODR 第13位置1
				delay(1000);
				GPIOC.ODR &= ~(1<<13);//GPIOC_ODR 第13位置0	
				delay(1000);			
		}
}

void delay(int T)
{
    int a,b;
    for(a=0;a<T;a++)
			for(b=0;b<100;b++);
}

四.库函数点灯

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
功能: 设置或清除指定的端口位
参数:GPIO_TypeDef *GPIOx  端口号
           uint16_t GPIO_Pin         引脚号
           GPIO_PinState PinState  电平状态
                        GPIO_PIN_SET         1 
                        GPIO_PIN_RESET    0
返回值:无

void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t  GPIO_Pin) 
功能: 切换指定的引脚电平状态
参数:GPIO_TypeDef * GPIOx  端口号
            uint16_t  GPIO_Pin     引脚号
返回值:无

GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx,  uint16_t GPIO_Pin) 
功能: 读取指定的引脚电平状态
参数:GPIO_TypeDef * GPIOx  端口号
            uint16_t  GPIO_Pin     引脚号
返回值:GPIO_PinState 电平状态
              GPIO_PIN_RESET   0
              GPIO_PIN_SET        1

HAL_Delay()单位毫秒

五.按键消抖

当按键未按下,PC9为高电平
当按键被按下,PC9为低电平,所以,检测PC9是否为低电平就可以直到PC9是否按下了

1.消抖

抖动原因:
        任何的机械按键都会有抖动,而且人手按下抬起并不是一瞬间的,人抬手是需要反应时间的,所以会导致按下的低电平时间过长,导致多次误进if判断语句,所以会多次切换状态,导致误判。

2.解决方法

2.1 延时消抖

2.抬手检测

六.光电开关

遮挡-->PE15输出高电平--->PB2输入高电平
无遮挡-->PE15输出低电平--->PB2输入低电平

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

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

相关文章

【基础篇】三、MySQL表结构的操作

文章目录 Ⅰ. 创建表1、语法2、创建表样例3、创建和其它表一样结构的表 Ⅱ. 查看表结构1、查看数据库中的表2、查看指定表的属性3、获取表的创建语句 Ⅲ. 删除表Ⅳ. 修改表结构1、向表中插入新的字段2、删除表中的字段3、修改表名4、修改字段属性 Ⅰ. 创建表 1、语法 create …

Ethernet 系列(12)-- 基础学习::SOME/IP

目录 1. SOME/IP简介&#xff1a; 1.1 什么是SOME/IP&#xff1a; 1.2 什么时候使用SOME/IP&#xff1a; 2. SOME/IP的特点&#xff1a; 2.1 序列化&#xff1a; 2.2 远程过程调用&#xff08;RPC&#xff09;: 2.3 服务发现&#xff1a; 2.4 发布/订阅&#xff1a; 2.5 UDP消息…

前端小案例——轮播图(HTML+CSS+JS, 附源码)

一、前言 实现功能&#xff1a; 显示多张图片&#xff0c;每张图片占据轮播图容器的一部分空间。实现向左和向右的切换按钮&#xff0c;可以点击按钮切换到上一张或下一张图片。在底部显示小圆点&#xff0c;表示当前显示的图片&#xff0c;点击小圆点可以跳转到对应的图片。…

vue封装弹窗元素拖动指令

项目开发过程中我们通常会遇到需要到一些弹窗鼠标可以随意拖动位置去放置&#xff0c;vue里面直接通过封装对应的指令即可&#xff0c;于是封装了一个出来&#xff0c;希望可以用到。 Vue.directive(draggable-dom, draggableDom); 组件节点添加对应指令就可以 v-draggable-…

Supermap iClient Webgl 粒子特效案例-消防场景

作者&#xff1a;Lzzzz 前言 WebGL 粒子特效的应用场景非常广泛&#xff0c;几乎可以在任何需要丰富视觉效果或动态表现的地方看到其身影。通过灵活运用颗粒系统&#xff0c;开发者可以创造出引人入胜的用户体验和视觉表现。 一、效果展示 二、实现步骤 1&#xff0c;构建…

关于无线AP信道调整的优化(锐捷)

目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰&#xff0c;提高网络覆盖范围和信号质量。基本原则包括&#xff1a; 1. 选择合适的信道&#xff1a;根据…

Rocky9网络基本连接配置

1.修改主机名称 终端模式下&#xff1a; hostnamectl set-hostname server2执行过程中可能要输入密码 hostnamectl命令查看主机信息&#xff0c;可以查看到主机信息已经发生修改&#xff0c;之后reboot重启主机。 2.关闭防火墙 systemctl stop firewalld systemctl disable fi…

一款汽车连接器(HSD(4+2))信号完整性仿真

下面是一款汽车连接器HSD(42) 的3D外形&#xff1a; 其爆炸图如下&#xff1a; 下面是Rosenboger同款产品的2D图&#xff1a; 其信号完整性参数如下&#xff1a; 下面介绍一下如何给上面的3D模型做信号完整性仿真。 在介绍仿真前先介绍一下上面的一些参数&#xff1a;上面的参数…

动手做计算机网络仿真实验入门学习

打开软件 work1 添加串行接口模块&#xff0c;先关电源&#xff0c;添加之后再开电源 自动选择连接 所有传输介质 自动连接 串行线 绿色是通的&#xff0c;红色是不通的。 显示接口。se是serial串行的简写。 Fa是fast ethernet的简写。 为计算机配置ip地址&#xff1a; 为服…

在React中引入tailwind css(图文详解)

Tailwind CSS 是一个功能强大的 CSS 框架&#xff0c;旨在使开发者能够以更高效、灵活的方式创建现代、响应式的网页。与传统的 CSS 框架&#xff08;如 Bootstrap 或 Foundation&#xff09;不同&#xff0c;Tailwind 采取了“实用类”&#xff08;Utility-First&#xff09;的…

考公怎么安排学习顺序?

考公的学习顺序安排至关重要&#xff0c;合理规划能让备考事半功倍。以下是结合 “稳啦” 小程序的推荐学习顺序。 1. 初步了解考情&#xff08;使用稳啦的各省考情模块&#xff09; 在备考初期&#xff0c;首先要做的就是全面了解公务员考试的基本情况。通过稳啦的各省考情模…

C 语言:printf 函数详解

目录 引言 一、printf 函数的基本介绍 二、printf 的格式化输出 三、printf 的转义序列 四、printf 的返回值 五、printf 的高级用法 六、printf 的注意事项 七、总结 引言 在 C 语言的编程世界里&#xff0c;printf函数无疑是一个极为强大且常用的工具。它不仅能够输出…

计算机网络-L2TP VPN基础实验配置

一、概述 上次大概了解了L2TP的基本原理和使用场景&#xff0c;今天来模拟一个小实验&#xff0c;使用Ensp的网卡桥接到本地电脑试下L2TP拨号&#xff0c;今天主要使用标准的L2TP&#xff0c;其实在这个基础上可以加上IPSec进行加密&#xff0c;提高安全性。 网络拓扑 拓扑说明…

Postman[7] 内置动态参数及自定义的动态参数

postman 内置动态参数和自定义的动态参数 1.内置动态参数 格式&#xff1a;{{$参数名}} 1.1时间戳 {{$timestamp}} //生成当前时间的时间戳 1.2随机整数 {{$randomint}} //生成0-1000之间的随机数 1.3GUID字符串 {{$guid}} //生成随机GUID字符串 2.自定义动态参数 格式…

uniapp-vue3(下)

关联链接&#xff1a;uniapp-vue3&#xff08;上&#xff09; 文章目录 七、咸虾米壁纸项目实战7.1.咸虾米壁纸项目概述7.2.项目初始化公共目录和设计稿尺寸测量工具7.3.banner海报swiper轮播器7.4.使用swiper的纵向轮播做公告区域7.5.每日推荐滑动scroll-view布局7.6.组件具名…

STM32中断详解

STM32中断详解 NVIC 中断系统中断向量表相关寄存器中断优先级中断配置 外部中断实验EXTI框图外部中断/事件线映射中断步骤初始化代码实现 定时器中断通用定时器相关功能标号1&#xff1a;时钟源标号 2&#xff1a;控制器标号 3&#xff1a;时基单元 代码实现 NVIC 中断系统 STM…

小程序中引入echarts(保姆级教程)

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

Cypress测试框架详解:轻松实现端到端自动化测试

端到端自动化测试工具市场中&#xff0c;Cypress正以其易用性和强大功能&#xff0c;迅速成为开发者和测试人员的首选工具之一。无论是前端开发还是测试&#xff0c;Cypress都能在性能和效率上脱颖而出。 那么&#xff0c;Cypress具体能为端到端测试带来哪些便利&#xff1f;它…

Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)

文章目录 概述步骤 1: 安装 Nginx 和 Lua 模块步骤 2: 创建 Lua 脚本用于参数校验步骤 3: 配置 Nginx 使用 Lua 脚本写法二&#xff1a; 状态码写法三 &#xff1a; 返回自定义JSON复杂的正则校验 步骤 4: 测试和验证ngx.HTTP_* 枚举值 概述 一个不使用 OpenResty 的 Nginx 集…

在 React 项目中安装和配置 Three.js

React 与 Three.js 的结合 &#xff1a;通过 React 管理组件化结构和应用逻辑&#xff0c;利用 Three.js 实现 3D 图形的渲染与交互。使用这种方法&#xff0c;我们可以在保持代码清晰和结构化的同时&#xff0c;实现令人惊叹的 3D 效果。 在本文中&#xff0c;我们将以一个简…