为了读取引脚的高低电平,就需要将引脚配置成输入模式,并读取IDR寄存器。
目录
寄存器配置
端口配置低寄存器(GPIOx_CRL) (x=A..E)
端口输入数据寄存器(GPIOx_IDR) (x=A..E)
按键点灯
寄存器代码
库函数代码
寄存器配置
端口配置低寄存器(GPIOx_CRL) (x=A..E)
将按键连接到PA4引脚上,需要将GPIOA的第四个引脚配置成上拉模式,那就需要将CRL的第19位置1,16-18位置零
代码可以是这样:
GPIOA->CRL &= 0xFFF0FFFF; //清空控制PA4的端口位
GPIOA->CRL |= 0x00080000; //配置PA4位上拉/下拉输入
第1行对16-19位进行清零操作,因为由手册可知,CRL的上电复位值是0x4444 4444。
为了将PA4配置成上拉输入模式,需要在ODR寄存器里把PA4上拉代码可以是这样:
GPIOA->ODR |= 1<<4; //PA4配置为上拉输入
GPIOA->ODR |= 0x10;
在C语言中,这两句是等效的
端口输入数据寄存器(GPIOx_IDR) (x=A..E)
为了读出PA4的状态,需要用到IDR寄存器
IDR寄存器的第0位到第15位分别是PIN0到PIN15的引脚状态,1表示高电平,0表示低电平
读I/O口的代码可以是这样:
if(GPIOA->IDR &(1<<4)) //判断PA4是否是高电平
{
//高电平执行
}else
{
//低电平执行
}
按键点灯
将一个按键接到PA4,一个LED接到PA0,实现按下按键,LED等亮起
按键一端接地,另一端接PA4
LED一端接VCC,串联一个限流电阻,再接到PA0
在主程序里循环判断PA4的状态,当按键被按下时,PA4接地,则是低电平,将PA0给低电平,LED灯就会亮起
代码可以是这样:
#include "stm32f10x.h"
int main(void)
{
RCC->APB2ENR |= 1<<2; //使能GPIOA的时钟
GPIOA->CRL &= 0xFFF0FFF0; //清空控制PA0和PA4的端口位
GPIOA->CRL |= 0x00080001; //配置PA0为通用推挽输出,速度为10M,PA4口为上下拉输入
GPIOA->ODR |= 1<<4; //PA4配置为上拉输入
GPIOA->ODR |= 1<<0; //PA0初始输出高电平
while(1)
{
if(GPIOA->IDR &(1<<4)) //判断是否按下
{
GPIOA->ODR |= (1<<0); //PA0置1,LED亮起
}else
{
GPIOA->ODR &= ~(1<<0); //PA0置零,LED灯熄灭
}
}
}
库函数的代码可以是这样:
#include "stm32f10x.h" // Device header
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输入状态时速度是没用的
GPIO_Init(GPIOA , &GPIO_InitStructure);
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)
{
if(GPIO_ReadInputDataBit(GPIOA , GPIO_Pin_4) == 0)
{
GPIO_ResetBit(GPIOA , GPIO_PIN_0); //PA0给低电平
//GPIO_WriteBit(GPIOA , GPIO_Pin_0 , Bit_RESET); //和上一句等效
}else
{
GPIO_SetBits(GPIOA , GPIO_Pin_0); //PA0给高电平
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)