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的输入部分
浙公网安备 33010602011771号