3.2.STM32-LED闪烁LED流水灯蜂鸣器
点亮LED
首先我们按照视频把硬件电路搭载好
博主的面包板不太好使,根本插不进去,所以我就先用这个松一松孔

最后摆好就是这个样子

接下来我们跟着视频新建一下工程吧
在上一节课我们讲到过,操作STM32的GPIO总共需要3个步骤
- 使用RCC开启GPIO的时钟
- 使用GPIO_Init函数初始化GPIO
- 使用输出或者输入的函数控制GPIO口
这里总共涉及了RCC和GPIO两个外设
步骤一
我们最常用的RCC库函数是
1. RCC_AHB外设时钟控制
2. RCC_APB2外设时钟控制
3. RCC_APB!外设时钟控制

我们使用APB2外设时钟控制,外设选GPIOA,状态参数选ENABLE

步骤一完成
步骤二
我们再看GPIO的库函数,其中 GPIO_Init 是非常重要的函数,这个函数的作用是,用结构体的参数来初始化GPIO口
//我们需要先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数,这个函数内部就会自动读取结构体的值,然后自动把外设的各个参数都配置好
//这种 Init 函数在STM32中基本所有外设都有,一般我们初始化外设都是使用这个 Init 函数来完成的
Mode参数
我们跟随视频来到GPIO的模式(mode)参数,这和我们之前讲的GPIO有八种工作模式相吻合


- AIN(Analog IN)是模拟输入
- IN_FLOATING是浮空输入
- IPD(In Pull Down)是下拉输入
- IPU(In Pull Up)是上拉输入
- Out_OD(Out Open Drain)是开漏输出
- Out_PP(Out Push Pull)是推挽输出
- AF_OD(Atl Open Drain)是复用开漏
- 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的输出函数
- GPIO_SetBits,第一个参数是GPIOx,第二个参数是GPIO_Pin,这个函数可以把指定的端口设置为高电平
- GPIO_ResetBits,参数和1相同,但是把指定的端口设置为低电平
- GPIO_WriteBit,这个函数有三个参数,前两个也是指定端口的,第三个是BitValue,这里是根据第三个参数的值来设置指定的端口
- GPIO_Write,第一个参数是GPIOx,选择外设,第二个参数是PortValue,Port就是端口的意思,这个函数可以同时对16个端口进行写入操作
我们分别用一下试试
GPIO_ResetBits
先看该函数的定义,第一个参数是选择哪一个外设,我们选GPIOA,第二个选择哪个端口,我们选PA0,即GPIO_Pin_0

最后代码是这样的

经过博主的一顿debug,终于是点亮了LED

这说明我们端口配置的没问题,而且PA0已经输出了低电平
GPIO_SetBits


可以看到输出高电平的时候就不亮了
GPIO_WriteBit
前两个参数是一样的,我们跳转一下定义看第三个参数
第三个参数是BitVal
- 取Bit_RESET,清除端口值,也就是置低电平
- 取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的输入部分
