❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括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闪烁
- 1.2 LED流水灯
- 1.3 蜂鸣器
- 二、搭建面包板电路
- 三、程序源码
- 3.1 相关库函数简介
- 3.1.1 直接查看.h和.c文件
- 3.1.2 查看用户手册
- 3.1.3 网上搜索
- 3.2 LED闪烁
- 3.3 LED流水灯
- 3.4 蜂鸣器
一、本节目标
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入门教程资料\程序源码\STM32Project\3-1 LED闪烁\User\main.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入门教程资料\程序源码\STM32Project\3-2 LED流水灯\User\main.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入门教程资料\程序源码\STM32Project\3-3 蜂鸣器\User\main.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);
}
}