STM32入门教程-2023版【3-2】使用库函数点亮GPIO灯

关注 + 点赞 不错过精彩内容

大家好,我是硬核王同学 ,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作!

二、正式点亮一个LED灯

(3)使用库函数点亮GPIO灯

RCC初始化

首先用的是,RCC里面的APB2外设时钟控制函数,将RCC_APB2PeriphClockCmd函数名复制,粘贴到main函数中,然后右键跳转到定义

我们要点亮PA0口的LED,所以选择RCC APB2外设 GPIOA这一项,放到第一个参数,第二个参数选择ENABLE,放到第二个参数

这样时钟就开启了

2.GPIO初始化

在main函数中,接着调用GPIO_Init函数,然后右键跳转到定义

第一个参数选择GPIOA,第二个参数是一个结构体,我们先把结构体类型复制下来,在GPIO_Init上面粘贴,起个名字,叫GPIO_InitStructure。

这里这个结构体实际上也是一种局部变量,在有些老的编译器,它要求所有的局部变量定义必须放到函数的最前面,如果你的编译器是这样的话,就需要把这一行提到最前面去

接着我们复制结构体名字,用"."把结构体的成员都引出来。右键跳转,看一下说明,复制粘贴一下参数,后面三个成员都是同一个套路

那我们选择这个GPIOMode_TypeDef,Ctrl+F搜索一下

这里是GPIO的8种工作模式

复制代码
`GPIO_Mode_AIN = 0x0,`

AIN(Analog IN)模拟输入

`GPIO_Mode_IN_FLOATING = 0x04,`

IN_FLOATING是浮空输入

`GPIO_Mode_IPD = 0x28,`

IPD(In Pull Down)是下拉输入

`GPIO_Mode_IPU = 0x48,`

IPU(In Pull Up)是上拉输入

`GPIO_Mode_Out_OD = 0x14,`

Out_OD(Out Open Drain)是开漏输出

`GPIO_Mode_Out_PP = 0x10,`

Out_PP(Out Push Pull)是推挽输出

`GPIO_Mode_AF_OD = 0x1C,`

AF_OD(Atl Open Drain)是复用开漏

`GPIO_Mode_AF_PP = 0x18`

AF_PP(Atl Push Pull)是复用推挽

点灯使用的是推挽输出,所以复制GPIO_Mode_Out_PP,粘贴到GPIO_Mode这里来

然后再配置GPIO_Initstructure.GPIO_Pin,同样跳转定义

左下角这里GPIO Pin有多个定义,我们选择member这一项,双击跳转

选择GPIO_pins_define,Ctrl+F

这里因为我们用的是GPIOA外设的0号引脚,所以选择GPIO_Pin_0复制,粘贴到main函数中

第三个GPIO_Speed还是同样的套路,右键跳转到定义,Ctrl+F

输出速度选择50MHz就行了,复制粘贴到main函数中

最后,把GPIO初始化结构体的地址粘贴到GPIO nit的第二个参数,这样就初始化完成了

此时当这个GPIO_Init函数执行完,这个GPIOA外设的0号引脚就自动被配置为推挽输出、50MHz的速度了

内部的主要执行逻辑是,读取结构体参数,执行一堆判断和运算,然后再写入GPIO配置寄存器,至于具体的内部操作的细节我们就不用再关心了

`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);`

这样GPIO的初始化已经完成了,这样就可以使用GPIO的输入输出函数了

3.GPIO输入输出

打开stm32f10x_gpio.h文件,找到用GPIO的输入输出函数

GPIO_SetBits这个函数可以把指定端口设置为高电平:

`void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);`

GPIO_ResetBits这个函数可以把指定端口设置为低电平:

`*void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);`

GPIO_WriteBit,前两个参数是指定端口,第三个参数BitVal,这个是根据第三个参数的值来设置指定的端口的:

`*void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);`

这个函数可以同时对16个端口执行写入操作:

`*void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);`

首先来使用一下void GPIO_ResetBits,看一下函数的定义,第一个参数是GPIOx可以是A到G,第二个是要写入GPIO_Pin_x,x可以是0到15

那我们就写可以写为GPIO_ResetBits(GPIOA, GPIO_Pin_0);

编译、烧录一下,可以看到LED灯就已经点亮了

换成GPIO_ResetBits函数同样可得GPIO_SetBits(GPIOA, GPIO_Pin_0);

编译、烧录一下,可以看到LED灯就已经熄灭了

换成GPIO_WriteBit函数,前两个参数也是一样的,第三个参数我们可以转到定义看一下

这个参数可以是BitAction这个枚举中的一个值,Bit_RESET是清除端口值,也就是置低电平,Bit_SET是设置端口值,也就是置高电平

那么我们可以用Bit_RESET置低电平,灯点亮

GPIO_WriteBit(GPIOA,GPIO_Pin0, Bit_RESET);

那么我们可以用Bit_RESET置搞电平,灯熄灭

GPIO_WriteBit(GPIOA,GPIO_Pin0, Bit_SET);

4.LED闪烁

为了实现闪烁功能,在逻辑上应该是在循环里,点亮LED,延时一段时间,熄灭LED,延时一段时间

点亮LED可以用:GPIO_WriteBit(GPIOA,GPIO_Pin0, Bit_RESET);

熄灭LED可以用:GPIO_WriteBit(GPIOA,GPIO_Pin0, Bit_SET);

那么延时函数已经帮大家提供好了,就在STM32入门教程资料\程序源码\STM32Project\1-3 Delay函数模块文件夹里

我们可以复制把它们添加到LED闪烁的工程里,可以再新建一个文件夹,名称可以叫System,存放系统的资源

然后把这两个文件粘贴到System文件夹里

回到Keil软件,点击三个箱子的按钮,添加组,也叫System

把它往上挪个位置,然后右边点击Add Files添加文件,

打开System,把这两个文件添加进来

最后别忘了点击魔术棒按钮,添加这个新文件夹的头文件路径

双击这个文件夹,点击ok完成

我们可以打开Delay.h看一下,这里就是三个延时函数,对应的分别是微秒延时、毫秒延时和秒延时

打开.c文件可以看到这些函数的定义,可以看到是使用SysTick定时器实现的延时,具体怎么实现的可以先不管,直接拿过来用就行了

那我们回到main.c,使用这个延时函数模块,需要先在上面写#include"Delay.h"

然后复制函数到main函数

如以下方式:

`#include "stm32f10x.h"                  // Device header``#include "delay.h"`` ``int main(void)``{        ``        GPIO_InitTypeDef GPIO_Initstructure;``        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);``        ``        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_SetBits(GPIOA, GPIO_Pin_0);``                Delay_ms(500);``                GPIO_ResetBits(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函数可以不用指定的参数,也可以填0、1,需要加上强制类型转换``                GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);//强制类型转换就可以实现不用填入指定的参数,写0和1即可``                Delay_ms(500);``                GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);``                Delay_ms(500);``        }``}`

这样就可以实现LED的闪烁了!

作 者 :硬核王同学

------- END ------

关注公众号回复"加群"按规则加入技术交流群 回复"1024"查看更多内容

相关推荐
zxfly20131 小时前
STM32的DMA技术介绍
stm32·单片机·嵌入式硬件
CV金科5 小时前
蓝桥杯—STM32G431RBT6(IIC通信--EEPROM(AT24C02)存储器进行通信)
stm32·单片机·嵌入式硬件·算法·蓝桥杯
嵌入式详谈7 小时前
基于STM32的智能风扇控制系统设计
stm32·单片机·嵌入式硬件
小小怪大梦想8 小时前
RTC实时时钟
stm32·单片机·嵌入式硬件
水饺编程12 小时前
【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-2
linux·嵌入式硬件·fpga开发
电子科技圈12 小时前
IAR全面支持国科环宇AS32X系列RISC-V车规MCU
人工智能·嵌入式硬件·mcu·编辑器
SZPU领跑13 小时前
第十二届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(第一套)
stm32·单片机·算法·职场和发展·蓝桥杯
逢生博客13 小时前
Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)
开发语言·后端·嵌入式硬件·rust
Tlog嵌入式15 小时前
蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键
arm开发·stm32·单片机·mcu·物联网·蓝桥杯·iot
打地基的小白16 小时前
UART通信—基于江科大源码基础进行的改进和解析
单片机·嵌入式硬件·uart通信·代码详解