STM32的GPIO输入,原理,电路;标准库中的一些数据类型的原理:宏定义,结构体,枚举

本文详细介绍了输入设备中的按键工作原理、抖动处理、增加电压比较器模块以及光敏电阻的应用。还涵盖了C语言中数据类型、宏定义、结构体和枚举的使用,以STM32为例,展示了如何在硬件电路设计和编程中运用这些技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见的输入设备:

1、按键:

按键原理:按下导通,松手断开。

按键特性:按键会产生抖动,在按下的一瞬间,电压会发生变化如图:

按键程序处理:

程序需要过滤掉这段抖动,最简单就是通过增加延时来过滤掉这段抖动。

2、增加电压比较器模块的光敏电阻模块

模块原理:

光敏电阻的电阻会随外界模拟量的变化而变化,通过与蓝色可调电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化为数字0或1即可得到数字电压输出。

电路原理图:

 硬件电路:

        推荐有两种接法:一般采用左上图的导通低电平接法,PA0使用上拉输入模式。或者也可以采用右上角的接法,PA0可以配置为浮空输入或上拉输入,对应高电平更稳定,同时当引脚拉低时,损耗也会增强。

        左下角的接法,引脚需要配置为下拉输入模式,按键按下为高电平,右下角引脚可以配置为浮空输入模式或下拉输入模式。

数据类型:

需要更好地编写代码,我们需要理解标准库里代码的原理,就需要学会并理解以下一些内容,数据类型,宏定义,结构体等。下面给出详细介绍:

 例如char,通常单片机用来存放整数,而不是字符,一般单片机采用stdint这一列的数据类型

int8_t就是8位整型数据,t代表typedef重定义的名字

uint8_t就是无符号8位整形数据,下面的16、32同理

ST关键字这一列是先前版本的数据类型,新版本也支持这种数据类型,兼容老版本。

宏定义:

宏定义就是简单的文本替换,会在编译时进行文本替换。 

作用:将复杂的值替换为便于理解的字符串或其他类型的值。

​
#define ABC 12345//表示将ABC替换为12345

int a = ABC;//表示a = 12345

typedef:

typedef为C语言的关键字,为一种数据类型定义一个新名字

作用:将一个比较长的变量类型名换个名字,便于使用

对于变量类型重命名,使用typedef更安全,它会对命名进行检查。

typedef unsigned char uint8_t;
uint8_t a;	//等效于unsigned char a;

结构体:

结构体定义:结构体可以将多个相同或不同的数据类型组合到一个数据类型中:

例如:

struct{int a; char b; double c;} c;
c.a = 1;
c.b = 'B';
c.c = 3.14;

 在结构体使用时,通常采用typedef加结构体的方式进行重命名,这样能提高代码的简洁性和灵活性。例如:

typedef struct{
    int a;
    char b;
    double c;
}Struct_Name;
Struct_Name aStruct;
aStruct.a = 1;
aStruct.b = 'B';
aStruct.c = 3.14;

 结构体指针访问结构体内部变量时采用->符号例如:

typedef struct{
    int a;
    char b;
    double c;
}Struct_Var;

void modifyStruct(Struct_Var* bStruct) {
    bStruct->a = 2;
    bStruct->b = 'b';
    bStruct->c = 2.71;

}
int main(){
    Struct_Var aStruct;
    modifyStruct(&aStruct);

}

枚举:

关键字:enum

用途:定义一个取值受限制的整形变量,用于限制变量的范围;

enum{
    Monday = 1,
    Tuseday = 2,
    Wednesday = 3,
} week;
week = Monday;//week=1
week = Tuseday;//week = 2

 同样也可以使用typedef来重新命名。

typedef enum{
    Monday = 1,
    Tuseday = 2,
    Wendsday = 3,
}enum_Var;
enum_Var week;
week = Monday;//week=1
week = Tuseday;//week = 2

 枚举也是一个宏定义的集合,可以这样定义:

enum{
    Monday = 1,
    Tuseday = 2,
    Wednesday = 3,
} week;
week = Monday;//week=1
week = Tuseday;//week = 2
int main() {
    int a = Monday;//枚举里的宏定义
}

在stm32的标准库中,可以看到GPIOSPEED、GPIOMODE等枚举变量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值