输入结构
浮空输入模式:
上拉输入:
上面的电路浮空输入的状态是不确定的故需要通过设置上拉电阻的方式将电平设置为高电平,也就是确定的状态,此时下拉电阻处于关闭的状态,当按键没有按下的时候,处于浮空的状态默认是高电平,当按键按下的时候处于低电平,经过施密特触发器将电平信号转换为数字信号0存储到输入状态寄存器中,通过读取输入状态寄存器的值来获取电平状态(解决浮空输入模式下电平不确定的问题)。
下拉输入:
按键驱动电路,按键连接到限流电阻,然后连接到VCC,使用下拉输入的模式,将驱动单元的下拉电阻打开,当按键没有按下的时候端口处于低电平状态,当按键按下的时候电流从外部流向单片机的内部,会检测为高电平,(弱上拉和弱下拉)
浮空输入检测按键要在上拉和下拉的作用下加上上拉电阻和下拉电阻,让电路在悬空的状态写有一个明确的电平(上拉电阻使用的是2-10k的阻值)。
使用配置寄存器的方式驱动按键检测
电路分析:按键的一端连接到GND一端连接上拉电阻接3.3V电源,有一个R53的限流电阻用于保护IO口,C44使用了一个100nf的电容,滤波电容在一定程度上可以实现硬件消除抖动的效果,当按键没有被按下时端口的电平被4K的上拉电阻拉到高电平的状态(此时处于高阻状态),按键按下的时候电流从上拉电阻流线GND,此时端口为低电平。
寄存器配置:
ARMGD32
- GPIOA 基地址:0x4001 0800
- GPIOB 基地址:0x4001 0C00
- GPIOC 基地址:0x4001 1000
- GPIOD 基地址:0x4001 1400
- GPIOE 基地址:0x4001 1800
- GPIOF 基地址:0x4001 1C00
- GPIOG 基地址:0x4001 2000
- AFIO 基地址:0x4001 0000
KEY1对应的端口号为PA0这个时候找到端口对应的寄存器
注1:使用8424法判断对应的数值为4
读取端口电平状态寄存器
代码实现
cpp
#define GPIOA_OCTL (*(uint32_t *)(0x40010800 + 0x0C))
// 外设总线控制,时钟使能控制寄存器
#define RCU_APB2EN (*(uint32_t *)(0x40021000 + 0x18))
// 按键检测寄存器控制
#define GPIOA_CTL0 (*(uint32_t *)(0x40010800 + 0x00))
#define GPIOA_ISTAT (*(uint32_t *)(0x40010800 + 0x08))
static void Delay(uint32_t count)
{
while (count--);
}
int main(void)
{
/*使能GPIO的时钟*/
RCU_APB2EN |= 1 << 2;
/*配置PA8为推挽输出模式*/
GPIOA_CTL1 = 0x44444442;
/*配置PA0为浮空输入模式*/
GPIOA_CTL0 = 0x44444444;
while (1)
{
while((GPIOA_ISTAT & (1 << 0)) == 0){
GPIOA_OCTL |= 1 << 8; //00000000 00000000 00000001 00000000
}
GPIOA_OCTL &= ~(1 << 8); //11111111 11111111 11111110 11111111
/*
1 < 8 位是一个32位数据,对于ARM32位单片机平台
常数默认为uint32位
*/
}
}
当按键按下的时候地点亮发光的led灯,当按键没有被按下的时候LED灯处于熄灭状态