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();
}
}
}
热门推荐
磁性材料:非晶磁芯材料及与铁氧体材料性能对比详解
英语作文写作提升技巧:比较结构的巧妙运用
国家烟草专卖局,与烟草总公司是什么关系?分别是什么级别?
国家烟草专卖局与中国烟草总公司:一套机构两块牌子的独特管理模式
室上速是怎么导致的
湖南旅游省钱攻略,景点推荐大揭秘!
细菌性痢疾:病因、症状、治疗与预防全解析
急性细菌性痢疾患者的饮食护理指南
别再乱买了~你的长相决定了你的穿衣风格
AI赋能短视频创作:提升效率与创意的方法
工程师必读:气密性检测中的泄漏单位换算指南
肩颈酸痛怎么缓解?这些方法一定有效!
EDG vs RNG:英雄联盟全球赛中的巅峰对决
太空狼人杀:声音包与自定义设置全攻略
华东政法大学一流本科专业建设点名单(国家级+市级)
顺德招商“产业经”:万亿集群迈向新的春天
从数据到决策:如何使用雨量监测预警系统
QDII基金如何应对市场变化?这种市场变化对基金有何影响?
垂盆草的养殖方法,春秋季节每隔2-3天浇一次水
春季脑血管疾病高发?记住这5个注意事项,守护你的健康
精粹针灸方 —手足十二针方
天然水和纯净水哪个好?哪个好喝?
推荐10本儿童成语故事书,开启孩子的智慧之旅!
2024英国时尚管理专业排名TOP5
DeepSeek-R1:开源Top推理模型的实现细节、使用与复现
医学生如何选科室才能不“入坑”(终结版)
租房必读:如何与房东协商降房租?提前解约需付剩余租金吗?
什么年龄都可能得骨质疏松症?这几类人更要注意→
基于英特尔开发套件的实时AI图像处理技术的茶叶病害监测物联网系统
销量大涨!网友:没有一只鸽子能飞出中山