STM32入门之点亮LED灯(以STM32F103为例)

目录

  • 一、原理简介
    • 1.1 原理图
    • 1.2 GPIO功能描述简介
    • 1.3 硬件连接
  • 二、代码实现与原理分析(详细)
    • 2.1 代码实现
    • 2.2 配置步骤
    • 2.3 原理分析
      • 2.3.1 GPIOx_CRL、GPIOx_CRH
      • 2.3.2 GPIOx_BRR、GPIOx_BSRR
  • 三、仿真测试
    • 3.1 软件逻辑分析仪DEBUG
    • 3.2 硬件效果
  • 四、小结

写在前面的话:前面我们对新建工程文件以及STM32的时钟配置做了讲解,相信大家都有了一定的了解,对代码的大致框架以及STM32内部的时钟有了深入的认识,本次入门的第一讲最基础的就是对端口GPIO的应用。

一、原理简介

1.1 原理图

首先我们先看一下自己的STM32开发板的原理图,以我使用的为例如图所示:

STM32入门之点亮LED灯(以STM32F103为例)
可以看到控制引脚的寄存器很多,引脚的模式也很多,对于初学者不是很友好,这些寄存器我们在下一节代码里会再拿出来分析,下一节我们会学习代码究竟怎么实现对这些寄存器的配置的,这里先知道一下GPIO的寄存器,每个IO端口都有7个寄存器来控制,分别是:配置模式的2个32位的端口配置寄存器GPIOx_CRLGPIOx_CRH,2个32位的数据寄存器GPIOx_IDRGPIOx_ODR,1个32 位的置位/复位寄存器GPIOx_BSRR,1个 16位的复位寄存器GPIOx_BRR;1个32 位的锁存寄存器GPIOx_LCKR。本节我们主要关注和用到的寄存器是CRL、CRH、BRR、BSRR寄存器。

1.3 硬件连接

本文我们要完成的是点亮LED,从最简单的角度去思考,我们需要做的就是让一个端口输出高电平或者低电平实现点亮或者关闭LED灯的效果,我们先来看一下硬件连接图:

STM32入门之点亮LED灯(以STM32F103为例)
代码如下:
led.c:

led.h:

main.c:

main.h:

这是我们本节文章实现需要用到的代码,编译测试无错误无警告可以正常使用

2.2 配置步骤

第一步:首先先来看在我们的led.c里面初始化LED的函数led_init();我们要使用引脚这时候就需要对引脚进行初始化操作,我们从ST标准库中找到GPIO有关的头文件:stm32f10x_gpio.h,按照之前讲过的方法先打开头文件拉到文件最底下找函数,眼睛一瞥找到了这个叫GPIO_Init的函数,如图:

STM32入门之点亮LED灯(以STM32F103为例)
通过后面官方的注释也可以更加清晰的了解,结构体有三个成员变量,分别是:引脚号、引脚输出速度、引脚模式。
接着我们就对我们所需要的功能进行结构体初始化,那我们怎么知道应该填入的参数是什么样子的呢,可以通过看GPIO_Init函数的本体,如图:
STM32入门之点亮LED灯(以STM32F103为例)
可以看到在GPIO_Init函数内部通过框框里的三个函数来验证输入参数的合法性,通过一次跳转①②③可以查看我们需要输入的参数的规范,如下为配置的LED引脚:

引脚号为GPIO_Pin_0(我们LED的引脚是GPIOB.0),引脚模式为GPIO_Mode_Out_PP(推挽输出),引脚速度为GPIO_Speed_2MHz(2MHz)

引脚模式 说明
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 输入浮空
GPIO_Mode_IPD 输入下拉
GPIO_Mode_IPU 输入上拉
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出
本次我们选用的是推挽输出,推挽输出和开漏输出的最大区别是,推挽输出可以输出高低电平,但是开漏输出只能输出低电平若要输出高电平需要外接上拉电阻,我们点亮LED灯需要高低电平的切换因此选择推挽输出,有关这两种输出方式后续的文章会写到。
对于输出速度的选择,我们使用的最低的2MHz,这里因为控制LED对信号带宽没有要求,因此选择速度低功耗也小。
最后只需调用初始化函数就可以将引脚口初始化了:

第二步:在使用GPIO端口前以及STM32任何外设前,我们都需要开启对应外设的时钟,通过上一讲时钟的讲解我们知道GPIOB挂载在APB2下,因此我们在stm32f10x_rcc.h中找到对APB2时钟设置的函数RCC_APB2PeriphClockCmd,如图进行开启GPIOB口的时钟:

第三步完成以上两部后我们的LED引脚初始化就算是完成了,最后我们通过给LED引脚给高电平使其初始化后保持熄灭的状态。

2.3 原理分析

2.3.1 GPIOx_CRL、GPIOx_CRH

以上的函数配置我们都没有直接对我们说的GPIO的寄存器进行操作,这是因为ST标准库已经对寄存器进行了封装,我们调用的函数其实最底层完成的工作就是的对寄存器进行读写操作,接下来我们看一下我们在初始化引脚的时候对究竟对什么寄存器进行了什么操作。
我们来看GPIO_Init(GPIOB, &GPIO_LED);究竟做了什么事情

来源:水水爱污污

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年9月21日
下一篇 2022年9月21日

相关推荐