STM32学习笔记之GPIO及点灯实例

系列文章目录

第一章 STM32学习笔记之新建标准库

第二章 STM32学习笔记之GPIO及点灯实例

第N章 STM32学习笔记之OLED屏幕

第N章 STM32学习笔记之EXTI外部中断

第N章 STM32学习笔记之对射式红外传感器计次


目录

系列文章目录

GPIO简介

1.1. 基本结构

1.2. 具体电路结构

1.3. GPIO八种模式

1. 实例1:点灯

1.1. 使能时钟

1.2. 外设初始化

1.3. 配置引脚高低电平

2. 实例2:跑马灯

2.1. 接线图

2.2. 使能时钟

2.3. 外设初始化

2.4. 配置引脚高低电平

2.5. 添加延时函数

2.6. 使用延时函数

总结


前言:

笔记:跟着B站教学视频做的学习笔记


GPIO简介

1.1. 基本结构

  • 在STM32中,所以的GPIO都挂载在APB2外设总线上
  • 名称都是按照GPIOA、GPIOB、GPIOC等等来命名,每个GPIO外设总共有16个引脚,编号从0~15
  • 寄存器就是特殊的存储器,内核通过APB2总线对寄存器进行读写,完成输出电平和读取电平的功能
  • STM32寄存器都是32位的,但由于端口只有16位,所以只有低16位有对应端口,每一位对应一个引脚
  • 驱动器增加信号驱动能力

1.2. 具体电路结构

  • IO为输入模式时:

  • IO为输出模式时:

1.3. GPIO八种模式

见图 :

1. 实例1:点灯

实例都是基于新建工程之后,所以实操之前需要新建工程,点亮的是STM32F103C8T6上的PC13这号引脚

1.1. 使能时钟

使用外设前,需要开启外设的时钟

  • 这入RCC_APB2PeriphClockCmd函数

  • 右键该函数,跳转到该函数的定义中去

  • 复制“RCC_APB2Periph_GPIOC”为第一个参数,复制“ENABLE”为第二个参数,别忘了括号和分号

1.2. 外设初始化

开启时钟后,需要对GPIO进行初始化

  • 需要用到GPIO_Init这个函数,所以输入该函数

  • 右键GPIO_Init()函数进入该函数的定义

  • 可以看到这个函数介绍是根据GPIO_InitStruct的参数来配置GPIO的,有两个参数

  • 第一个参数是“GOIOx”,因为配置的端口是PC13,所以第一个参数为“GPIO13”

  • 第二个参数是GPIO_InitTypeDef的结构体,先定义这个结构体

  • 输入结构体名称,再输入“.”,会提示参数成员

  • 复制粘贴结构体的名字,将三个结构体参数都列出来

  • 右键结构体第一个参数Mode,进入其定义

  • 可以看到注释里说这个“GPIO_Mode”参数可以是“GPIO_Mode_TypeDef”里的一个值,但是它是注释,跳转不到该定义

  • 选中“GPIO_Mode_TypeDef”,然后“Ctrl+F”或着点击“Edit”下的“Find”

  • 点击“Find Next”,查找这个文件还在哪里出现

  • 可以看到这个定义是个枚举,选择“GPIO_Mode_Out_PP”(推挽输出)

  • 回到main函数,赋给“GPIO_InitStructure.GPIO_Mode”

  • 到配置GPIO_Pin,同样右键选择进入Pin定义里

  • 出下面出现了一个框,这个是说它的定义有很多个,我们选择“member”项,双击

  • 可以看到说“GPIO_Pin”是在“GPIO_Pins_define”里定义了,去这里查看

  • 选中“GPIO_Pins_define”,然后“Ctrl+F”或着点击“Edit”下的“Find”

  • 点击“Find Next”,查找这个文件还在哪里出现

  • 根据它的宏定义,以及端口是PC13,所以选择“GPIO_Pin_13”

  • 回到main函数,赋给“GPIO_InitStructure.GPIO_Pin”

  • 最后Speed参数也是同样的步骤,进入Speed定义,然后搜索查找它的def定义,选择50MHz的

  • 回到main函数,赋给“GPIO_InitStructure.GPIO_Speed”

  • 完成GPIO_Init函数,第二个参数是指针,所以是结构体名称,然后取地址

1.3. 配置引脚高低电平

对PC13引脚配置高低电平,即可实现该灯的亮灭

  • “GPIO_SetBits”函数是将电平配置为高电平,“GPIO_ResetBits”函数是将电平配置为低电平,参数通过查找定义来进行确认

  • 端口配置为高电平时,用“GPIO_SetBits”函数

  • 端口配置为低电平时,用“GPIO_ResetBits”函数

2. 实例2:跑马灯

实例都是基于新建工程之后,所以实操之前需要新建工程,本次操作Pin端口为GPIOA的0~2号引脚

2.1. 接线图

只接了PA0~PA2

2.2. 使能时钟

用外设前,需要开启外设的时钟

  • 这入RCC_APB2PeriphClockCmd函数

  • 右键该函数,跳转到该函数的定义中去

  • 由上面的简介可以得知,两个参数分别为“RCC_APB2Periph_GPIOA”和“ENABLE”

  • 这样时钟就开启了

2.3. 外设初始化

外设使用之前都要初始化

  • 初始化GPIO,在库函数中找到gpio.h文件,找到GPIO_Init函数

  • 输入GPIO_Init函数到主函数上,显示需要输入两个参数

  • 右键进入该函数的定义,第一个参数是GPIOA~G,第二个参数是GPIO初始化结构体

  • 定义一个初始化结构体,先把结构体类型复制到GPIO_Init函数上面(函数定义里有),结构体名字自己定义

  • 双击这个结构体,进入它的定义来看看有哪些内容

  • 输入刚刚定义好的结构体,再输入“.”后,会出来三个选项,跟上一步看到的定义一样

  • 将这结构体的成员都引出来

  • 选中“GPIO_Mode”,右键进去它的定义里

  • 继续右键进入“GPIOMode_Type这个结构体,看看它的结构体内容

  • 模式有8种,我们选择“GPIO_Mode_Out_PP”推挽输出

  • 将“GPIO_Mode_Out_PP”赋给“GPIO_InitStuct_JH.GPIO_Mode”

  • 到配置GPIO_Pin,同样右键选择进入Pin定义里

  • 下面出现了一个框,这个是说它的定义有很多个,我们选择“member”项,双击

  • 在简介里,可以看到说“GPIO_Pin”是在“GPIO_Pins_define”里定义了

  • 选中“GPIO_Pins_define”,然后“Ctrl+F”或着点击“Edit”下的“Find”

  • 点击“Find Next”,查找这个文件还在哪里出现

  • 根据它的宏定义,本次使用的是GPIOA外设的0、1、号引脚,所以选择“GPIO_Pin_0~2”

  • 回到main函数,赋给“GPIO_InitStructure.GPIO_Pin”,根据Pin的定义,Pin0~Pin2地址分别为1、2、4,就是001,010,100,就是想要初始化哪个引脚,哪个引脚位就置1,所以将Pin0~Pin2引脚进行或运算,就能得到111,即同时初始化Pin0、Pin1、Pin2引脚

  • 最后一个“GPIO_Speed”老套路,去它的定义里找,最后选择“GPIO_Speed_50MHz”

  • 最后将定义好初始化好的结构体,放在GPIO初始化函数的第二个参数中取地址,这样初始化就完成了

2.4. 配置引脚高低电平

  • 配置IO口高低电平,在库函数中找到gpio.h文件,找到“GPIO_WriteBit”函数

  • 将“GPIO_WriteBit”函数复制到main函数的循环里去,参数如下,“Bit_RESET”为配置低电平,“Bit_SET”为配置高电平,不明确的去看它的参数定义

2.5. 添加延时函数

  • 将延时函数复制

  • 在工程路径下新建一个命名为“System”的文件夹,将延时函数粘贴进去

  • 回到Keil工程,点击“三个箱子”按钮

  • 新增组,将延时函数添加进去

  • 点击“魔术棒”按钮

  • 添加新文件夹的头文件路径

这样延时函数就添加完成了

2.6. 使用延时函数

  • 在main.c中声明延时函数

  • 去"Delay.h"里复制延时函数,根据需求看是复制毫秒还是秒还是微秒的

  • 将延时函数复制在循环里,让灯不断亮灭,时间间隔可以自己设置,这里设置500ms,这样跑马灯就实现了

  • 高级写法,用一个for循环和Write函数,按位左移即可

END


总结

本章节记录了GPIO相关内容以及操作GPIO进行点灯的操作步骤,后面章节还有关于操作GPIO的实例

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值