1.STM32学习之GPIO输出---LED流水灯和蜂鸣器震动

1.前言

简单的学习完51之后就开始学习STM32了,而两者的学习区别还是在于寄存器。51是通过直接对寄存器进行读写来控制要用的外设,这点对于我来说说实话呢麻烦的,要去查很对寄存器的地址进行配置,而STM32就有所不同,它是直接将寄存器的使用进行封装作为库函数,如果我们想要使用哪个寄存器,直接对寄存器进行调用,并且设置参数即可。

第一章学习的是GPIO的输出和输入,简单来说GPIO既可作输出端口,也可以做输入端口。输出或者输入端口连接外设。做输出端口时,可以进行点亮一个灯/点亮流水灯/让蜂鸣器响,当作GPIO输入时,可以进行按键控制LED灯/光敏电阻控制蜂鸣器等实验,接下来我会简单介绍GPIO,同时怎样设计程序实现上述的这些实验。

输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

2.GPIO结构

内核通过APB2外设总线对寄存器进行读写,驱动器增加信号的驱动能力。

3.GPIO位结构

下面的图简单地介绍了一个I/O引脚地内部电路。包含输入和输出两部分。

输入即信号从I/O引脚流入但单片机内部,就是读出的过程,我们可以借助OLED显示屏将读出的部分显示在OLED 显示屏上,在输入的过程中(读出),信号可以选则开关打开上拉输入或者是下拉输入,开关接在上面即使上拉,接在下面就是下拉,在经过TTL肖特基触发器这里实际上是施密特触发器,它的作用是对输入的电压进行整形,如果输入电压大于阈值,则输出高电平,如果输入电压小于阈值,则输出低电平,信号经过整形后流到输入数据寄存器,数据进行读出,最后经过APB2总线到达内核。

输出即信号从单片机的内部流到I/O口的过程就是写入的过程,通过对输出寄存器的位进行设置,同时在对输出数据寄存器进行写数据,经过输出控制,选择推挽输出或者是开漏输出等输出方式,信号则就流出了I/O口。简单的介绍一下推挽输出和开漏输出。推挽输出有很强的驱动能力,这里需要PMOS和NMOS均有效。对于开漏输出而言,只有NMOS有效,假如数据寄存器为0,NMOS导通,输出直接接到VSS上,则输出就是低电平。开漏输出可以作为通信的驱动方式比如说I2C,也可以作为输出5V的电平信号。

4.GPIO模式

通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式

(1)GPIO_Mode_AIN 模拟输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_IPU 上拉输入
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出
(8)GPIO_Mode_AF_PP 复用推挽输出

typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

 

5.使用GPIO步骤

(1)使用RCC开启GPIO时钟

(2)使用GPIO_Init函数初始化GPIO

(3)使用输入/输出控制GPIO

6.LED与蜂鸣器连接STM32硬件电路

7.点亮一个LED灯

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
															//使用各个外设前必须开启时钟,否则对外设的操作无效
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//GPIO引脚,赋值为第0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
															//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOA的初始化
	
	/*主循环,循环体内的代码会一直循环执行*/
	while (1)
	{
		/*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/
		
		/*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_SetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms
		
		/*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);		//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);			//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms
		
											//延时500ms
	}
}

8.点亮LED流水灯

#include "stm32f10x.h" // Device header
#include "Delay.h"

int main(void)
{
	GPIO_InitTypeDef GPIO_Inistructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIO时钟
	//使用某一个外设之前必须要开启时钟否则对外设无效
	GPIO_Inistructure.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO模式,定义为推挽输出
	GPIO_Inistructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 |GPIO_Pin_7;//GPIO引脚,赋值0-7
	//GPIO_Inistructure.GPIO_Pin=GPIO_Pin_All;
	GPIO_Inistructure.GPIO_Speed=  GPIO_Speed_50MHz;//GPIO速度,赋值为50MHz
	GPIO_Init(GPIOA,&GPIO_Inistructure);//将赋值后的构体变量传递给GPIO_Init函数
	//GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	//GPIO_SetBits(GPIOA,GPIO_Pin_0);
	//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET );
  while(1)
	{	
		/*使用GPIO_Write,同时设置GPIOA所有引脚的高低电平,实现LED流水灯*/
		GPIO_Write(GPIOA,~0x0001);//0000 0000 0000 0001 PA0引脚为低电平,其他引脚均为高电平,注意数据有按位取反
		Delay_ms(500);
		GPIO_Write(GPIOA,~0x0002);//0000 0000 0000 0010 PA1引脚为低电平,其他引脚均为高电平
		Delay_ms(500);
		GPIO_Write(GPIOA,~0x0004);//0000 0000 0000 0100 PA1引脚为低电平,其他引脚均为高电平
		Delay_ms(500);
		GPIO_Write(GPIOA,~0x0008);//0000 0000 0000 1000
		Delay_ms(500);
		GPIO_Write(GPIOA,~0x0010);//0000 0000 0001 0000
		Delay_ms(500);
		GPIO_Write(GPIOA,~0x0020);//0000 0000 0010 0000
		Delay_ms(500);
		GPIO_Write(GPIOA,~0x0040);//0000 0000 0100 0000
		Delay_ms(500);
		GPIO_Write(GPIOA,~0x0080);//0000 0000 1000 0000
		Delay_ms(500);
		
	}
}

9.控制蜂鸣器震动

#include "stm32f10x.h" // Device header
#include "Delay.h"

int main(void)
{
	GPIO_InitTypeDef GPIO_Inistructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟
														//使用各个外设前必须开启时钟,否则对外设的操作无效
	GPIO_Inistructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Inistructure.GPIO_Pin=GPIO_Pin_12;
	GPIO_Inistructure.GPIO_Speed=  GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_Inistructure);//读取结构体的参数
   while(1)
	{	
	/*主循环,循环体内的代码会一直循环执行*/
	 GPIO_ResetBits(GPIOB,GPIO_Pin_12);//将PB12引脚设置为低电平,蜂鸣器鸣叫
	 Delay_ms(100);
	 GPIO_SetBits(GPIOB,GPIO_Pin_12);//将PB12引脚设置为高电平,蜂鸣器停止
	 Delay_ms(100);
     GPIO_ResetBits(GPIOB,GPIO_Pin_12);//将PB12引脚设置为低电平,蜂鸣器鸣叫
	 Delay_ms(100);
	 GPIO_SetBits(GPIOB,GPIO_Pin_12);//将PB12引脚设置为高电平,蜂鸣器停止
	 Delay_ms(700);
	}
}

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值