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);
		
		    }
    

		 
	 }
		 
   
}
相关推荐
智者知已应修善业36 分钟前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
智商偏低7 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen8 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森10 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白10 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D11 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术14 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt14 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘14 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang14 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c