您现在的位置是:首页 >其他 >STM32单片机(三)第二节:GPIO输出练习(LED闪烁、LED流水灯、蜂鸣器)网站首页其他

STM32单片机(三)第二节:GPIO输出练习(LED闪烁、LED流水灯、蜂鸣器)

乘凉~ 2024-07-04 12:01:03
简介STM32单片机(三)第二节:GPIO输出练习(LED闪烁、LED流水灯、蜂鸣器)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
?专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
? 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
?专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf

链接里压缩包的解压密码:32

本大节主要学习GPIO通用输入输出口,包含两部分,第一小节主要学习GPIO的输出,第二小节是写三个简单的程序进行练习,分别是LED闪烁、LED流水灯、蜂鸣器等;第三小节是学习GPIO输入,第四小节是写两个简单的程序进行练习,分别是按键控制LED和光敏传感器控制蜂鸣器;
本小节主要是对上一节学习的GPIO输出知识进行实战练习,编写三个程序进行练习,分别实现LED闪烁、LED流水灯、蜂鸣器等,并附上程序源码;

一、本节目标

1.1 LED闪烁

现象:面包板上的有一个LED在不断地闪烁,如下图所示:

在这里插入图片描述

1.2 LED流水灯

可以看到,这8个LED正在以流水灯的方式不断循环点亮,如下图所示:

在这里插入图片描述

1.3 蜂鸣器

现象是蜂鸣器正在滴答滴答鸣响;
在这里插入图片描述

二、搭建面包板电路

每个代码的接线图都放在了工程文件夹的第一个文件夹里,
在这里插入图片描述
比如LED闪烁的接线图如下所示:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

接线过程如下:
拿出面包板,把正极的红线朝上,注意别拿反了,然后拿出STM32最小系统板,按照上图的位置,上面和右边留两个孔,下面留三个孔,然后拿出跳线,将最小系统板的正负极引到面包板的供电引脚上,这样上下四排供电引脚就可以通过最小系统板获取电源了;G引到负极,3.3引到正极,如下图:

在这里插入图片描述

跳线连接完成后,我们把STLINK按照上面的引脚标识符连接到最小系统上,如下图:

在这里插入图片描述
我们这整个系统的供电是STLINK的3.3V接到最小系统,然后最小系统又通过跳线接到上下4排的供电孔的;最后拿出一个LED,长脚正极接到正极供电孔,短脚负极接到PA0端口上,如下图:

在这里插入图片描述

这样硬件电路就搭建完成了,然后把STLINK插到电脑上;可以发现最小系统板电源灯亮起,如下图:

在这里插入图片描述

三、程序源码

首先需要新建工程,新建工程的过程可以参考第二节:STM32单片机(二)STM32环境搭建

3.1 相关库函数简介

之前我们也介绍过,操作STM32的GPIO总共需要3个步骤:

  • 第一步,打开RCC开启GPIO的时钟
  • 第二步,使用GPIO_Init函数初始化GPIO
  • 第三步,使用输出或者输入的函数控制GPIO口

查看相关库函数的功能和参数的方法有三种:

3.1.1 直接查看.h和.c文件

这里总共涉及了RCC和GPIO两个外设,先来看下这两个外设都有哪些库函数;可以在Library中找到rcc.h文件:

在这里插入图片描述
该文件里有很多RCC的库文件,但是我们最常用的只有以下这三个函数:

在这里插入图片描述
RCC_AHB外设时钟控制;RCC_APB2外设时钟控制;RCC_APB1外设时钟控制;
对应的函数实现在对应的RCC.c文件里。

这个AHB外设时钟控制函数功能是使能或者失能AHB外设时钟的;

同理GPIO的库函数也是在gpio.h中定义,在gpio.c文件中实现的;

在这里插入图片描述
GPIO_DeInit函数的功能是复位指定的GPIO外设;
AFIODeInit用来复位AFIO外设;
GPIO_Init函数非常重要,使用结构体参数来初始化GPIO口;一般我们初始化外设都是用Init函数来完成的;

在这里插入图片描述

GPIO_SetBits负责将指定的端口设置为高电平;
GPIO_ResetBits负责将指定的端口设置为低电平;
GPIO_WriteBit负责对指定端口进行写入操作;
GPIO_Write可以对16个端口进行写入操作;

3.1.2 查看用户手册

除了在源文件中直接查看函数定义外,还可以通过查看《STM32F103xx固件函数库用户手册.pdf》来查看库函数的功能和参数。

在这里插入图片描述

3.1.3 网上搜索

最后一种方式就是百度搜索,参考一下别人的代码;搜索STM32 GPIO初始化程序,

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这里都由例子,直接拿过来用就行;

3.2 LED闪烁

代码路径:STM32入门教程资料程序源码STM32Project3-1 LED闪烁Usermain.c

具体代码:

#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_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);
		Delay_ms(500);
		GPIO_SetBits(GPIOA, GPIO_Pin_0);
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
		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);
	}
}

代码解释:
RCC_APB2PeriphClockCmd:打开GPIOA的时钟;

GPIO_Mode参数:选择模式;GPIO_Mode_Out_PP表示推挽模式;
GPIO_Pin:选择引脚;GPIO_Pin_0表示操作0号引脚;
GPIO_Speed:速度选择50MHz;

将这个参数设置给GPIO_Init后,这个GPIOA外设的0号引脚就自动被配置为推挽输出、50MHz的速度了;

GPIO初始化完成后,就可以使用GPIO的输入输出函数了;

3.3 LED流水灯

首先看一下接线图,并按照接线图进行硬件接线,

在这里插入图片描述
拿出8个LED,正极都查到正极的供电孔,负极都负极依次插到PA0~PA7的端口;实物接线如下所示:

在这里插入图片描述

代码路径:STM32入门教程资料程序源码STM32Project3-2 LED流水灯Usermain.c

具体代码:

#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.4 蜂鸣器

先看一下接线图:

在这里插入图片描述

VCC正极接到正极供电孔,GND负极接到负极供电孔,然后I/O控制极就随便选择一个IO口接上就行;我们这里哦选择了PB12号口;

在这里插入图片描述
给PB12输出低电平,蜂鸣器就会响,输出高电平,蜂鸣器就不响。

代码路径:STM32入门教程资料程序源码STM32Project3-3 蜂鸣器Usermain.c

具体代码:

#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);
	}
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。