问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32学习笔记:GPIO输入实验详解

创作时间:
作者:
@小白创作中心

STM32学习笔记:GPIO输入实验详解

引用
CSDN
1.
https://blog.csdn.net/2401_86494268/article/details/146001624

本文是一篇关于STM32微控制器GPIO输入的学习笔记,主要介绍了按键和光照传感器的使用。文章内容包括器件介绍、C语言基础以及两个实验的完整代码实现。

STM32学习笔记四——GPIO输入

一、器件介绍

  1. 按键:按下导通(使用4脚轻触开关时,按下短边两脚导通)。单片机一般使用下拉按键,接VDD,按下置0,未按下悬空电压不确定,因此选择上拉输入,按下低松手高。

按键抖动现象:机械按键在按下时会有抖动,电平会有波动(通常只有5~10毫秒)。最简单的过滤方法是按键判定加一段延时。

  1. 传感器模块:传感器元件(如光敏、热敏、红外)随外界模拟量变化而变化,与定值电阻分压即可输出模拟电压,通过电压比较器二值化后可输出数字信号。
  • 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();
        }
    }
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号