当前位置:网站首页>单片机实现模块化编程:思维+实例+系统教程(实用程度令人发指)
单片机实现模块化编程:思维+实例+系统教程(实用程度令人发指)
2022-07-06 09:03:00 【大方老师嵌入式】
单片机怎么实现模块化编程?思维+实例+系统教程(实用程度令人发指)
\\\插播一条:文章末尾有惊喜哟~///
在刚初始从事研发工作的那几年,我主要做单片机软件开发的工作,虽然功能吧都能实现,但是总觉得缺少了点什么。
总是感觉自己写的程序不够完美,移植性不够好,功能也不好扩展,每次写完程序最怕的就是客户要改功能。
假如程序架构写的不好,一改会影响到很多功能,哪怕原来是灯每秒闪1次,改成每秒闪3次这种看起来很简略的功能。
对于程序提升这块,假如没有人一个厉害的人带你,真的很难提升。
主要难在两个方面:
1.你的认知
有时候不是你做了越久,写的代码就越好,由于你一直在自己的认知水平内写代码。
假如不提升你的认知,代码自然也不会提升,所以想要提升代码水平,首先要提升的是你的认知。
2.找不到好的教程或实例
终有一天你要做中大型项目标时候就会发现,自己的代码水平和思维要提升了,但是找不到好的教程和方法。
这块最好的提升办法就是去找那些大佬写的代码,假如说公司比较资深的工程师,有事没事多请他们吃吃饭,喝喝水搞好点关系。
一般来说都愿意把自己的代码分享给你,然后你再看他们写的代码,有哪些是值得进修的,最重要的是他们实现功能的思维,然后用代码怎么去实现?
假如别人不愿意分享给你,那能够去挖一下现成稳定的,假如说STM32的规范库,蓝牙协议栈等等。
我当初的提升方法是在某个公司做产品的时候,正好有个工程师离任了,老大把他写的代码给我来维护。
当我第一眼看到他代码的时候,觉得写的很复杂,感觉在秀技术,完全没必要这样去写。
然后我用他的代码拿配套的产品来测试,发现很稳定,我尝试依照我的思维改了以后,就出现了各种问题。
慢慢地,钻研越深,我越是深刻体会这位工程师为什么要那样去写,自己跟他完全不是一个级别的。
其实他的就是基于模块化编程的思维去做的,当时还没吃透他的代码,我是从那家公司离任后又过了几年才彻底领悟他的代码。
一、单片机模块化编程怎么实现?
基于他的这种思维和实现方法,再联合我自己多年经历,最后自己又创新了一个全新的架构。
这个架构分为2个局部:
1.内核
内核主要是用来管理任务的,除了管理还提供了一些队列算法接口,方便产品使用。
2.模块化编程思维
对于单片机产品开发来说,我觉得能够分为3层:硬件层、中间层、应用层。
我们先来说说中间层和应用层。
中间层:就是不算是真正产品的功能代码,假如说解析某种自定义协议,协议解析完以后的数据才是真正产品功能数据。
上图就是对云平台协议进行解析,假如说解析wifi是否连接的命令的程序,相对应用层来说,我们只须要”wifi已连接”和”wifi未连接”这两个明确的数据,而不做详细解析程序。
这样做最大的益处就是,假设我们换了一家云平台,应用层的程序不用改,只须要改硬件层和中间层程序即可,不至于由于换了一家云平台,导致整个产品程序崩盘的问题。
一般来说,假如不是中大项目,我都直接省略中间层,毕竟代码量大了,会浪费批量出产时的时长,也浪费单片机资源。
硬件层:我们重点来说说这个,这个真的是很多人痛到不能再痛的痛点,也是很多工作几年工程师一直不知道怎么攻克的问题,专门是用来采集单片机输写数据,或者控制硬件电路输出。
采集信号有很多类型,假如说按键检测、ADC检测、红外信号接管、串口接管、SPI、IIC等这种就是属于硬件层输写数据。
我拿按键输写来举例,先来看看原理图:
电路非常简略,就几个按键串上电阻接了单片机引脚,按键按下就会有一个低电平的信号给到单片机,单片机就是通过检测对应引脚是否低电平来判断按键是否按下。
回到我们程序局部,按键检测过程我就不讲解了,我们的关键在于检测到某个按键按下以后,要怎么把这个值传给应用层。
那我是使用了回调函数来传递的,这样做的益处就是,真正能做到这个按键硬件层检测代码和应用层产品程序独立,增强移植性。
我们要使用按键功能的时候,直接注册下按键回调函数就能够了,如下图:
这样做还是比较灵敏的,不管是应用层,还是中间层,哪里须要用到按键功能,我就在哪里调用注册函数。
Ok,硬件层采集数据根本上都能够用这种方式来处理,这样就能做到真正的模块化,这个也是我以前一直想不通钻研了很久的处理方式。
下面说说控制硬件电路输出,这种输出型的没什么好说的,不波及到硬件层的采集数据传递到应用层,直接调用硬件层的控制接口就行了。
假如说我应用层要控制一个LED灯点亮,代码简略到令人发指!
快捷入门STM32单片机-软件篇
关于这个STM32的编程开发环境Keil,网上有太多相关的资源了,而且大都讲解的非常详细.所以本篇文章没意于深层细节,只会提供我进修时候的一些体会,帮助你更好的掌握相关知识.
1.规范外设库(Standard Peripheral Library)
最初始,我们都是对单片机的寄存器直接进行操作,这样运行速读更快,但是代码可读性不高,编程艰难,规范外设库的出现很好地攻克了这个问题.它提供了一系列的外设接口(其实就是封装好的函数)供我们使用.
1.1下载
在STM32官网下载规范外设库,依据自己的单片机型号进行选择.
图1.1选择单片机型号
我的单片机是STM32F103,点击F1就会出现下载界面
图1.2下载规范外设库
1.2文件分析
解压后能够看到以下文件:
图1.3规范外设库中的文件
其中,最最重要的文件是Libraries,里面包含了我们须要的所有库函数文件.
Project文件夹中提供了例子和模板,最后一个HTML文件是帮助文档,建议进修过程中参照这两个文档而不是看其他乱七八糟的教程.
在Libraries中你须要关注这三个文件夹里面的文件:
Libraries\CMSIS\CM3\CoreSupport
Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
Libraries\STM32F10x_StdPeriph_Driver
其中,第一个是核心代码,第二个是设备支持代码,第三个是详细的外设的使用.
2.开发环境
2.1软件的名称
最初始使用STM32个开发环境的时候,对它的名称一直很迷惑,后来才发现Keil是公司的名称,uversion是KEIL公司开发的一个集成开发环境(IDE)具有编译、下载调试、模拟仿真的功能,MDK(Microcontroller Development Kit)的设备数据库中有很多厂商的芯片,是专为微控制器开发的工具.
2.2下载安装
开发软件能够在Keil的官网下载,选择第一个MDK-Arm填写好相应的信息,然后依照提示安装即可.
安装成功后,你能够在Help的下拉菜单中找到uVision Help,同样的,你应该尽量通过看这个帮助来进修整个软件的使用.
图2.1 uVision Help
帮助文档里详细介绍了软件的界面,文档构造,如何调试仿真等等所有你想知道的东西.
图2.2帮助文档
3.新建一个工程
刚初始进修STM32的时候,我会觉得自己新建一个工程特别麻烦,所以愈加倾向于用别人的模板.但是这样看似提高了效率,但是具有很大的弊端,由于你不知道别人的文件是如何编排布置的,这给日后的调试埋下了隐患.所以我建议大家从最初始就把这一关给攻克掉,每次都自己新建工程.
关于如何使用Keil新建工程,能够看这篇文章.
在这里提几个自认为比较关键的点:
?C/C++ define中两个宏指令STM32F10X_HD,USE_STDPERIPH_DRIVER之间是逗号不是句号,一定要看清楚
?C/C++ Include Path要加入每一个带有.h文件的文件夹否则会报错.
?Target中勾选Use MicroLIB,这样才能够正常使用print函数
?Output中勾选Create HEX File以便烧录程序
4.编译及调试
翻开mcuisp软件,左下角选择DTR的低电平复位,RTS高电平进BootLoader,然后选择Project\Objects中的.Hex文件即可烧录程序,在单片机上观看实验现象.
5.完毕语
关于单片机的硬件说明能够看我之前写的文章:
13个基于 STM32的典型项目设计实例
STM32单片机现已火遍大江南北,各种教程资料也是遍布各大网站论坛,可谓一抓一大把,但大局部都差不多。今天总结了几篇电路城上关于 STM32的制作,不能说每篇都是典型,但都是在其他地方找?
汇编技术大...发表于嵌入式
STM32单片机的启动过程
STM32单片机的启动过程分享这篇文章,谈一下 STM32启动流程。假如读者朋友已经有过汇编相关根底,能够够好了解本文内容。汇编语言是比C语言更接近机器底层的编程语言,能让我们更好的了解和?
一个发表于亿配芯城商...
彩蛋:最近有同学跟我要单片机的资料,我特意花几个月时间,总结了我10年产品研发经验,资料包几乎覆盖了C语言、单片机、模电数电、原理图和PCB设计、单片机高级编程等等,非常适合初学者入门和进阶。除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,不是市面上打包卖的那种课程,我认为教程多未必是好事,10年前我自学快,除了自身执行力以外,还有就是教程少。不要害羞做伸手党,等你一个小红点。后期我也会组建一些纯技术交流的小圈子,让大家能认识更多的大佬,有个好的圈子,你对行业的认知一定是最前沿的。
边栏推荐
- 英雄联盟轮播图手动轮播
- 一大波开源小抄来袭
- Solve the problem of too many small files
- Several ways of MySQL database optimization (pen interview must ask)
- MapReduce instance (IV): natural sorting
- Leetcode:608 tree node
- May brush question 27 - figure
- 基于B/S的网上零食销售系统的设计与实现(附:源码 论文 Sql文件)
- leetcode-14. Longest common prefix JS longitudinal scanning method
- 机械工程师和电气工程师方向哪个前景比较好?
猜你喜欢
Withdrawal of wechat applet (enterprise payment to change)
Redis之主从复制
Une grande vague d'attaques à la source ouverte
基于B/S的影视创作论坛的设计与实现(附:源码 论文 sql文件 项目部署教程)
[deep learning] semantic segmentation - source code summary
小白带你重游Spark生态圈!
Research and implementation of hospital management inpatient system based on b/s (attached: source code paper SQL file)
33岁可以学PLC吗
Selection of software load balancing and hardware load balancing
[Yu Yue education] Wuhan University of science and technology securities investment reference
随机推荐
数据建模有哪些模型
QML type: overlay
五月刷题26——并查集
What is an R-value reference and what is the difference between it and an l-value?
tn-c为何不可用2p断路器?
Redis之哨兵模式
A wave of open source notebooks is coming
面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了
Activiti7工作流的使用
Redis cluster
May brush question 27 - figure
Segmentation sémantique de l'apprentissage profond - résumé du code source
基于B/S的网上零食销售系统的设计与实现(附:源码 论文 Sql文件)
33岁可以学PLC吗
MapReduce instance (VI): inverted index
五月刷题27——图
Hero League rotation map automatic rotation
工作流—activiti7环境搭建
[shell script] - archive file script
硬件工程师的真实前途我说出来可能你们不信