3.2.STM32-LED闪烁&LED流水灯&蜂鸣器 - 详解

点亮LED

首先我们按照视频把硬件电路搭载好

博主的面包板不太好使,根本插不进去,于是我就先用这个松一松孔

在这里插入图片描述

最终摆好就是这个样子
在这里插入图片描述
接下来我们跟着视频新建一下工程吧

在上一节课我们讲到过,操作STM32的GPIO总共得3个步骤

  1. 使用RCC开启GPIO的时钟
  2. 使用GPIO_Init函数初始化GPIO
  3. 使用输出或者输入的函数控制GPIO口

这里总共涉及了RCCGPIO两个外设

步骤一

我们最常用的RCC库函数是
1. RCC_AHB外设时钟控制
2. RCC_APB2外设时钟控制
3. RCC_APB!外设时钟控制

在这里插入图片描述

我们使用APB2外设时钟控制,外设选GPIOA,状态参数选ENABLE
在这里插入图片描述
步骤一完成

步骤二

我们再看GPIO的库函数,其中GPIO_Init是特别重要的函数,该函数的作用是,用结构体的参数来初始化GPIO口

//我们必须先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数,这个函数内部就会自动读取结构体的值,然后自动把外设的各个参数都配置好

//这种 Init函数在STM32中基本所有外设都有,一般我们初始化外设都是使用这个Init函数来完成的

Mode参数

我们跟随视频来到GPIO的模式(mode)参数,这和我们之前讲的GPIO有八种工作模式相吻合
在这里插入图片描述

在这里插入图片描述

  1. AIN(Analog IN)是模拟输入
  2. IN_FLOATING是浮空输入
  3. IPD下拉输入就是(In Pull Down)
  4. IPU(In Pull Up)是上拉输入
  5. Out_OD开漏输出就是(Out Open Drain)
  6. Out_PP(Out Push Pull)是推挽输出
  7. AF_OD复用开漏就是(Atl Open Drain)
  8. AF_PP复用推挽就是(Atl Push Pull)

我们点灯用的是推挽输出,所以复制Out_PP这一项

Pin参数

在这里插入图片描述

GPIOA外设的0号引脚,因而选择就是这里基于我们使用的GPIO_Pin_0

Speed参数

在这里插入图片描述

选择50MHz即可

最后,把GPIO初始化结构体的地址放到GPIO_Init的第二个参数,当这个GPIO_Init函数执行完,这个GPIOA外设的0号引脚就自动被配置为推挽输出、50MHz的速度了

它内部的主导执行逻辑就是读取结构体的参数、执行一堆判断和运算、最后写入到GPIO配置寄存器

步骤三

在这里插入图片描述

本小节我们只介绍这四个GPIO的输出函数

  1. 通过GPIO_SetBits,第一个参数是GPIOx,第二个参数是GPIO_Pin,这个函数能够把指定的端口设置为高电平
  2. GPIO_ResetBits,参数和1相同,但是把指定的端口设置为低电平
  3. GPIO_WriteBit,这个函数有三个参数,前两个也是指定端口的,第三个是BitValue,这里是根据第三个参数的值来设置指定的端口
  4. GPIO_Write,第一个参数是GPIOx,选择外设,第二个参数是PortValue,Port就是端口的意思,这个函数可以同时对16个端口进行写入执行

我们分别用一下试试

GPIO_ResetBits

先看该函数的定义,第一个参数是选择哪一个外设,我们选GPIOA,第二个选择哪个端口,我们选PA0,即GPIO_Pin_0
在这里插入图片描述

最后代码是这样的
在这里插入图片描述

经过博主的一顿debug,终于是点亮了LED
在这里插入图片描述
这说明我们端口配置的没问题,而且PA0已经输出了低电平

GPIO_SetBits

在这里插入图片描述
在这里插入图片描述
可以看到输出高电平的时候就不亮了

GPIO_WriteBit

一样的,我们跳转一下定义看第三个参数就是前两个参数在这里插入图片描述
第三个参数是BitVal

  1. Bit_RESET,清除端口值,也就是置低电平
  2. Bit_SET,设置端口值,也就是置高电平

我们先试试Bit_RESET,低电平

在这里插入图片描述
可以看到LED灯又亮起来了

再试试Bit_SET,LED熄灭

在这里插入图片描述
前三个输出函数(GPIO_ResetBits,GPIO_SetBits,GPIO_WriteBit)大家介绍完毕,GPIO_Write我们在下一个例程介绍

LED闪烁

为了构建LED闪烁,我们就应该在主循环 里,写上

点亮LED,延时一段时间
熄灭LED,延时一段时间

这样的逻辑

大家根据视频教程,把延时函数添加到工程里来在这里插入图片描述
一个输出函数GPIO_WriteBit的两种参数类型代表点亮和熄灭就是这里用的

通过我们也能够用两个输出函数GPIO_ResetBits和GPIO_SetBits分别代表点亮和熄灭

如果我们非要给一个数,1是高电平,0是低电平,这样怎么办呢?

我们可以加上一个BitAction把他们的变量类型强制转换,达到类似的效果

LED闪烁

最后我们再研究一下推挽输出开漏输出驱动 问题

推挽模式下,高低电平都是有驱动能力的,这时正反接LED都能亮(然而为啥博主反接LED搞半天也亮不起来)

开漏模式下,仅有低电平有驱动能力

LED流水灯

外设时钟是一样的,不用变,不过我们在LED闪烁工程只初始化了一个端口,而现在我们要初始化八个端口PA0~7

我们行利用按位或的操作,进行批量选中

其实批量选中外设,引脚等等也可以利用按位或的操作

为了省事,我们干脆把所有端口都设置成推挽输出模式

并且为了同时控制所有端口,我们就可以使用GPIO_Write这个函数了

我们跳转到这个函数的定义,把它的参数填充完毕

注意它的第二个参数PortVal,意思是指定写到输出数据寄存器的值
就是直接写到GPIO的ODR寄存器中的
在这里插入图片描述
所以大家直接这样写8个GPIO_Write函数

0x0010就是16,对应二进制就是0100

因为是低电平点亮方式,因而需要按位取反,表示该端口运转,其他端口不运转

在这里插入图片描述

流水灯

蜂鸣器

我们先看一下接线图
在这里插入图片描述

该VCC正极接到正极供电孔,GND负极接到负极供电孔,然后I/O控制极就随便选择一个IO口接上就行了,A15、B3、B4这三个口暂时先别选,我们从引脚定义图许可看到,这三个口默认是JTAG的调试端口在这里插入图片描述

我们按照视频进行操作

最终效果(上传中)

使用库函数的方法

Method 1

打开.h的文件的最后,看看都有哪些函数,以gpio.h文件为例,右键转到定义,查看一下函数和参数的用法。

可以下一个有道词典,方便查词
在这里插入图片描述

Method 2

打开up主提供的“参考文档”里面的这个库函数用户手册在这里插入图片描述

这里面有所有库函数的使用方法,是中文
在这里插入图片描述
里面还有例子,用的时候直接复制就行

不过该用户手册并不对应我们现在用的这个库函数的版本

我们使用的库函数是V3.5.0版本的,部分用法有差异

不过也可以看官方献出的,英文版本
在这里插入图片描述

Method 3

利用搜索引擎,参考别人的代码

下节预告:学习GPIO的输入部分

posted @ 2025-12-07 08:55  clnchanpin  阅读(17)  评论(0)    收藏  举报