STM32F103 入门篇 13-GPIO输入-按键检测

在这里插入图片描述
PA0、PC13同时还具有唤醒功能,上升沿
电容作用:按键按下后会有20ms的抖动,待稳定后通过地线导出。

驱动函数,初始化GPIO
使用浮空输入

STM32的四种输入方式

1、上拉输入(GPIO_Mode_IPU)

上拉输入就是信号进入芯片后加了一个上拉电阻,再经过施密特触发器转换成0、1信号,读取此时的引脚电平为高电平;

2、下拉输入(GPIO_Mode_IPD)

下拉输入就是信号进入 芯片后加了一个下拉电阻,再经过施密特触发器转换成0、1信号,读取此时的引脚电平为低电平;

3、模拟输入(GPIO_Mode_AIN)

信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到片上外设模块。比如传送给ADC模块,由ADC采集电压信号。所以可以理解为模拟输入的信号是未经处理的信号,是原汁原味的信号。虽然我也知道这样表达不准确。

4、浮空输入(GPIO_Mode_IN_FLOATING)

信号进入芯片内部后,既没有接上拉电阻也没有接下拉电阻,经由触发器输入。

配置成这个模式后,用电压变量引脚电压为1点几伏,这是个不确定值。由于其输入阻抗比较大,一般把这种模式用于标准的通讯协议,比如IIC、USART的等。

STM32的四种输出方式

1、普通推挽输出(GPIO_Mode_Out_PP):

使用场合:一般用在0V和3.3V的场合。线路经过两个P_MOS 和N_MOS 管,负责上拉和下拉电流。

使用方法:直接使用

输出电平:推挽输出的低电平是0V,高电平是3.3V。

2、普通开漏输出(GPIO_Mode_Out_OD):

使用场合:一般用在电平不匹配的场合,如需要输出5V的高电平。

使用方法:就需要再外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式, 当输出高组态时,由上拉电阻和电源向外输出5V的电压。

输出电平:在开漏输出模式时,如果输出为0,低电平,则使N_MOS 导通,使输 出接地。若控制输出为1(无法直接输出高电平),则既不输出高电平 也不输出低电平,为高组态。为正常使用,必须在外部接一个上拉电 阻。

特性: 它具“线与”特性,即很多个开漏模式 引脚连接到一起时,只有当所有 引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部 上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当 于短路接地,使得整条线路都为低电平,0 伏。

3、复用推挽输出(GPIO_Mode_AF_PP):用作串口的输出。

4、复用开漏输出(GPIO_Mode_AF_OD):用在IIC。

所有的开漏输出都需要接上拉电阻。

任意位取值
取值位置1,其他位置0
操作:左移 与ODR

bsp_key.c

#include "bsp_key.h"


void KEY_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;

	RCC_APB2PeriphClockCmd(KEY_G_GPIO_CLK, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = KEY_G_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(KEY_G_GPIO_PORT, &GPIO_InitStruct);
	
}

uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
{
	if(GPIO_ReadInputDataBit(KEY_G_GPIO_PORT, KEY_G_GPIO_PIN) == KEY_ON)
	{
		//松手检测
		while(GPIO_ReadInputDataBit(KEY_G_GPIO_PORT, KEY_G_GPIO_PIN) == KEY_ON);
		return KEY_ON;
	}
	else return KEY_OFF;
}

bsp_led.h


// ^异或,C语言的一个二进制的运算符
//	与1异或改变,与0异或不变
//实现按下亮,不按熄灭
#define LED_G_TOGGLE {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;}

main.c

#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"

void Delay(uint32_t count)
{
		for(;count!=0; count--);
}

int main(void)
{
	//来到这个系统时钟被配置成72M
	LED_GPIO_Config();
	KEY_GPIO_Config();
	
	while(1)
	{
		if( Key_Scan(KEY_G_GPIO_PORT,KEY_G_GPIO_PIN) == KEY_ON );
			LED_G_TOGGLE
	}
} 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要使用STM32F103ADC检测-5V电压,可以按照以下步骤进行: 1. 配置ADC通道:选择要使用的ADC通道,并设置其采样时间和分辨率等参数。 2. 配置GPIO口:将要检测的电压输入引脚连接到相应的GPIO口上,并设置其为模拟输入模式。 3. 启动ADC转换:通过软件触发或外部触发方式启动ADC转换,等待转换完成。 4. 读取ADC值:读取ADC转换结果寄存器中的数值,通过计算转换为对应的电压值。 需要注意的是,STM32F103ADC的输入电压范围为-3.6V,如果要检测-5V电压,需要使用外部电压分压电路将输入电压降低到3.6V以下。同时,还需要根据具体应用场景选择合适的采样时间和分辨率等参数,以保证检测精度和速度的平衡。 ### 回答2: STM32F103 ADC是STM32F系列芯片中的一种模拟数字转换器,可以实现将模拟电压信号转换为数字信号。而检测0-5V电压就需要使用该芯片的ADC进行采样处理,如下所述: 1. 硬件连接 将测量的电压信号连接到STM32F103芯片的ADC引脚上,确保连接正确,同时需要注意电压信号的极性。 2. 编程设置 使用STM32F103芯片的开发工具进行编程设定,包括但不限于以下几个方面: (1)选取合适的ADC通道,使其与电压信号输入引脚相对应; (2)设置ADC的采样速率、分辨率等参数; (3)通过GPIO口控制ADC的使能和转换开始; (4)读取ADC采样结果并计算得到电压值。 需要注意的是,在编程中要考虑到具体的采样精度和误差范围,需要经过实验和调试确定。同时,还需要对电压信号本身的产生和传输方式进行合理设计,以降低噪声干扰和误差。最后,根据不同的应用场景和需求,可以选择不同的输出方式(如LED指示灯、LCD显示等),以方便使用和管理。 ### 回答3: STM32F103ADC是一款高性能的单片机芯片,它内置了多个12位ADC模块,可以用于检测0-5V电压。想要实现这一功能,需要按照以下步骤进行。 1. 确定ADC的输入通道 STM32F103ADC内置了多个ADC通道,每个通道都有不同的输入引脚。在检测0-5V电压时,需要选择与其连接的引脚作为ADC输入通道。例如,如果电压信号通过PA0引脚输入,那么应该选择ADC1的通道0作为输入通道。 2. 配置ADC模块 在使用ADC之前,需要对其进行配置。具体步骤包括设置采样时钟、转换模式、校准因子等。可以通过CubeMX等工具来生成ADC初始化代码,或者手动写代码进行初始化。 3. 启动ADC转换 配置完成后,可以通过启动ADC转换来获取电压值。具体步骤包括设置转换触发源、启动转换、等待转换完成等。在转换完成后,会将电压值存储在ADC数据寄存器中。 4. 计算电压值 由于ADC输出的是一个0-4095的数字量,需要根据一定的公式将其转换为实际的电压值。具体计算方法是:电压值=(ADC输出值×参考电压)/4095。其中,参考电压一般是3.3V或5V。 总之,通过以上步骤,可以实现在STM32F103ADC芯片上检测0-5V电压的功能。需要注意的是,在实际使用过程中,还需要考虑如何对电压进行保护、滤波等操作,以确保电路的稳定和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值