STM32基本GPIO控制

目录

1.GPIO基础知识

1.1系统架构

[2. IO八种工作模式](#2. IO八种工作模式)

[2.1STM32 IO工作模式](#2.1STM32 IO工作模式)

2.2GPIO的输出速度

3.固件库实现LED点灯

3.1LED灯

LED灯,是一种能够将电能转化为可见光的半导体期间

3.2.控制LED灯

4.STM32控制蜂鸣器

1.蜂鸣器的种类

2.蜂鸣器的控制方式

3.软件设计流程

[5 按键基础知识](#5 按键基础知识)

5.1.深入理解GPIO输入

5.2按键控制LED灯

[6 继电器](#6 继电器)

6.1.继电器的工作原理

6.2.继电器的引脚说明

6.3.单片机控制继电器软件开发流程

7.震动传感器

7.1.震动传感器工作原理

7.2.震动传感器硬件引脚接线

7.3.震动传感器控制灯

8.433无线模块

1.433M无线模块工作原理

2.引脚接线

3.433M控制灯软件开发流程


1.GPIO****基础知识

GPIO(General-Purpose input/output,通用输入/输出接口)
用于感知外部信号(输入模式)和控制外部设备(输出模式)
简单模块: LED, 按键,蜂鸣器,温度传感器,使用一个 GPIO 就可以完成数据的传输 / 控制
复杂一点的模块 OLED , FLASH, 六轴传感器需要多个引脚组成 " 协议 " 传输数据,USART,IIC,SPI等协议
MCU 单片机大都采用引脚复用模式也就是一个 GPIO ,可以直接控制它输出高低电平,也可以设置为某个协议的引脚之一。此外,一些MCU 的引脚,还能设置为 ADC 模式读取模拟信号,或者设置为DAC 模式输出模拟信号。

1.1系统架构

2. IO****八种工作模式

GPIO结构图

2.1STM32 IO工作模式

输出模式有四种:推挽输出,开漏输出,复用开漏,复用推挽
输入模式有四种 : 上拉输入,下拉输入,浮空输入,模拟输入
输出模式:

  1. 推挽输出( Push-Pull,pp )
    让输出控制变成了VDD/VSS输出,使得输出电流增大
    提高了输出引脚的驱动能力,提高了电路的负载能力和开关的动作速度
    2.开漏输出(Open-Drain,OD)
    推挽输出模式可以直接输出高电平,开漏输出需要外接上拉电阻才能输出高电平
    开漏输出的特性:
    利用外部电路驱动能力
    实现电平转换
    方便实现"逻辑与" 功能
    3.复用推挽/开漏输出(Alternate Funtion,AF)
    GPIO除了作为通用输入输出引脚使用以外,还可以作为片上外设(USART,IIC,SPI) 专用引脚,即一个引脚可以有多种用途,但是同一时刻一个引脚只能使用复用功能中的一个
    当引脚设置为复用功能的时候,可选择推挽复用模式或者复用开漏模式,在设置为复用开漏模式时,需要外接上拉电阻。
    输入模式:
  2. 上拉输入 (Input Pull-up)
    VDD 经过开关、上拉电阻,连接外部 I/O 引脚。当开关闭合时,外部 I/O 输入信号时,默认
    输入高电平。
  3. 下拉输入 (Input Pull-down)
    VSS经过开关,下拉电阻,连接外部I/O引脚,当开关闭合时,外部I/O无输入信号时,默认输入低电平
  4. 浮空输入 (Floating Input)
    两个上下拉电阻开关均断开,没有上拉也没有下拉,I/O引脚直接连接TTL肖特基触发器,此时,I/O引脚浮空,读取的电平是不确定的,外部信号是什么电平,MCU引脚就输入什么电平 ,MCU复位上电后,默认为浮空输入模式
    4.模拟输入(Analoge mode)
    两个上下拉电阻开关均断开,同事TTL肖特基触发器也断开,引脚信号直接连接模拟输入,实现对外部信号的采集。

2.2GPIO的输出速度

STM32 的 I/O 引脚工作再输出模式下时,需要配置 I/O 引脚的输出速度,该输出速度不是输出信号的速度,而是I/O 口驱动电路的响应速度。
STM32 提供了三个速度, 2MHZ,10MHZ,50MHZ
实际开发过程中需要结合实际情况选择合适的响应速度,以兼顾信号的稳定性和低功耗
当设备为高速时,功耗大,噪声大,电磁干扰强
当设备为低速时,功耗低,噪声小,电磁干扰弱
简单外设,比如 LED 灯,蜂鸣器建议使用 2MHZ 的输出速度。
而复用为 IIC , SPI 等通信信号时,建议使用 10MHZ 或 50MHZ 以提高响应速度。

3.固件库实现LED点灯

3.1LED灯

LED灯,是一种能够将电能转化为可见光的半导体期间

原理:当给P极施加正向电压时,空穴和自由电子在P-N结复合,辐射出光子而发光。

3.2.控制LED****灯

LED 灯的正极接到了 3.3V , LED 灯的负极接到了 PA1 ,也就是 GPIOA1 引脚,只需要控制PA1 为相对应的低电平,即可点亮对饮的 LED 灯,输出高电平则熄灭对应的 LED灯。
软件设计流程:
1.初始化系统:
初始化GPIO 外设时钟
初始化LED 引脚
2.输出电平
实现代码:
led.c文件

cpp 复制代码
#include "led.h"
#include "stm32f10x.h"


void LED_Init()
{
	//³õʼ>>¯LEDÒý½ÅGPIO
	GPIO_InitTypeDef led_initstruct;
	//³õʼ>>¯Ê±ÖÓ
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
	
    led_initstruct.GPIO_Pin=GPIO_Pin_1;            
    led_initstruct.GPIO_Speed=GPIO_Speed_50MHz;  
	led_initstruct.GPIO_Mode=GPIO_Mode_Out_PP;  
	
	GPIO_Init(GPIOA, &led_initstruct);


}

main.c文件

cpp 复制代码
#include "stm32f10x.h"
#include "main.h"
#include "led.h"

int  main()
{

//初始化等的引脚GPIO
				LED_Init();

				

   while(1)
	 {
//让GPIO1输出低电平 灯就亮了
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	 }
		 
   
}

如果要让灯实现一秒闪烁:

main.c文件:

cpp 复制代码
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
void delay(uint16_t time)
{
		uint16_t i=0;
		while(time--)
		{
			i=12000;
			while(i--);
		}
}
int  main()
{

//初始化等的引脚GPIO
				LED_Init();

				

   while(1)
	 {
				GPIO_ResetBits(GPIOA,GPIO_Pin_1);//GPIO1输出低电平灯亮
				delay(1000);
				GPIO_SetBits(GPIOA,GPIO_Pin_1);//GPIO1输出高电平灯灭
				delay(1000);
	 }
		 
   
}

4.STM32控制蜂鸣器

**1.**蜂鸣器的种类

蜂鸣器是一种常用的电子发声元器件,采用直流电压供电。广泛应用于计算机,打印
机,报警器,电子玩具,汽车电子设备灯等产品中常见的蜂鸣器可分为有源蜂鸣器和
无源蜂鸣器。

**2.**蜂鸣器的控制方式

有源蜂鸣器:内部有震荡源,只要通电即可自动发出固定频率的声音。(频率固定无
法控制音色)
无源蜂鸣器:内部无震荡源,需要外部脉冲信号驱动发声,声音频率可变。(可改变
频率来改变音色)

3.软件设计流程

初始化系统
初始化GPIO外设时钟
初始化蜂鸣器的引脚
输出电平控制蜂鸣器
bear.c文件

cpp 复制代码
#include "bear.h"
#include "stm32f10x.h"


void Bear_Init(void)
{
		//1.初始化蜂鸣器引脚
	GPIO_InitTypeDef bear_initstruct;

	//2.初始化时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	
	bear_initstruct.GPIO_Pin=GPIO_Pin_3;
	bear_initstruct.GPIO_Speed=GPIO_Speed_10MHz;
	bear_initstruct.GPIO_Mode=GPIO_Mode_Out_PP;
	
	GPIO_Init(GPIOA,&bear_initstruct);

}

main.c文件

cpp 复制代码
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"



int  main()
{

	//初始化蜂鸣器的引脚CPIOA3

			Bear_Init();
    //GPIO3输出低电平 蜂鸣器响
		   GPIO_ResetBits(GPIOA,GPIO_Pin_3);


   while(1)
	 {
	 }
		 
   
}

5****按键基础知识

5.1.深入理解GPIO****输入

GPIO 的特点:
具有内部上拉或下拉的功能
可以使用外部下拉或上拉

按键连接示意图 :

5.2按键控制LED灯

初始化系统
初始化 GPIO 外设时钟
初始化按键和 LED 的引脚
检测按键输入电平来控制 LED 灯
key.c

cpp 复制代码
#include "key.h"
#include "stm32f10x.h"


void Key_Init(void)
{
		//³õʼ>>¯°´¼üÍâÉè
		GPIO_InitTypeDef key_initstruct;
	
		//³õʼ>>¯Ê±Ö
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
	
		key_initstruct.GPIO_Pin=GPIO_Pin_0;
		key_initstruct.GPIO_Mode=GPIO_Mode_IPU;
		
		GPIO_Init(GPIOA, &key_initstruct);
	
	
		key_initstruct.GPIO_Pin=GPIO_Pin_13;
		key_initstruct.GPIO_Mode=GPIO_Mode_IPU;
		
		GPIO_Init(GPIOC, &key_initstruct);



}

main.c

cpp 复制代码
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"

int  main()
{

			LED_Init();
    		Key_Init();
			
            GPIO_SetBits(GPIOA,GPIO_Pin_1);



   while(1)
	 {
		 
	 
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
			{					
					GPIO_ResetBits(GPIOA,GPIO_Pin_1);

			}
    if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1)
			{					
					GPIO_ResetBits(GPIOA,GPIO_Pin_1);

			}
		 
	 }
		 
   
}

6****继电器

6.1.继电器的工作原理

继电器是一个电控开关,工作原理基于电磁感应,继电器包括一个电磁线圈和一组触点。常用于控制高电流或高电压的电路,例如自动控制原理,电力系统和自动化设备中,由于可靠性和电气隔离的特性可以实现小电流实现大电流,继电器在各种应用中都有广泛的用途。

6.2.继电器的引脚说明

1.VCC(+):供电正极,连接此引脚到电源,以提供继电器所需的电流
2.GND(-):地,连接此引脚到电源的负极或者地。
3.IN:控制输入信号,通常用于连接控制信号,当该信号变化,继电器切换状态。
4.COM(common):公共端,通常是中间的触点,与常开或常闭触点相连。
5.NO(Normally Open):常开接口,继电器吸合前悬空,吸合后于COM连接.6.NC(Normally Closed):常闭接口,继电器吸合前与COM连接,吸合后悬空

6.3.单片机控制继电器软件开发流程

初始化系统
初始化继电器IN引脚对应的GPIO外设时钟
初始化继电器IN的引脚

输出电平控制继电器开和关

relay.c文件

cpp 复制代码
#include "stm32f10x.h"
#include "relay.h"

void Relay_Init(void)
{
		GPIO_InitTypeDef GPIO_Initstruct;
		
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		
		GPIO_Initstruct.GPIO_Pin=GPIO_Pin_0;
		GPIO_Initstruct.GPIO_Speed=GPIO_Speed_10MHz;
		GPIO_Initstruct.GPIO_Mode=GPIO_Mode_Out_PP;
	
		GPIO_Init(GPIOA,&GPIO_Initstruct);

		
}

main.c文件

cpp 复制代码
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "relay.h"


void delay(uint16_t time)
{
		uint16_t i=0;
		while(time--)
		{
			i=12000;
			while(i--);
		}
}

int  main()
{

    			Relay_Init();
				GPIO_SetBits(GPIOA,GPIO_Pin_0);

   while(1)
	 {
		 
			delay(1000);
		    GPIO_ResetBits(GPIOA,GPIO_Pin_0);
			delay(1000);
		    GPIO_SetBits(GPIOA,GPIO_Pin_0);		 
 
	 }
		 
   
}

7.震动传感器

7.1.震动传感器工作原理

震动传感器黑色震动检测传感器,工作时电源LED灯常量,震动信号检测LED灯发生震动的时候会保持亮的过程。正常工作模块DO口输出高电平震动瞬间D0口输出低电平,用于各种震动触发作用,防盗报警,智能小车,电子积木灯等。

7.2.震动传感器硬件引脚接线

1.VCC:接到板子电源的5V或者3.3V。

2.GND:地,连接到板子电源的负极或者GND。

3.DO: 数字信号输出口,可以与单片机相连检测环境是否发生震动。

7.3.震动传感器控制灯

初始化系统

初始化震动传感器D0相连的单片机引脚时钟。

初始化震动传感器DO相连的单片机引脚输入

配置检测震动控制LED灯

shake.c文件

cpp 复制代码
#include "shake.h"
#include "stm32f10x.h"


void Shake_Init(void)
{
		GPIO_InitTypeDef Shake_Initstruct;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,  ENABLE);
	
		
		Shake_Initstruct.GPIO_Pin=GPIO_Pin_0;
	
		Shake_Initstruct.GPIO_Mode=GPIO_Mode_IPD;
		
		GPIO_Init(GPIOA,&Shake_Initstruct);


}

main.c文件

cpp 复制代码
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"

void delay(uint16_t time)
{
		uint16_t i=0;
		while(time--)
		{
			i=12000;
			while(i--);
		}
}

int  main()
{

            Led_Init();
			Shake_Init();
            GPIO_SetBits(GPIOA,GPIO_Pin_0);
   while(1)
	 {	 
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
			{					
					GPIO_ResetBits(GPIOA,GPIO_Pin_1);
					delay(1000);
					GPIO_SetBits(GPIOA,GPIO_Pin_1);
					delay(1000);
			}
		else 
		    {
					GPIO_SetBits(GPIOA,GPIO_Pin_1);
		
	    	}


		 
	 }
		 
   
}

Led_Init同上.

8.433无线模块

1.433M无线模块工作原理

数据发射模块的工作频率为315M,采用声表谐振器SAW稳频,频率稳定度极高,当环境温度在-25~+85度之间变化时,频飘仅为3ppm。接收到信号,接收模块对应针脚输出高电平,有D0 D1D2 D3,可能对应遥控器的A/B/C/D。

2.引脚接线

1.供电正极,连接此引脚到电源,以提供433M无线模块所需的电流 2.GND(-):地,连接此引脚到电源的负极或者地。

  1. D0-D4:连接控制输入信号通常用于连接控制信号,当按键变换控制外设信号

3.433M控制灯软件开发流程

初始化系统

初始化433M D0-D4引脚对应的GPIO外设时钟

初始化433M DO-D4引脚配置

433M按键控制外设

yao.c文件

cpp 复制代码
#include "yao.h"
#include "stm32f10x.h"


void Yao_Init(void)
{
		GPIO_InitTypeDef Yao_initstruct;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
		Yao_initstruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2;
		Yao_initstruct.GPIO_Mode=GPIO_Mode_IPU;
	
		GPIO_Init(GPIOA,&Yao_initstruct);

}

main.c文件

cpp 复制代码
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "relay.h"
#include "yao.h"
#include "Exit.h"

int  main()
{
				LED_Init();
				Yao_Init();
				
	        	GPIO_SetBits(GPIOA,GPIO_Pin_1);
		//GPIO_ResetBits(GPIOA,GPIO_Pin_3);


   while(1)
	 {
		 		 
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
			{					
					GPIO_ResetBits(GPIOA,GPIO_Pin_1);

			}
		else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==1)
		    {
					GPIO_SetBits(GPIOA,GPIO_Pin_1);
		
		    }
    

		 
	 }
		 
   
}
相关推荐
王小小海3 分钟前
【原创首发】开源基于AT32 SIP/VOIP电话
stm32·单片机·网络协议·开源·嵌入式
硬匠的博客4 小时前
05STM32定时器-01定时器概述
stm32·单片机·嵌入式硬件
BT-BOX5 小时前
基于STM32电子钟闹钟数码管显示设计(Proteus仿真+程序+设计报告+原理图PCB+讲解视频)
stm32·proteus·音视频
LN花开富贵6 小时前
【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用
笔记·stm32·单片机·嵌入式硬件·学习
司六米希7 小时前
MCU vs SoC
单片机·嵌入式硬件
国科安芯9 小时前
汽车芯片成本控制:挑战、策略与未来趋势
嵌入式硬件·fpga开发·汽车
lzb7599 小时前
蓝桥杯单片机刷题——串口发送显示
单片机·蓝桥杯
智木芯语10 小时前
【41】单片机编程核心技巧:const 与 code 的存储优化
单片机·嵌入式硬件·嵌入式·#stm32·#stc8
硬匠的博客11 小时前
01STM32时钟树
stm32·单片机·嵌入式硬件
KOAN凯擎小妹11 小时前
晶振受到电磁干扰对单片机的影响
单片机·信息与通信