STM32学习笔记:GPIO输入实验详解
创作时间:
作者:
@小白创作中心
STM32学习笔记:GPIO输入实验详解
引用
CSDN
1.
https://blog.csdn.net/2401_86494268/article/details/146001624
本文是一篇关于STM32微控制器GPIO输入的学习笔记,主要介绍了按键和光照传感器的使用。文章内容包括器件介绍、C语言基础以及两个实验的完整代码实现。
STM32学习笔记四——GPIO输入
一、器件介绍
- 按键:按下导通(使用4脚轻触开关时,按下短边两脚导通)。单片机一般使用下拉按键,接VDD,按下置0,未按下悬空电压不确定,因此选择上拉输入,按下低松手高。
按键抖动现象:机械按键在按下时会有抖动,电平会有波动(通常只有5~10毫秒)。最简单的过滤方法是按键判定加一段延时。
- 传感器模块:传感器元件(如光敏、热敏、红外)随外界模拟量变化而变化,与定值电阻分压即可输出模拟电压,通过电压比较器二值化后可输出数字信号。
- LM393电压比较器电路:用于二值化模拟电压,基于运算放大器。
- 电位器:可变电阻。
- 分压电路和滤波电容:分压定理表明,阻值越小,拉力作用越大,下拉越小越接近0V。
- 指示灯电路:上拉电阻。GND相接,VCC相接,DO接IO口。AO是模拟输出。
二、C语言基础
数据类型:int,long占32位(与51单片机不同)。
数据类型关键字:C语言有stdint关键字,ST公司有ST关键字(不推荐)。
char -> int8_t, s8
short -> int16_t, s16
unsigned char -> uint8_t, u8
unsigned short -> uint16_t, u16
int -> int32_t, s32
unsigned int -> uint32_t, u32
(unsigned)long long -> (u)int64_t, ST无
枚举类型(enum):定义一个取值受限的整形变量,限制变量范围,或者作为宏定义集合。
三、输入实验
(一)按键点灯
接线图:省略
前提工作:将LED驱动部分(RCC,引脚定义和引脚使能)封装。
LED驱动代码:
//LED.c
#include "stm32f10x.h" // Device header
void LED_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//GPIO结构体声明
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);//初始关闭
}
void LED1_Turn(void){ //L1反转
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0){
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
else{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
}
void LED2_Turn(void){ //L2反转
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0){
GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
else{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
}
void LED_1_ON(void){
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED_1_OFF(void){
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
void LED_2_ON(void){
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED_2_OFF(void){
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
LED驱动头文件:
//LED.h
#ifndef __LED_H
#define __LED_H
#endif
void LED_Init(void);
void LED1_Turn(void);
void LED2_Turn(void);
void LED_1_ON(void);
void LED_2_ON(void);
void LED_1_OFF(void);
void LED_2_OFF(void);
按键模块代码:
//Key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void){ //key使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
uint8_t Key_GetNum(void){
uint8_t Keynum = 0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){
Delay_ms(20);;
Keynum = 1;
}
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0){
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0){
Delay_ms(20);;
Keynum = 11;
}
}
return Keynum;
}
按键模块头文件:
//Key.h
#ifndef __Key_H
#define __Key_H
#endif
unsigned char Key_GetNum(void);
void Key_Init(void);
主函数代码:
//main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
uint8_t Keynum;
int main(void){
LED_Init();
Key_Init();
while(1){
Keynum = Key_GetNum();
if(Keynum==1){
LED1_Turn();
}
if(Keynum==11){
LED2_Turn();
}
}
}
(二)光照传感器
接线图:省略
代码实现:
- 光敏传感器代码:
//LightSensor.c
#include "stm32f10x.h" // Device header
void Light_Sensor_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
uint8_t LightSensor_Get(void){
return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
}
- 蜂鸣器代码:
//Buzzer.c
#include "stm32f10x.h" // Device header
void Buzzer_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//GPIO结构体声明
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_12);//初始关闭
}
void Buzzer_Turn(void){
if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_13)==0){
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
else{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
}
void Buzzer_ON(void){
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}
void Buzzer_OFF(void){
GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
- 主函数代码:
//main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"
int main(void){
Light_Sensor_Init();
Buzzer_Init();
while(1){
if(LightSensor_Get() == 1){
Buzzer_ON();
}
else{
Buzzer_OFF();
}
}
}
热门推荐
失意群体与高概率犯罪行为的关联揭秘
从拜祖大典到姓氏广场:黄帝故里承载中华民族文化记忆
龙门石窟:中国石刻艺术最高峰,10万尊造像诉说千年历史
双十一高端手机大战:谁是性价比之王?
0首付分期买手机,理性消费指南
一小时燃烧500-800卡路里,动感单车成健身房最受欢迎减肥项目
轻断食减肥真相:科学原理、误区警示与安全指南
科学减肥指南:避开“减肥抑郁”,从饮食到运动全攻略
远嫁匈奴的王昭君:用智慧换来50年和平
昭君出塞:一段促成50年和平的传奇人生
和牛:日本“国宝级”牛肉,霜降纹理与柔嫩口感成就“舌尖上的奢侈品”
30元标准盒饭,自己动手丰衣足食
分润机制升级,引爆商业模式新风潮
买椟还珠的故事:别被华丽外表蒙蔽双眼
黄金投资:全球经济放缓与政治风险下的避风港
朗姆酒配餐全攻略:十大美食让你感受完美味觉体验
雷振邦与《花儿为什么这样红》:一首经典背后的故事
冬季天门山赏雪,打卡冰雪仙境
春天去哪儿看花?张家界不容错过!
尼麦角林:脑供血不足治疗的优选药物
快走:改善脑供血不足的简单良方
慢性脑供血不足患者的心理干预新趋势
脊肌萎缩症:三种创新药物获批,新生儿筛查提高疗效
30%交通事故源于超车,这些安全要点请收好
逆向行驶扣3分罚款200元,未成年人打架可“私了”吗?
驾驶员超车指南:8大场景下的安全操作要点
戴拿奥特曼:三种形态展现全能魅力
烟草味香水推荐:10款独特香调详解
开学季必备:学习用品的英文大揭秘
广州周边游|从化鳌头镇:田园风光与非遗文化完美融合的周末休闲胜地