GPIO、LED以及蜂鸣器的介绍及用法

GPIO:

  1. GPIO(General Purpose Input Output)通用输入输出口

  2. 可配置为八种输入输出模式

9f137ef8-58c0-4192-af7a-38eff9403846

  1. 引脚电平:(低电平)0 - 3.3v(高电平) ,部分引脚可容忍5v

  2. 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等(只要是可以用高低电平来控制的地方,都可以用GPIO,控制功率较大的设备,加上驱动电路就行)

  3. 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。

GPIO基本结构:

26f355bf-8688-42f9-a003-2f1a8cd9ac9a

1、寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,只负责存储数据

2、输出寄存器写1 对应引脚输出高电平,写0输出低电平

3、输入寄存器读取1,对应端口是高电平,写0是低电平

4、上图寄存器只有低16位对应有端口,高16位没有

5、驱动器是用来增加信号的驱动能力的

结构图:

fa7b95fd-8c8a-4fbc-9d32-bdfb174b1739

LED和蜂鸣器介绍

•LED:发光二级管,正向通带内点亮,反向通电不亮(长脚是正极,短脚是负极,内部较小的一半是正极,较大的一半是负极)

•有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定(接低电平,蜂鸣器触发,高电平关闭)

•无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音

4c44fd51-be80-4cfa-9c9f-befbd58b3b15

点亮LED

接线图

251e9deb-7b55-4ae5-b1c0-f93302918867

调用外设时针控制函数
f9278971-ff65-4d53-80f0-b15da6fd7ed7

三个的区别在于它们控制的供电总线不同

  • 用第一个(AHB):当你要用高速核心模块

  • 用第二个(APB2):当你要用常用IO和外设时(最常用)

  • 用第三个(APB1):当你要用低速省电模块

常用的GPIO函数
b57dca4b-6f90-4079-8ce0-1b7564341d1e

控制引脚工作方式有:
4c6bf7be-ab83-4fbd-be0c-31d1f46183b6

GPIO初始化
9ac5f5d7-a277-4af8-bf30-1efdfc60c6dc

点亮LED的完整代码

#include "stm32f10x.h"                  // Device header
#include "delay.h"
int main(void)
{
    //调用APB2外设时针控制函数
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    //定义结构体
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    //调用GPIO_Init函数
    GPIO_Init(GPIOA,&GPIO_InitStruct);

    //GPIO写入,设置高电平
//    GPIO_SetBits(GPIOA,GPIO_Pin_0);
    //GPIO写入,设置低电平
//    GPIO_ResetBits(GPIOA,GPIO_Pin_0);

//    GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
    while(1){
        GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
        Delay_ms(500);
        GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
        Delay_ms(500);
    }
}

LED流水灯的接线图
e13e6ce7-b087-471a-bcf0-3984a928f6d4

完整代码

#include "stm32f10x.h"                  // Device header
#include "delay.h"
int main(void)
{
    //调用APB2外设时针控制函数
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    //定义结构体
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    //调用GPIO_Init函数
    GPIO_Init(GPIOA,&GPIO_InitStruct);

    while(1){
        GPIO_Write(GPIOA,~0x0001);
        Delay_ms(500);
        GPIO_Write(GPIOA,~0x0002);
        Delay_ms(500);
        GPIO_Write(GPIOA,~0x0004);
        Delay_ms(500);
        GPIO_Write(GPIOA,~0x0008);
        Delay_ms(500);
        GPIO_Write(GPIOA,~0x0010);
        Delay_ms(500);
        GPIO_Write(GPIOA,~0x0020);
        Delay_ms(500);
        GPIO_Write(GPIOA,~0x0040);
        Delay_ms(500);
        GPIO_Write(GPIOA,~0x0080);
        Delay_ms(500);
    }
}

蜂鸣器接线图
f20d0937-a8f0-4323-8053-76da150724a3

完整代码

#include "stm32f10x.h"                  // Device header
#include "delay.h"
int main(void)
{
    //调用APB2外设时针控制函数
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    //定义结构体
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    //调用GPIO_Init函数
    GPIO_Init(GPIOB,&GPIO_InitStruct);

    while(1){
        GPIO_ResetBits(GPIOB,GPIO_Pin_12);
        Delay_ms(500);
        GPIO_SetBits(GPIOB,GPIO_Pin_12);
        Delay_ms(500);
    }
}

按键介绍

常见的输入设备,按下导通,松手断开

按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动

传感器模块简介

传感器模块:传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外键模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化可得到数字电压输出
a77ca696-b301-4467-817a-dfb27f6750f6

posted @ 2025-12-03 21:11  people121  阅读(0)  评论(0)    收藏  举报