写给初学者:如何在keil里建立一个自己的库,以及如何调用

目录:

              

目录

        前言

         .C和.H文件的介绍

         编写库     

         总结




前言:

由于笔者也是新入门的小白,所以在文章内不免会存在部分错误和不严谨的地方,读者若是在阅读和实践中发现笔者文章中的错误,还望斧正。


 .C和.H文件的介绍:

        可能存在不少新人小白跟笔者一样,在刚刚接触STM32的时候,都是通过在CSDN上复制别人的代码直接使用的,对于实际上的程序架构是双眼一抹黑。在这里,我们需要先对.C和.H文件下个通俗易懂的定义:

        前者是多个可以调用的自定义函数的集合,但是不可以在main文件里直接使用,需要.H文件在主函数中先声明。

        后者是用于声明.C文件的自定义函数名字的集合,需要在main文件中被调用(当然其他文件也可以调用,这里只是以main举例)

        过于抽象的简述,会使初学者较难理解。所以这里我以51和32举例,只要是接触过51和32的人,应该都注意到这两者的main文件的最上面通常会写:

#include <regx52.h>     // 51机通常的头文件
#include "stm32f10x.h" // 32机通常的头文件

        我们会发现这两个头文件都是以.h结尾的,其实这就是我们所谓的.h的文件了,而当你点开stm32f10x.h时,可以发现里面存在好几个自定义函数名字,再将这些自定义函数打开,便可发现是stm32f10x.c了。

stm32f10x.h内容

         我们在了解了.C和.H文件后,就可以理解平时口中常说的库是什么东西了。简单地说,就是编写自己需要使用的函数,并将其封装到.C文件内,再在.H文件内声明。接下来,我们将学习如何简单的去编写一个属于自己的库,并且将其添加到自己的项目内。


 编写库:

        首先我们打开Keil软件,在左侧按图所示点击:

         点击后我们会发现,在左侧项目列表中出现了一个新的组,同时我们可以通过单点它修改它的名字。这里我推荐修改为Hardware,也就是硬件驱动的意思。当然你可以修改为其他名字,但这是一种约定成俗的命名方式,在你以后创作自己项目的时候,这种命名习惯不仅可以使得你在移植其他人的程序时更为方便,还可以提高你项目的可读性。

        那么这里我们将其修改为Hardware,此时我们会发现这个组内没有项目,所以我们需要添加两个新文件,此处笔者以常见的LED为例:

         好,在完成上面步骤时,你的组内情况应该跟我一样,若是不一样,则需要检查一下上面的步骤是否错误。

         现在我们点开LED.c文件,目前应该是一个完全空白的情况,你可以把你需要的封装的函数在里面编写,具体规则和在main文件内一致,就像笔者这样:

        编译一下,在0 error 后继续。而后打开.h文件,同样的也是空白,此时应当输入:

#ifndef __**_H //**处是你的.H文件名   注意!前面是__,两个下划线,而非一个。
#define __**_H

#endif

     就像这样:

        好,这里我们需要停一下,因为笔者相信看到这里的人应该会对这三条语句产生疑问,所以在此解释一下:

        #ifndef 

                是if not defined 的简写,也就是条件编译的一种。意思就是检测 这条命令后面的代码是否被宏定义过。

       #define

                老朋友了,也就是我们最常用的宏定义,这里是与上面的#ifndef结合使用的。其作用就是定义__LED_H。

       #endif

                与上面的#ifndef相互对应,若上面出现了,则这个必须出现。可以类比与大括号。


        那么以上三条语句结合起来的意思就是:

  1. 先测试__LED_H是否被宏定义过,
  2. 如果__LED_H没有被宏定义过,定义__LED_H,
  3. 终止if。

        好了,这里笔者只解释大致的意思,需要深入的了解,可以去查一下条件编译的相关内容,若不感兴趣,那这里只需要熟记这是一个可以套用的模板就可以了。

        那么我们在哪里添加我们的函数名呢?应当在#define和#endif中添加。还是以我这个LED为例,我在LED.c里编写了一个void LED_Init(void)函数。如果我需要使用的话,应当这样:

        后续需要添加其他的函数,在后面续写函数名字即可,注意不要忘记了分号! 

        好了,当你完成这一步时,库的建立已经完成了,但是不要忘记重要的一步:将你建立的库添加到路径内,具体流程是:

         然后会跳出一个选择文件的框,你应当选择你.C和.H文件存放的路径:

         

         最后,在你的main函数头就可以调用你自己建立的库啦!


 总结:

        可能有些人在看文章后,会发出跟笔者当初一样的疑惑:这样做的意义是什么?这会让我编程代码更方便吗?

        关于这一点,笔者可以回答你一部分:像这种编写方式,一般被称为模块化编程。如果多年之后,你踏上了这方面的工作,或者是需要去编写更多、更复杂的程序,那么你肯定需要同事、朋友的协助。如果你们都使用了模块化编程的方式,那你们就可以一起协作去编写程序了,而主导者只需要对封装好的程序进行调用就可以了。所以,编写函数后对其进行适当的使用注释是非常有必要,这会非常有助于你和你同事的使用和理解。

        若是笔者的文章有所不足之处,而你想要继续学习的话,个人推荐一个UP主的视频,地址是:STM32入门教程-2021持续更新中_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1th411z7sn?p        同时感谢看完的每一个读者,希望你们多年以后仍然能够保持对单片机的热爱😁

  • 28
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值