独家吐血原创奉献 !!! - - - - - - 仅需一个头文件,就可以彻底甩开库函数进行STM32高效编程

2019-07-20 22:18发布

本帖最后由 warship 于 2019-6-3 16:42 编辑

初入原子的STM32开发板,学习MCU编程的同学,
总是为寄存器版本或库函数版本而难以取舍,
其实是各有千秋的。

寄存器版本比较繁琐,学习起来难度要大一些,但掌握之后可以随心所欲地控制;
库函数版本则入手容易一起,但往往最后一知半解,遇到问题后不知如何下手调试。

我当初也是从库函数入手的,但最后还是觉得直接控制寄存器比较爽。
对于开发MCU的攻城狮来说,搞通硬件是必须的功课,对于寄存器的了解是回避不了的,
即使STM32全部用库,许多外部硬件如NRF24L01等等,也大多是寄存器控制的,从某种程度上来说,了解和使用外设的寄存器属于硬件基本功之一。
话说STM32的库虽然入手容易,其实编程时,也是需要去熟悉库中的各种函数,翻看库函数的定义以及各种参数设置的,
功夫一点儿也不少费,何况库还有各种版本,现在又开始推广HAL库,标准库即将被放弃,
对于许多习惯了标准库的老手来说,转库也是一件比较头大的事儿。
寄存器编程虽然说无须依赖库,但编写代码时查核寄存器名、控制位的作用、具体BIT位置等确实让人烦,
编写出的代码也比较难懂,估计一两个星期不看,自己编写的代码都要再去翻看手册才能看懂。

有没有彻底不依赖库函数,而代码又相对易记易懂,比直接寄存器编程还要高效的编程方法呢?
我可以负责任地告诉你,有!

一年多来(从这个帖子http://www.openedv.com/forum.php?mod=viewthread&tid=274196开始),本人对此进行了尝试,效果还不错。
方法是:大量采用STM32所特有的高效的单BIT位段操作模式,同时辅以多BIT读写模式,
通过宏定义进行简单封装以提高代码的可读易记性。

重要的是:只须一个头文件就可以实现。头文件不占用任何资源,对你原有的寄存器编程或库函数编程没有任何
影响,达到全兼容(即你完全可以在一个工程中部分采用本人宏定义中的方法,部分仍采用寄存器编程或库函数编程)。

这个头文件共约2300多行,是本人长时间吐血原创、修改、测试,已在多个项目中试用成功,效果很好。
文件中包含大量的注释,包括寄存器各BIT位的定义、用法,基本无须再翻看器件手册了。
本着开源精神,不敢独享,现分享给大家。
顺便也想借着更多人的应用,找点儿BUG,使之更加完善。
请同好者多提宝贵意见(我会酌情采纳更新),不喜欢也请勿喷。

//////////////////////////////////////////////////////////////////////////////////
下面给出头文件,使用起来非常非常简单只须在你的工程中包含这个头文件
解压下面的包,得到一个MyBITBAND.h头文件,复制到你的工程目录中,然后#include "MyBITBAND.h"
就可以尽情地自由使用本文所述的编程方法,你可以把你手头上的程序改几句试一下,不甜不要钱,哈哈。
如果有要求具体程序范例的话,我会在后续给出(后计: 范例工程模板也已提供在下面)。
另外,需要说明一下的是,文件是以STM32 F1XX为目标的,其它型号楼主还没有测试过。
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//测试平台:ALIENTEK战舰STM32开发板
//引用请注明出处:http://www.openedv.com/forum.php?mod=viewthread&tid=294788,有问题可在本帖中提出讨论,谢谢。
//敬请关注我的开源页https://github.com/ShuifaHe/STM32/tree/BITBAND如果觉得对您有用的话,请按 “星” 号点一下赞
//修改日期:2019/05/28
//Made by warship
回复后可获取解压密码,谢谢支持。游客,如果您要查看本帖隐藏内容请回复







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
50条回答
Acuity
1楼-- · 2019-07-25 01:29
 精彩回答 2  元偷偷看……
AnthonyMong
2楼-- · 2019-07-25 02:30
好,大牛,高手
AnthonyMong
3楼-- · 2019-07-25 02:57
 精彩回答 2  元偷偷看……
warship
4楼-- · 2019-07-25 05:07
本帖最后由 warship 于 2019-6-2 13:38 编辑
nashui_sx 发表于 2019-6-1 16:56
打比方我们办公室都不允许不是office2016 以外的版本,这种大刀阔斧的改进,不论优劣,基本没法推进,自 ...

我又考虑了一下,其实并不太存在您的顾虑。
一、这只不过是一个头文件而已,并不对编译器有额外的需求,兼容能力强,处处可用。
二、虽然看似有些大刀阔斧,其实所运用的方法单一,只不过制作这个头文件工作量比较大而已,其实本质上类似于寄存器编程,将寄存器繁琐的编程助记化而已,编程出的每一句几乎都可以对应到寄存器操作的语句,基本不存在别人看不懂的问题,其实比寄存器编程更容易让别人懂。
三、这种硬件开发工作,团队作战比较少。至少也是一个人负责某个或某几个硬件模块,在代码模块上基本没有共享合作的需求,即使有,只不过多了一个头文件而已,对应的意义很容易查到。
四、其实所谓的寄存器、或库编程大多都只是对硬件外设进行初始化(其次是读取状态、标志等情况)才需要用到,对一个STM32工程来说,该部分代码整体占比并不大(但往往就是这部分硬件关联度大的工作难住了一些偏软的码农),绝大部分的代码还是用标准语句编写的逻辑或算法,所以应该无关宏旨。
liang118038
5楼-- · 2019-07-25 09:44
看看怎样。。。。。
asqw
6楼-- · 2019-07-25 13:04
觉得这个可行,基于图灵思想的计算机系统只有01,都是对位的操作,定义那么多函数不如直接位操作来得快。

一周热门 更多>