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();
}
}
}
热门推荐
什么场合送什么花好?各种场合送花指南
献完血多久能运动
数据分析,行业竞争的致胜法宝
上古先民为什么对乌龟非常崇拜?它象征了哪些美好寓意?
汽车发动机故障灯亮了怎么办?安全停车是首要任务!
RustDesk搭建公网中继服务器远控内网机器(完整版)
00后相亲风向已变:“五有三无”男青年更受欢迎,车房已无关紧要
泥鳅最爱吃什么食物和饲料
钓鳜鱼装备全攻略:路亚、饵料和竿具推荐
终端美化+自动补全和语法高亮 + zsh
内地驾驶证换香港驾驶证:详细要求和必备材料
研究生生涯规划:为未来研究之路绘制蓝图
金鱼盐浴的正确用法
快递驿站转让协议书范本格式及法律适用分析
脸上有荨麻疹可以擦护肤品吗
盒装CPU与散装CPU:定义、价格与性能全解析
带狗狗出门旅游?15个实用技巧助它快速适应新环境
减肥可以吃鸭肉(减肥的正确方式)
租汉服一般多少钱一套
相机镜头的奥秘:从构造到成像的深度解析
智取生辰纲的策划者:解读吴用的策略与智慧
掌握10种工作人格类型
脚掌外侧边缘疼是怎么回事
排畸检查需要多少钱?大小排畸费用各不相同
如何设计吸引顾客的中餐厅菜单海报?
杠杆平衡条件的三类典型应用
信阳毛尖的功效与作用、禁忌和食用方法
花开灿烂,苏州的夏天谁能不爱!
Rust多线程中安全的使用变量
"新农人"毕金莲:抓住"鸡"遇 "跑"出致富路