目录
一.输入模式
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.寄存器的作用
- 寄存器是单片机内部的一些存储单元
- 单片机的设置和寄存器直接关联,比如输出模式,比如输入输出的电压,比如上下拉电阻是否打开,所以,想要对单片机进行设置就是对寄存器进行改写的过程。
2.功能与类型
-
功能:
- 存储二进制代码:寄存器的主要功能是存储二进制代码,这些代码可以是数据、指令或地址。
- 高速访问:由于寄存器位于CPU内部,其访问速度远快于内存和外部存储设备。
- 暂存数据:寄存器可以用于存储中间结果,避免频繁访问内存,从而提高计算效率。
-
类型:
- 按照功能分类:基本寄存器和移位寄存器。基本寄存器只能并行送入和输出数据,而移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据输入输出方式更加灵活。
- 按照用途分类:通用寄存器、专用寄存器、浮点寄存器、向量寄存器、状态寄存器和特殊寄存器等。通用寄存器用于存储临时数据,专用寄存器用于存储特定类型的数据或执行特定功能,浮点寄存器用于存储浮点数据,向量寄存器用于存储向量数据,状态寄存器用于存储运算结果的状态信息,特殊寄存器则用于实现特定的控制功能。
3.控制某一引脚输出电压来点灯所需要控制的寄存器
1.打开对应时钟开关
我们的目的是使用PC13,所以要先打开C引脚组时钟。通过寻找内存架构找到了RCC相关的寄存器组,RCC寄存器组里的寄存器太多了。找到控制引脚组的RCC寄存器需要找到GPIO属于哪个总线上的(AHB1\APB1\APB2\PHB2等),通过查内存分配架构图可知,GPIO在AHB2总线上,所以,我们定位到了RCC_AHB2ENR1
2.端口模式寄存器 ---输出模式
3.输出类型寄存器 ---推挽模式
4.输出速度寄存器 ---低速
5.上下拉寄存器 ---既不上拉也不下拉
6..输出数据寄存器
- 打开时钟:RCC_AHB2ENR1 给第2位写1
- 配置端口模式寄存器 配置为输出模式 GPIOC_MODER 第27、26位写 0 1
- 配置输出类型寄存器 配置为推挽输出 GPIOC_OTYPER 第13位写0
- 配置输出速度数据寄存器 配置为很低 GPIOC_OSPEEDR 第 27、26位写 0 0
- 配置上下拉寄存器 配置为既不用上拉也不下拉 GPIOC_PUPDR 第27、26位写0 0
- 配置输出数据寄存器 给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是否按下了
1.消抖
抖动原因:
任何的机械按键都会有抖动,而且人手按下抬起并不是一瞬间的,人抬手是需要反应时间的,所以会导致按下的低电平时间过长,导致多次误进if判断语句,所以会多次切换状态,导致误判。
2.解决方法
2.1 延时消抖
2.抬手检测
六.光电开关
遮挡-->PE15输出高电平--->PB2输入高电平
无遮挡-->PE15输出低电平--->PB2输入低电平