在stm32f10x芯片的基础上使用库函数开发点亮一个LED

        相信点开这篇文章的小伙伴都是对stm32芯片和kile5开发软件有过基础的,所以在这里我就不在过多赘述,不清楚的小伙伴可以在博客上搜索大神的文章了解     

       不论学习什么单片机,最简单的外设莫过于 IO口的高低电平控制,本章将向大家介绍如何在创建好的库函数模板上,通过库函数使开发板上的 LED灯点亮。让大家学会如何使用库函数控制 STM32的 GPIO输出高低电平:

1.1 STM32 GPIO介绍

1.2硬件设计

1.3软件设计

1.4实验现象

1.1 STM32 GPIO介绍

       GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。STM32芯片的 GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。不过 GPIO最简单的应用还属点亮 LED灯了,只需通过软件控制 GPIO输出高低电平即可。当然 GPIO还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下。

我所举例的的 STM32型号是 STM32F103ZET6,这也是市面上对于初学者入门学习比较好的芯片,此芯片共有 144引脚,芯片引脚图如下图所示。

          那么是不是所有引脚都是 GPIO呢?当然不是,STM32引脚可以分为这么几大类:

(1)电源引脚:引脚图中的 VDD、VSS、VREF+、VREF-、VSSA、VDDA等都属于电源引脚。

(2)晶振引脚:引脚图中的 PC14、PC15和 OSC_IN、OSC_OUT都属于晶振引脚,不过它们还可以作为普通引脚使用。

(3)复位引脚:引脚图中的 NRST属于复位引脚,不做其他功能使用。

(4)下载引脚:引脚图中的 PA13、PA14、PA15、PB3和 PB4属于 JTAG或SW下载引脚。不过它们还可以作为普通引脚或者特殊功能使用,具体的功能可以查看芯片数据手册,里面都会有附加功能说明。当然,STM32的串口功能引脚也是可以作为下载引脚使用。

(5)BOOT引脚:引脚图中的 BOOT0和 PB2(BOOT1)属于 BOOT引脚,PB2还可以作为普通管脚使用。在 STM32启动中会有模式选择,其中就是依靠着 BOOT0和 BOOT1的电平来决定。

(6)GPIO引脚:引脚图中的 PA、PB、PC、PD等均属于 GPIO引脚。从引脚图可以看出,GPIO占用了 STM32芯片大部分的引脚。并且每一个端口都有 16个引脚,比如 PA端口,它有 PA0-PA15。其他的 PB、PC等端口是一样的。

       是不是看起很复杂,连想看一下的欲望都没有,这很正常单片机的学习本身就是很枯燥无味的,对于我们初学者来说不需要清楚的知道每一个引脚的功能是什么,我们只需要对于外设引脚有一个大概的认识就行了。

1.2硬件设计

 

        DS0、DS1发光二极管阴极是连接在 STM32的 PB5、PE5管脚上。如果要使 DS0指示灯亮,只需要控制 PB5管脚输出低电平,如果要使 DS0指示灯灭,只需控制 PB5输出高电平。对于其他的 LED控制方法一样。如果你们使用的是其他板子,连接 LED的管脚和极性不一样,那么只需要在程序中修改对应的 GPIO管脚和输出电平状态即可,原理是一样的。本章我们所要实现的功能是点亮 DS0发光二极管,即让 STM32的 PB5管脚输出一个低电平。

1.3软件设计

   实现该功能的主要程序框架如下:

(1)初始化系统时钟,默认配置为 72MHz

(2)初始化 DS0对应的 GPIO相关参数,并使能 GPIOB时钟

(3)点亮 DS0

(1)初始化系统时钟

        这是stm32芯片的时钟树,左侧是stm32的外接和内部的时钟源,相当于人类的心脏,给整个stm32系统提供信号源,右侧是今天我们的重点,可以看到右侧这边全部是stm32的外设,每一个外设都有一个外设时钟使能,我们在开发stm32外设时必须要开启时钟使能,整个时钟才会工作。这是由于它本身的电子硬件所决定的。这是大学本科阶段的电子信息基础的内容,我们不做过多研究,在这里我们只需要知道必须要开启时钟使能就行了。

(2)初始化 DS0对应的 GPIO相关参数

        因为我们采用的是库函数开发,所以需要创建好库函数模板, 在此模板上进行程序开发。为了能够与文章章节对应,将创建好的模板文 件夹命名为“使用库函数点亮一个 LED”。打开此文件夹,在其目录下新建 一个 APP 文件夹,用于存放我们开发板上所有外围器件的驱动程序,本章我们所 要操作的外围器件是 LED,所以在 APP 目录下再新建一个 led 文件夹用于存放我 们编写的 led 驱动程序,假如后面要操作开发板上的蜂鸣器,同样在 APP 目录下 新建一个 beep 文件夹用于存放蜂鸣器的驱动程序,这样做的好处是方便我们能 够快速移植代码,并且工程目录也非常清晰,对后续维护带来方便。创建的文件 夹名可自定义,不过通常使用一定意义的英文来取名,让别人看到 led 文件夹就 知道里面是存放驱动 LED 的文件。本章对 STM32 的 GPIO 外设操作,需在工程中 添加 stm32f10x_gpio.c 和 stm32f10x_rcc.c 文件,对 GPIO 操作的函数都在 stm32f10x_gpio.c 中,stm32f10x_gpio.h 是函数的申明及一些选项配置的宏定 义。希望小伙伴们可以提前创建好库函数工程模板,然后还需在 KEIL5 中把新建的 APP 下的 led 文件的路径包括进来。

      系统复位后先执行的是 SystemInit()函数,ST 提供的固件库中已经帮我们完成了 STM32 时钟相关的配 置,默认配置为 72M,所以无需我们额外操作。如需修改系统时钟频率,在后续 章节我们会专门介绍。

       我们需要完成 LED 的驱动,所以在工程模板上新建一个 led.c 和 led.h 文件, 将其存放在 led 文件夹内。这两个文件内容是我们自己需要编写的,不是库文件。 通常 xxx.c 文件用于存放编写的驱动程序,xxx.h 文件用于存放 xxx.c 内的 stm32 头文件、管脚定义、全局变量声明、函数声明等内容。

      因此在 led.c 文件内编写如下代码:

        函数中的 LED1_PORT_RCC、LED1_PIN 和 LED1_PORT 等是我们定义的宏,其存 放在 led.h 头文件内。LED1_PORT_RCC 定义的是 DS0 端口时钟(如 RCC_APB2Periph_GPIOB),LED1_PIN 定义的是 DS0 的引脚(如 GPIO_Pin_5), LED1_PORT 定义的是 DS0 的端口(如 GPIOB)。这样定义宏的好处是有效提高了 程序的移植性,即使后续需要换其他端口,只需简单修改这几个宏就可以完成对 LED 的控制。

         在 led.h 文件内编写如下代码:

    该文件主要是对 led.c 源文件的函数声明以及端口管脚的宏定义,方便其他 文件调用该函数。

    在库函数中实现 GPIO 的初始化函数是:

     GPIO_Init 函数内有两个形参,第一个形参是 GPIO_TypeDef 类型的指针变 量而GPIO_TypeDef 又一个结构体类型,封装了 GPIO 外设的所有寄存器,所以 给它传送 GPIO 外设基地址即可通过指针操作寄存器内容,第一个参数值可以为 GPIOA、GPIOB、...GPIOG 等,其实这些就是封装好的 GPIO 外设基地址,在 stm32f10x.h 文件中可以找到。第二个形参是 GPIO_InitTypeDef 类型的指针变 量,而 GPIO_InitTypeDef 也是一个结构体类型,里面封装了 GPIO 外设的寄存器 配置成员。我们初始化 GPIO,其实就是对这个结构体配置。

   在 LED 初始化函数中最开始调用的一个函数是:

       此函数功能是使能 LED 对应 GPIO 外设时钟,在 STM32 中要操作外设必须将 其外设时钟使能,否则即使其他的内容都配置好,也是徒劳无功。因为 GPIO 外 设是挂接在 APB2 总线上,所以是对 APB2 总线时钟进行使能,函数内有两个参数, 一个是用来选择外设时钟,一个是用来选择使能还是失能,使能:ENABLE,失能: DSIABLE。 在 LED 初始化函数内最后还调用了 GPIO_SetBits(LED1_PORT,LED1_PIN)函 数,此函数功能是让 GPIOB 端口的第 5 个引脚输出高电平,让 DS0 处于熄灭状态, 如果要对同一端口的多个引脚输出高电平,可以使用“|”运算符,相应的在对 结构体初始化配置时管脚设置那里也可使用“|”将管脚添加进去。(前提条件 是:要操作的多个引脚必须是同一端口且配置同一种工作模式),例如:

      其实从函数名我们大致就可以知道函数的功能。函数内有两个参数,一个是 端口的选择,另一个是端口管脚的选择。 如果要输出低电平的话可以使用库函数

 

     这个函数功能和 GPIO_SetBits 是相反的,一个输出低电平,一个输出高电 平,里面参数功能是一样的。 

    最后我们在 main.c 文件内输入如下代码,代码如下: 

       主函数非常简单,首先调用 LED 初始化函数,将 PB5、PE5 引脚配置为通用 推挽输出模式、管脚速度为 50MHz。 进入 while 循环内调用库函数 GPIO_ResetBits 让 PB5 引脚输出一个低电平, 从而点亮 DS0。 如果想要实现 LED 闪烁也非常简单,只需要在 PB5 引脚输出高低电平间调用 一个延时函数即可。

1.4实验现象

将编写好的程序编译后,如果没有报错即可将程序下载到开发板内运行,运行结果是 LED 模块上的 DS0 指示灯闪烁 。

1.5课后作业

我想学到这里的小伙伴应该跃跃欲试了吧,我知道你很急,但是你先别急。你已经学会了加减法了,现在来做乘除法的题吧。给你们留了一点课后作业,感兴趣的小伙伴可以下来自己尝试一下。 

(1)按照上述方法点亮 DS1 指示灯 (2)实现 LED 闪烁 (3)实现 LED 流水灯效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风会带走遗憾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值