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();
}
}
}
热门推荐
H3C交换机VLAN配置详解
人民币走势分析预测
展厅设计里的尺寸规范
微观历史剧让传统说新话
正解汉字 第一百七十一课 恶
国内清史学界最重要的十位学者
专业技术人才发展的路径有哪些?
香槟玫瑰传递了哪些情感?
香槟玫瑰传递了哪些情感?
大唐名将高仙芝:威震边疆的常胜将军
WiFi7超强MLO技术,双频合一又可以打开了?
蒸汽机原理图解动态图:蒸汽机的基本工作原理
惊艳!探秘庄子寓言故事背后的深刻智慧与人生哲理
最低6万可买,盘点6款拥有AEB主动刹车功能的10万级车型
尿毒症透析可以活多久?要透30年以上,关键看它是否保护好了!
当你心浮气躁时,不妨读一遍《清静经》,仅百余字,背下来便心静如水,非常治愈!
如何确定有效的员工培训目标?
继《旅行青蛙》之后,又可以在放置类游戏里“养女儿”了
汽车“原厂件”和“副厂件”是啥意思?为何价格差别这么大?
火车没有油门也没有刹车?一位60多岁的铁路工人告诉我,大部分人都不知道
如何准确诊断自己的股票并制定合理的投资计划?这种诊断方法对投资收益有何影响?
个性化简历:展现你的独特价值主张
一战中的空战是怎么打的?各种奇葩打法,堪称空中马戏团
又暴跌!纳指还能不能买了?
泰国教育部授予:柳州职业技术大学"杰出合作伙伴"称号
梅森瓷:欧洲第一名瓷的艺术传奇
芋泥,我愿称之为最可怕的食物!(不只是糖多)
慢性萎缩性胃炎的中医治疗:一个40年验方的成功案例
古龙小说《三少爷的剑》中剑魔燕十三简介
如何应聘外贸项目经理