当前位置: 首页 > article >正文

GPIO相关寄存器,点灯

目录

一.输入模式

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.kler.cn/a/459238.html

相关文章:

  • FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.4,SDP协议分析
  • 基于 SensitiveWordBs 实现敏感词过滤功能
  • LabVIEW 实现自动对焦的开发
  • 基于JavaWeb的汽车维修保养智能预约系统
  • Qt天气预报系统设计界面布局第四部分左边
  • 深信服云桌面系统的终端安全准入设置
  • 一次 MySQL IF 函数的误用导致的生产小事故
  • linux上虚拟机显示网络不可用的解决方法
  • 建立一个Macos载入image的实例含界面
  • docker 部署mysql8
  • MySQL如何执行.sql 文件:详细教学指南
  • 今日总结 2024-12-30
  • LeetCode热题100-两数之和【JavaScript讲解】
  • 信息系统常见的系统架构
  • 老鑫网络安全培训课程收费多少钱
  • 知识图谱+大模型:打造全新智慧城市底层架构
  • 数据链路层知识要点
  • VSCode 插件开发实战(十): 环境变量Env设置与管理
  • svn分支相关操作(小乌龟操作版)
  • 添加购物车业务代码
  • 概率论与随机过程--作业2
  • vscode中调用deepseek实现AI辅助编程
  • Mcnemar‘s exact test
  • 【面试系列】深入浅出 Spring Boot
  • 六、链路层,《计算机网络》,谢希仁 《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
  • 抽奖系统(1)(Java 实现)