完整课程体系(公众号每日更新一讲):
本讲知识点:点亮一个发光二极管、模块化编程
3.1.1 从点灯开始
从本讲开始,我们就要开始驱动核心板上的外设了,第一个外设当然是“亘古不变 ”的点灯了。在点灯之前,大家是否有过这样的经历,在写驱动代码的时候,只有一个源文件,里面第一个函数为主函数,后面跟着很多外设的驱动函数,这样整个代码臃肿混杂,很不利于我们进行维护或二次开发,因此模块化编程大家是很有必要掌握的。所谓模块化编程,就是一个.c(源文件)对应一个.h(头文件),每个外设都有对应的.c和.h,这样要使用某个外设驱动,只需包含对应的头文件即可,这种模块化编程非常利于开发与移植。我们以后的外设驱动都是采用模块化进行编程。
首先,我们复制一个上一讲所搭建好的工程模板(路径自定义),文件夹改名为LED,打开文件夹单击工程名也改名为LED,同时创建一个 Drive文件夹,在里面新建一个src(包含用户编写的所有源文件)和一个 Inc(包含用户编写的所有头文件)文件夹,如下图所示:
图3-1-1 LED模块化编程搭建
然后,打开LED工程,本讲“ 点灯 ”所需要驱动的是GPIO外设,因此我们需要添加GPIO的标准库。
图3-1-2 添加GPIO库函数
今后我们驱动其他外设,添加对应库函数的方法都与上述一致,以后就不赘述了。接下来,我们就需要编写GPIO的初始化函数,先新建两个新文件,分别命名为led.c和led.h,led.c放于Drive\src下,led.h放于Drive\inc下,如下图所示:
图3-1-3 新建led.c源文件
图3-1-4 新建led.h头文件
接下来需要新建一个DRIVE分组,并将led.c源文件添加到DRIVE分组下,同时还需要添加led.h头文件路径,具体如下图所示:
图3-1-5 添加led.c至DRIVE分组下
图3-1-6添加头文件路径
接下来,编写led.c中GPIO初始化函数,写之前我们先看一下原理图中用户灯的驱动电路。USER_LED对应的是PC13引脚,由LED的驱动电路不难看出,当PC13输出为高电平时,发光二极管两端电压都是高电平,不导通则灯自然也不会亮,当PC13输出为低电平时,发光二极管处于正向导通状态,则灯会亮。这里限于篇幅只展示写好后的代码,具体过程见对应的课程视频。
图3-1-7 USER_LED驱动电路
图3-1-8 LED初始化配置
图3-1-9 led.h头文件
图3-1-10 主函数点亮LED
主函数中,先初始化USER_LED对应的GPIO引脚PC13,while(1)中PC13循环输出低电平,所以开发板上的USER_LED应该始终被点亮,不会熄灭,接下来我们就将程序“ 烧写 ”到开发板中观察现象。
图3-1-11 DEBUG配置
图3-1-12 仿真器与核心板连接示意图
图3-1-13 程序编译与下载
图3-1-14 实验现象
3.1.2 让灯闪烁起来
现在灯可以被点亮和熄灭了,但它只是维持一种状态,如果我们想让它在一段时间内亮,一段时间内灭,这时就需要加入延时了。现在我们在工程里再加入delay.c和delay.h两个文件,添加步骤和led.c、led.h一样,这里就不在赘述了(不熟悉的话可以再仔细理解下前面的文档和对应视频讲解)。添加好源文件和头文件进行编译后如下图所示:
图3-1-15 添加delay.c和delay.h
这里给大家展示一种“ 粗 ”延时法,相信学过51的朋友都很熟悉,整体代码如下图所示:
图3-1-16 “粗”延时函数
我们在主函数里加入这个延时函数,编译后没有错误下载到开发板上观察灯的闪烁情况,用示波器实际测量它的波形,如下图所示:
图3-1-17 “ 粗 ”延时波形
根据示波器所测的波形,频率为0.61Hz,周期约为1.64s,我们可以看出这种“ 粗 ”延时法不能直接准确实现我们想要延长的时间,日后我们需要用到准确的毫秒级甚至微妙级延时,因此这种方法在STM32中不适用,具体的准确延时内容请阅读下一讲内容。
本讲就到这里,趁热打铁,大家亲自动手试一试吧
领取专属 10元无门槛券
私享最新 技术干货