当前位置: 首页 > article >正文

STM32基本GPIO控制

目录

1.GPIO基础知识

1.1系统架构

2. IO八种工作模式

2.1STM32 IO工作模式

2.2GPIO的输出速度

3.固件库实现LED点灯

3.1LED灯

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

3.2.控制LED灯

4.STM32控制蜂鸣器

1.蜂鸣器的种类

2.蜂鸣器的控制方式

3.软件设计流程

5 按键基础知识

5.1.深入理解GPIO输入

5.2按键控制LED灯

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) 专用引脚,即一个引脚可以有多种用途,但是同一时刻一个引脚只能使用复用功能中的一个
当引脚设置为复用功能的时候,可选择推挽复用模式或者复用开漏模式,在设置为复用开漏模式时,需要外接上拉电阻。
输入模式:
1. 上拉输入 (Input Pull-up)
VDD 经过开关、上拉电阻,连接外部 I/O 引脚。当开关闭合时,外部 I/O 输入信号时,默认
输入高电平。
2. 下拉输入 (Input Pull-down)
VSS经过开关,下拉电阻,连接外部I/O引脚,当开关闭合时,外部I/O无输入信号时,默认输入低电平
3. 浮空输入 (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文件
#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文件

#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文件:

#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文件
#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文件

#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
#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

#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文件

#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文件

#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文件

#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文件

#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(-):地,连接此引脚到电源的负极或者地。
3. D0-D4:连接控制输入信号通常用于连接控制信号,当按键变换控制外设信号


3.433M控制灯软件开发流程


初始化系统
        初始化433M D0-D4引脚对应的GPIO外设时钟
        初始化433M DO-D4引脚配置
433M按键控制外设

yao.c文件

#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文件

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

		 
	 }
		 
   
}


http://www.kler.cn/a/596943.html

相关文章:

  • Android开发技能 - Perfetto系列
  • 【计算机网络原理】选择题+简答题
  • 机器翻译(蓝桥云课)
  • 批量图片压缩工具,高效减小文件大小并保持质量
  • python:music21 构建 LSTM+GAN 模型生成爵士风格音乐
  • SpringBoot+VUE(Ant Design Vue)实现图片下载预览功能
  • 仿函数 VS 函数指针实现回调
  • 存算分离是否真的有必要?从架构之争到 Doris 实战解析
  • 关于网络中的超参数小记
  • RTOS系列文章(17)-- 为什么RTOS选择PendSV实现任务切换?(从硬件机制到RTOS设计的终极答案)
  • NocoBase 本周更新汇总:优化表格区块的列和操作
  • Vue 中的日期格式化实践:从原生 Date 到可视化展示!!!
  • 青少年编程与数学 02-011 MySQL数据库应用 10课题、记录的操作
  • 【微服务架构】SpringCloud(二):Eureka原理、服务注册、Euraka单独使用
  • 蓝桥杯备考:二分答案之路标设置
  • 掌握新编程语言的秘诀:利用 AI 快速上手 Python、Go、Java 和 Rust
  • AI大白话(六):强化学习——AI如何通过“试错“成为大师?
  • 隋卞做 隋卞一探 视频下载
  • 配置DHCP(centos+OUS)
  • QHDBO基于量子计算和多策略融合的蜣螂优化算法