1.基本GPIO控制和振动传感器控制继电器、led灯

单片机开发模式


1.汇编操作寄存器。执行效率高。编写难度大,移植性差。

2.使用C语言操作寄存器。执行效率适中。编写效率低,移植性差。

3.使用库开发
标准库,执行效率稍低,但是编写效率高,移植性稍高

标准库是ST公司最早发布的固件库,对STM32芯片进行了完整的封装,覆盖了对应的外设的所有功能。它的缺点就是,它是针对某款 STM32型号设计的,可移植性差,例如,F1系列的库和F4系列的库是不同的,但是在F1系列中还是可以通用的

HAL库,执行效率稍低,但是编写效率高,移植性好

HAL库是近几年官方极力推荐的库,覆盖了全系列的芯片,可以说HAL库就是用来取代标准库的,相对标准库,HAL库有着更高的抽象、整合水平,它的API更多的集中关注在外设的公共函数功能,HAL库的移植性好,它在STM32中的通用性很强
 

1.1认识GPIO

GPIIO即通用输入/输出接口,用于感知外部信号(输入模式)和控制外部设备(输出模式)

·简单模块:LED,按键,蜂鸣器,温度传感器,使用一个GPIO就能完成数据的传输/控制

·复杂一点的模块OLED,FLASH,六轴传感器需要多个引脚组成“协议”传输数据,USART,IIC,SPI等协议

·MCU单片机大都采用引脚复用模式也就是一个GPIO,可以直接控制它输出高低电平,也可以设置为某个协议的引脚之一。此外,一些MCU的引脚,还能设置为ADC模式读取模拟信号,或者设置为DAC模式输出模拟信号

系统架构

1.2IO八种工作模式

GPIO结构图

1.STM32 IO工作模式

输出模式有四种:推挽输出,开漏输出,复用推挽,复用开漏

输入模式有四种:上拉输入,下拉输入,浮空输入,模拟输入

输出模式

1.推挽输出

让输出控制变成了VDD/VSS输出,使得输出电流增大

提高了输出引脚的驱动能力,提高了电路的负载能力和开关的动作速度

推挽输出模式下,P-MOS和N-MOS均有效,STM32对IO具有绝对的控制权,引脚可以输出高低电平

·当输出数据寄存器写1,上管导通,下管断开,输出控制接到VDD,输出为高电平
·当输出数据寄存器写0,上管断开,下管导通,输出控制接到VSS,输出为低电平

2. 开漏输出

推挽输出可以直接输出高电平,而开漏输出需要外接上拉电阻才能输出高电平

特性:

·利用外部电路驱动能力

·实现电平转换

·方便实现“逻辑与”功能

开漏输出模式下,P-MOS无效,N-MOS有效,只有低电平有驱动能力,高电平无驱动能力,引脚只能输出低电平,可以作为通信协议的驱动方式如I2C通信的引脚,使用开漏输出模式

·当输出数据寄存器写1,P-MOS断开,输出控制相当于断开,也就是高组态
·当输出数据寄存器写0,N-MOS导通,输出控制接到VSS,输出为低电平

3.复用推挽/复用开漏输出

GPIO除了作为通用输入输出引脚以外,还可以作为片上外设(USART,IIC,SPI)专用引脚,即一个引脚可以有多种用途,但是同一时刻一个引脚只能使用复用功能中的一个

当引脚设置为复用功能的时候,可以选择复用推挽模式或者复用开漏模式,在设置为复用开漏模式时,需要外接上拉电阻

输入模式:

1.上拉输入

VDD经过开关,上拉电阻,连接外部I/O输入信号时,默认输入高电平

2.下拉输入

VSS经过开关,下拉电阻,连接外部I/O输入信号时,默认输入低电平

3.浮空输入

两个上下拉电阻开关均断开,没有上拉也没有下拉,I/O引脚直接连接TTL肖特基触发器,此时,I/O引脚浮空,读取的电平是不确定的,外部信号是什么电平,MCU引脚就输入什么电平,MCU复位上电后,默认为浮空输入模式

4.模拟输入

上下拉电阻和TTL肖特基触发点均断开,引脚信号直接连接模拟输入,实现对外部信号的采集

2.GPIO的输出速度

STM32的/O引脚工作再输出模式下时,需要配置I/O引脚的输出速度,该输出速度不是输出信号的速度,而是I/O口驱动电路的响应速度。

STM32提供了三个速度:2MHZ,10MHZ,50MHZ

实际开发过程中需要结合实际情况选择合适的响应速度,以兼顾信号的稳定性和低功耗


·当设备为高速时,功耗大,噪声大,电磁干扰强

·当设备为低速时,功耗低,噪声小,电磁干扰弱

简单外设,比如LED灯,蜂鸣器建议使用2MHZ的输出速度
而复用为IIC,SPI等通信信号时,建议使用10MHZ或50MHZ以提高响应速度。

时钟:

在嵌入式系统中,时钟是微控制器(如STM32)的“心跳”,其作用类似于人体心脏为全身供血。时钟信号的稳定性和配置直接影响芯片的性能、功耗和外设功能。STM32芯片上电后默认使用内部低速时钟(如HSI=8MHz),但实际应用场景往往需要更高的性能或更精确的时钟源。初始化时钟的目的是根据需求重新配置时钟树,确保系统工作在最佳状态

硬件介绍

1.继电器

1.1工作原理

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

2.继电器的引脚说明

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

2.震动传感器

1.震动传感器工作原理

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

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

1.VCC:接到板了电源的5V或者3.3V
2.GND:地,连接到板子电源的负极或者GND
3.DO: 数字信号输出口,可以与单片机相连检测环境是否发生震动


3.震动传感器软件开发流程

·初始化系统

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

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

·检测震动控制LED灯

3.433M无线模块

1.工作原理

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

2.引脚接线


1.供电正极,连接此引脚到电源5V,以提供433M无线模块所需的电流
2.GND(-):地,连接此引脚到电源的负极或者地。
3.D0-D4:连接控制输入信号通常用于连接控制信号,当按键变换控制外设信号


3.433M控制灯软件开发流程

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

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

     433M按键控制外设

小项目:震动传感器控制继电器控制灯

#include "stm32f10x.h"
#include "relay.h"


void Relay_Init(void)
{
	   GPIO_InitTypeDef  Relay_Init;//配置继电器结构体
	   GPIO_InitTypeDef  Shake_Init;//配置震动传感器结构体

	
	   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);//初始化APB2下的GPIOA时钟

	
       Relay_Init.GPIO_Mode = GPIO_Mode_Out_PP; //设置模式为推挽输出
	   Relay_Init.GPIO_Pin = GPIO_Pin_2;        //设置为PA2引脚
	   Relay_Init.GPIO_Speed = GPIO_Speed_10MHz;//输出速度为10MHZ
	   GPIO_Init(GPIOA, &Relay_Init );          //初始化继电器结构体


   	   Shake_Init.GPIO_Mode = GPIO_Mode_IPU;    //设置模式为上拉输入
	   Shake_Init.GPIO_Pin = GPIO_Pin_3;        //设置为PA3引脚
	   GPIO_Init(GPIOA, &Relay_Init );          //初始化震动传感器结构体


}

 在.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_2);//先让LDE处于灭的状态

   while(1)
	 {  
		 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) == 0)//如果PA3输入低电平
		 {    
			    GPIO_ResetBits(GPIOA,GPIO_Pin_2); //LED亮
			    delay(1000);                      //延时大约1s
			 	GPIO_SetBits(GPIOA, GPIO_Pin_2);  //LED灭
			    delay(1000);                      //延时大约1s	 
	     }
		 else
		 {
		 		GPIO_SetBits(GPIOA, GPIO_Pin_2);
		 }
		 
    }



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值