STM32 GPIO输出实现LED闪烁、LED流水灯和蜂鸣器功能

目录

一、GPIO简介

二、GPIO基本结构

三、GPIO模式

四、GPIO常用寄存器

(1)端口配置低\高寄存器(GPIOx_CRL/GPIOx_CRH)(x=A…E)

(2)端口输入数据寄存器(GPIOx_IDR)(x=A…E)

(3)端口输出数据寄存器(GPIOx_ODR)(x=A…E)

(4)端口位设置/清除寄存器(GPIOx_BERR)(x=A…E)

(5)端口位清除寄存器(GPIOx_BER)(x=A…E)​ 

(6)端口位配置锁定寄存器(GPIOx_LCKR)(x=A…E)​ 

五、主要程序

1、第一步:使用RCC初始化GPIO时钟

2、 第二步:使用GPIO_Init函数初始化GPIO

3、第三步设置高低电平

六、完整程序

1、点亮一个灯(低电平亮)

2、流水灯(低电平亮)

3、蜂鸣器(低电平的时候响)

七、其他基础知识

一、GPIO简介

GPIO

General Purpose Input Output
)通用输入输出口

可配置为
8
种输入输出模式

引脚电平:
0V~3.3V
,部分引脚可容忍
5V

输出模式下可控制端口输出高低电平,用以驱动
LED
、控制蜂鸣器、模拟通信协议输出时序等

输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、
ADC
电压采集、模拟通信协议接收数据等

二、GPIO基本结构

GPIO中寄存器有32位,而端口只有16位,故寄存器只有低16位对应的有端口

驱动器用来增加信号的驱动能力

寄存器只用于存放数据 

三、GPIO模式


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

四、GPIO常用寄存器

(1)端口配置低\高寄存器(GPIOx_CRL/GPIOx_CRH)(x=A…E)

​ 端口配置寄存器共16位,但每4位数据表示1位,共需要64位,而STM32中每个寄存器都为32位,因此分为端口配置低寄存器和端口配置高寄存器。通过端口配置寄存器可以配置GPIO工作模式与端口输出速度。

注意:输出速度可以限制输出引脚的最大翻转速度,作用是降低功耗、提高稳定性,一般情况下配置为50MHz。

(2)端口输入数据寄存器(GPIOx_IDR)(x=A…E)

​ 输入数据共16位,但寄存器共32位,因此寄存器高16位为空。

(3)端口输出数据寄存器(GPIOx_ODR)(x=A…E)

​ 输出数据共16位,但寄存器共32位,因此寄存器高16位为空。

(4)端口位设置/清除寄存器(GPIOx_BERR)(x=A…E)
​ 高16位用于位清除,低16位用于位设置。

高16位:为0不影响;为1清0;
低16为:为0不影响;为1置1。

(5)端口位清除寄存器(GPIOx_BER)(x=A…E)
​ 高16位为空,低16位用于清除,方法同上。

(6)端口位配置锁定寄存器(GPIOx_LCKR)(x=A…E)
​ 高15位为空,低17位用于锁定,较少使用。

五、主要程序

    1、第一步:使用RCC初始化GPIO时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2、 第二步:使用GPIO_Init函数初始化GPIO

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50兆hz的速度
    //用结构体的函数初始化GPIO口
    GPIO_Init(GPIOA, &GPIO_InitStructure);//第二个参数为指向结构体的指针,故传地址

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

若要使用多个端口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

若要使用A/B/C/D的全部端口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All

3、第三步设置高低电平

		GPIO_ResetBits(GPIOA, GPIO_Pin_0);//0
		GPIO_SetBits(GPIOA, GPIO_Pin_0);//1
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//0
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);//1
		
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);

GPIO_WriteBit直接写1或0来设置电平的时候,需要将将数字强制转换成枚举类型BitAction

Bit_RESET和Bit_SET也是枚举类型BitAction

六、完整程序

1、点亮一个灯(低电平亮)(LED连接PA0口)

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

int main(void)
{
	//使用RCC初始化GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//使用GPIO_Init函数初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50兆hz的速度
	//用结构体的函数初始化GPIO口
	GPIO_Init(GPIOA, &GPIO_InitStructure);//第二个参数为指向结构体的指针,故传地址
	
	while (1)
	{
		//使用输出或输入函数控制GPIO口
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);//0
		Delay_ms(500);
		GPIO_SetBits(GPIOA, GPIO_Pin_0);//1
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//0
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);//1
		Delay_ms(500);
		
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
		Delay_ms(500);
	}
}

2、流水灯(低电平亮)(LED连接PA0~PA6)

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

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001 低电平点亮
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000
		Delay_ms(100);
	}
}

3、蜂鸣器(低电平的时候响)(蜂鸣器接口为PB12

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

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(100);
		GPIO_SetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(100);
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(100);
		GPIO_SetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(700);
	}
}

七、其他基础知识

1、A15、B3、B4三个端口默认是JTAG调试端口,如果要当作普通端口,要进行一些相关的配置

2、有源蜂鸣器:内部自带振荡器,频率固定

     无源蜂鸣器:不带振荡器,要提供震荡脉冲才能发生,可以发出不同频率的声音

3、推挽输出高低电平都有驱动能力

     开漏输出高电平相当于高阻态,没有驱动能力,低电平有驱动能力

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 GPIO输出实现LED闪烁、LED流水灯和蜂鸣器功能

发表评论