查看原文
其他

【连载】通过"库文件"学单片机驱动编程(3)

未知bug 最后一个bug 2021-01-31

1、首先聊一聊

    今天开始该【连载】的三篇写作了,同昨天一样我也会把文章分享到各个学习群供大家参考。在分享的过程中不经意间碰到了另外一位公众号主在推荐自己的技术文章,因为这位作者也是我的微信添加的公众号作者,觉得挺巧的,于是便添加了他的QQ。毕竟我现在还没有几个认识的公众号作者(说着说着在写作这条路上心里一股莫名的孤独感,哈哈),跟他聊了10到20分钟的样子吧,谈到了起初的艰难,过程中的坚持,以及如今的现状等等,四个字形容-“一言难尽”

    不过对于我而言怎么说?我仅仅只是一个刚刚进入公众号的作者,觉得很多方面我还没有做得很好,都需要我去改进,就像我们加入一家公司,我们都需要用积极的态度去对待每一件事情,当你为公司做出了极大地努力却没有获得新知识技能和收获或者是职位薪水的提升,这个时候你会选择跳槽了!好了,今天就简单聊这么多,进入今天的正题。

2、让"库"来教你如何命名

    大部分初学小伙伴们都是从int a = 1;等等过来的吧(哈哈,大佬除外),在前面我写过一篇《C语言代码重构技术》里面提到过变量和函数的名称是重构的灵魂,太诡异的命名真的是会让人抓狂。并且,你做完项目以后放几个月代码拿回来读都会觉得吃力,更别说你以后一起共事的同事了。(哈哈,不友好的同事一定说:这是什么XX代码。)

    对于有一定经验和基础的小伙伴可能会有自己的一套命名规范,个人觉得只要容易让人接受都是OK的,好了,这里我们来一起看看ST固件库那群大佬大体是怎样命名的。

1)文件如何命名

    下面是我简单为大家画的一个结构简图:

    首先对于模块化设计的两个文件除了后缀名不同之外基本上是以"stm32f4xx_外设"的形式进行命名,因为ST公司有不同型号的芯片,这样便可以区分不同的驱动程序,同时也说明了具体是哪个外设的名称。以后我们如果拿到一款其他芯片进行寄存器编程的芯片,在封装一些驱动的时候的文件名称可以仿照

2)宏定义、函数名等如何命名

    下面我们截图一部GPIO和外部中断exit部分代码来为大家总结一下:

    1)对于寄存器宏定义基本上都是以全大写字母表示,并且是“外设名_寄存器名称”的形式。

    2)对于外设所封装的函数名称形式以"外设_函数功能"的形式,并且一般整个函数名称仅仅只使用一个下划线来区分外设和功能,并且函数功能部分的单词首字母为大写。而且非常需要注意的是有些小伙伴们非常喜欢缩写,大体看来ST的命名很少缩写除了一些非常长或者是大家一眼就能看懂的缩写除外。至于为什么不要缩写大家可以一下我前面的文章《C语言代码重构》,这里就不在凑字数了。

    3)不同外设和功能模块他们的函数功能部分的命名几乎是一样的,这样对于初学者或者是新来的同事使用一个模块的时候都会得心应手。所以加入我们以后有串口驱动和SPI驱动也可以把相关功能的函数名定义得相似。比如XXX_Init();XXX_DeInit();等等。

2、让"库"来教你如何封装底层寄存器

    我们还是以最简单的GPIO外设为例,为大家解析,首先借助一下GPIO中部分代码。

    1)所谓封装就是让外部尽量不要访问到内部私有成员,那么我们由上面的截图了解到大部分的头文件中的接口函数第一个函数都是一个外设寄存器结构体指针GPIO_TypeDef* GPIOx,我们在使用的时候是传入的外设的起始地址,那么整个结构体成员就映射上了该部分的所有寄存器

    2)除了这个外设寄存器结构体指针之外的参数都是数据寄存器的配置参数,如GPIO_Pin,如果需要配置寄存器的参数特别多的话,他们也会以结构体指针的形式传到函数内部来供寄存器结构体指针进行配置,如代码中的GPIO_InitTypeDef* GPIO_InitStruct。

    3)我们都知道寄存器的配置如果我们不做处理的话,基本上就是配置为0,1或者一些数值,那么这样会让用户或者编程人员都难以理解,这样固件库中通过宏定义和枚举为每个寄存器的数值进行了注释,我们以后使用的话就只需要传入对应的宏定义或者枚举即可。如下代码

3、今日分析总结

    今天供大家特别理解的内容不是很多,主要是介绍了一下固件库里面的书写命名规则和封装技巧。这个便于我们以后编程中借鉴并使用,我们在编程中一定要从现在做起养成一些良好的习惯,不要一定义全局变量就是aa,bb,定义局部变量就是i,j什么的,这样程序真的有时候难以理解,我们应该为代码中的每一块负责,并好好的利用好他们为我们服务。

    本文中提到的规范有限,大家可以网络上搜索一些编程规范简单看一下,或者再看看stm32库文件中都是怎么命名,怎么注释等等。ST公司肯定是有他们的命名规范及书写文档的,我们的到他们的文件就应该从代码中进行学习。

    好了,今天就为大家讲到这里,库中还有很多宝贝,后面待我详细讲解。这里是公众号:“最后一个bug”,我们下期见。

推荐阅读

【连载】通过"库文件"学单片机驱动编程(1)

【连载】通过"库文件"学单片机驱动编程(2)

嵌入式编程之动态接口技术(经验干货)

嵌入式编程之"重构"代码(C语言版本)

嵌入式编程必备之多方法测定程序运行时间(经验篇)

单片机常用程序框架之分时轮询(详注代码)

单片机开发之节省内存大法(C语言版本)

一文搞定通信协议中CRC校验(附代码)

C语言数值常量的“那些事”(细节分析)

更多精彩文章大家可以在主页目录中查找!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存