关于单片机STM32裸机程序架构设计

发布者:幸福旅程最新更新时间:2024-05-07 来源: elecfans关键字:单片机  STM32 手机看文章 扫描二维码
随时随地手机看文章

本着授人以渔的原则,既提供我一直在用的程序架构,也讲程序架构的设计思路。

如果本文内容,你都能领悟并做到,不管项目多复杂,都将游刃有余。


我研发的那几年,接触大多数工程师,都没有程序架构的概念,基本一个while死循环干到底。

模块之间也没有封装好,导致代码写好以后,扩展性和维护性太差,类似的功能代码,也很难移植到新项目去复用。

早期我也是这样写的,反正实现功能就行了,代码好不好,功能上又看不出区别。

不过,等你接触到复杂的项目时,这招就行不通了,没设计好程序架构,根本做不稳定。

我意识到这个问题,是碰到两种需求的时候:

1.是做一个基于STM32的网关项目,项目做完以后,客户老是要改功能,客户不懂技术,在客户眼里,觉得改一个LED闪烁效果很简单,但对于程序架构没设计好的工程师来说,就是一个噩梦,比如每隔5秒快闪2次这种恶心的需求,搞不好很多代码都要重新组织。

我经常会被这种问题搞到头痛,特别是客户又催得急的时候,经常加班加到焦头烂耳,越急又越搞不出来。

2.我做过的很多项目,其实很多功能都有重复的,比如很多产品都有LED、都有按键、都有掉电参数存储、都有串口协议解析等等。

但是程序架构没写好,导致想移植代码,过来新项目复用时,不太好改,比如老项目才1个LED,新项目有6个LED,类似的还有按键等等。

后面为了有更多的时间摸鱼,我开始思考,怎么把程序写得,改起功能来很方便,代码复用性又很强那种,当时还不知道这个叫程序架构设计。

程序架构,我觉得是一个系统的学问,贯穿着整个项目,而不是具体某些细节。

就是各种功能模块,比如LED特效功能,按键检测功能,菜单功能,系统参数存储功能、语音功能、OTA升级功能等等。

这些功能模块的设计,我通常是采用硬件驱动代码和功能逻辑代码分离的方式,用大白话来说,就是一个功能模块,我可能会分2个.c文件来写,硬件驱动代码我以hal_xxx.c命名,功能逻辑代码我以mt_xxx.c命名。

硬件驱动代码主要是和单片机外设的配置代码,比如设置GPIO、Timer、串口、SPI这些,然后提供硬件接口给mt_xxx.c调用。

拿无际项目特训营的项目6来举例,这个项目可以实现远程控制,因为加了WiFi和4G模块。

如果你接触过类似项目,单片机和云平台之间,其实还有个串口通讯协议的,类似于下图这种。

a7c675aa-7f7a-11ee-939d-92fbcf53809c.png

按照我的思维,我会这样去设计程序:

单片机外设驱动的配置、串口发送数据、接收数据代码,我都放在hal_uart.c里。

a7e4cadc-7f7a-11ee-939d-92fbcf53809c.png

串口协议数据发送和解析的代码,我会放在mt_protocol.c文件里。

a808c824-7f7a-11ee-939d-92fbcf53809c.png

这样就能实现硬件驱动代码和功能逻辑代码彻底分离。

那这样的好处是什么?

1.万一要换单片机了,如果通讯协议不变的情况下,mt_protocol.c文件代码可以不用改,只要改hal_uart.c硬件驱动程序,就能对接起来。

2.如果通讯协议格式变了,单片机不变,那只需要改mt_protocol.c文件代码就可以了。

3.调试方便,比如mt_protocol.c的功能,可以在PC上搭建一个开发环境先调试好,再对接硬件驱动接口,对于复杂的功能,这招还是很有用的,毕竟keil仿真调试没那么方便灵活。

这种设计,就是一种架构思维,解决了代码扩展性和移植性的问题。

如果每个功能模块都采用这种思维去设计,最终从整体看,你的程序架构就非常好了,就像组装汽车一样灵活了。

所以,要设计好程序架构,真的不是靠一个课程能搞定的,需要完整地做几个复杂的项目,并且有资深工程师的思路和代码,可以参考和借鉴,这样才能高效,系统地掌握。

每个功能模块都设计好以后,最后还需要有一个协调者。

类似于人的大脑,去协调手、脚、眼睛、耳朵、嘴巴。

这个大脑,一般就是程序的'地基',类似于RTOS,就是'协调者'身份,负责调度协调整个项目的各个功能模块。

RTOS本质也是一种程序架构,但是我很少用,因为它的处境,其实很尴尬。

没那么复杂的项目,上RTOS并没有优势,反而为后期调试带来不必要的麻烦,如果对系统不熟悉,就像埋了一个定时炸弹,可能会跑一段时间后死机的现象。

复杂的项目,有些直接上Linux了,现在很多***,成本也能做得很低。

所以,现在rtos的应用,我觉得主要集中在中等复杂的项目,要求实时性很高,同时工程师,又不具备设计程序架构的能力时。

不过,至今为止,我基本是用自己设计的架构去替代RTOS,目前大多数产品都够用。

a82623c4-7f7a-11ee-939d-92fbcf53809c.png

a83861e2-7f7a-11ee-939d-92fbcf53809c.png

这个架构,我也录了套系统的教程,粉丝可以找我拿去参考学习。

a843832e-7f7a-11ee-939d-92fbcf53809c.jpg


关键字:单片机  STM32 引用地址:关于单片机STM32裸机程序架构设计

上一篇:在RT-Thread studio中为STM32系列开启DSP支持
下一篇:STM32VCT6FSMC驱动3.5寸IPS全视角液晶屏

推荐阅读最新更新时间:2024-11-04 14:11

stm32专题三十六:MDK编译过程和文件类型(三)
生成 bin 和 hex文件 若编译过程无误,即可把工程生成前面对应的*.axf 文件,而在 MDK 中使用下载器(DAP/JLINK/ULINK 等)下载程序或仿真的时候, MDK 调用的就是*.axf 文件,它解释该文件,然后控制下载器把*.axf 中的代码内容下载到 STM32 芯片对应的存储空间,然后复位后芯片就开始执行代码了。 然而,脱离了 MDK 或 IAR 等工具,下载器就无法直接使用*.axf 文件下载代码了,它们一般仅支持 hex 和 bin 格式的代码数据文件。默认情况下 MDK 都不会生成 hex 及 bin 文件,需要配置工程选项或使用 fromelf 命令。 fromelf的命令描述:
[单片机]
<font color='red'>stm32</font>专题三十六:MDK编译过程和文件类型(三)
瑞萨全新入门级RA2E1 MCU问市
全球半导体解决方案供应商瑞萨电子集团宣布,推出48款全新RA2E1 MCU产品,以扩展其32位RA2 MCU产品群。入门级单芯片RA2E1 MCU基于48MHz Arm® Cortex®-M23内核,具有最高128KB的代码闪存和16KB的SRAM。 RA2E1 MCU产品群支持1.6V至5.5V的宽工作电压范围和多种封装,如LQFP、QFN、LGA、BGA及 晶圆级芯片封装 (WLCSP),提供卓越性能、超低功耗、创新外设和小型封装的优化组合。这些特点使RA2E1产品群成为在成本敏感及空间受限型应用中满足高性能、低功耗系统需求的理想选择。全新MCU提供具备软/硬件扩展的升级路径,是瑞萨RA产品家族强大阵容的理想入门级产品。
[嵌入式]
瑞萨全新入门级RA2E1 <font color='red'>MCU</font>问市
超低功耗MCU使系统级功耗节省10倍并支持物联网浮点运算
Analog Devices, Inc. (ADI),今天宣布推出一款超低功耗微控制器单元(MCU),用于满足迅速增长的嵌入式高级算法需求,并且当其用在物联网(IoT)边缘节点时,消耗的系统功耗极低。ADuCM4050 MCU包含一个ARM® Cortex®-M4内核,并带有浮点单元、扩展SRAM和嵌入式闪存,支持本地化决策,确保只有最重要的数据才被发送到云端。这款新MCU采用SensorStrobeTM技术,当ADI公司的传感器和RF器件还在收集数据时,它可以保持低功耗状态。这使得ADuCM4050 MCU能节省10倍以上的系统级功耗,因此电池使用时间或充电间隔时间会更长。为在恶劣环境中工作,它还加入了一些重要的增强功能。
[物联网]
超低功耗<font color='red'>MCU</font>使系统级功耗节省10倍并支持物联网浮点运算
爱特梅尔将AVR 8位微控制器与LIN系统基础芯片集成为一个小封装的单芯片
最高程度的集成 全球领先的半导体解决方案开发和制造商爱特梅尔公司 (Atmel Corporation) (美国纳斯达克交易代号:ATML) 宣布其ATA6602和ATA6603多芯片模组现已推出市场,进一步扩展了爱特梅尔针对 LIN 应用而设现有的IC 产品系列。这些全新器件特为汽车舒适性应用 (比如车窗升降器、反光镜和座椅调节器) 和动力系统常见的致动器装置而设计。加上体积小巧,ATA6602和ATA6603还适合于传感器节点的应用,如控制面板、空调、下雨/日晒传感器等等。 通过多芯片模组的方式,ATA6602和ATA6603将微控制器 (8位AVR)和LIN系统基础芯片 (LIN SBC) 集成为一个封装 (SiP片内系
[新品]
基于单片机的电梯自动控制系统的设计与实现
伴随着社会的发展与进步,人们的生活水平的提高和节约用地的倡导,越来越多的高楼耸立,使人们的生活和工作受到很大的影响,垂直运输的问题也随之出现,人们迫切需要一套安全、快捷、高效、稳定的电梯控制系统。电梯控制模型的设计主要涉及数电、模电、单片机及接口技术、C51的编程等知识,可谓知识面含量非常广,但因现代的微电子技术、计算机技术和嵌入式微控制器技术等的飞速发展,让我们做出应用型的电梯已成为可能。目前各小区居民楼都已经安装上了快捷、方便的电梯系统,但某些方面如安全性和稳定性还有待提高,用户也给出了更高的要求。 目前电梯控制主要有继电器控制、可编程控制器控制、微机控制(单片机控制)这3种控制方式。利用单片机控制电梯具有成本低、高精度的重量检
[单片机]
基于<font color='red'>单片机</font>的电梯自动控制系统的设计与实现
51单片机利用IAP技术对EEPROM的实现方法解析
STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。 ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。比如我们通过电脑给STC单片机下载程序,或给AT89S51单片机下载程序,这就是利用了ISP技术。 IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候
[单片机]
单片机学习之十四:定时器应用(模式1)
一、 实验现象: 开机后程序作如下的灯光变换:第一次led0、led2亮;第二次led1、led3亮;第三次led4、led6亮;第四次led5、led7亮;第五次led0、led2、led4、led6亮;第六次led1、led3、led5、led7亮;第七次8个二极管全亮;第八次8个二极管全灭。然后重头开始循环。每次状态转换间隔时间是50ms。 二、 实验目的 掌握内部定时/计数器的作定时功能(模式1)的应用 三、 实验任务分析: 看到这个实验题目,大家可能会说,这个试验难度不大,我们只要把这几种灯光对应的输出存到一个表里面,然后查表就可以啦,灯光转换之间调用50ms的延时程序即可。 这样的思路当然可以,但是,如果这样
[单片机]
<font color='red'>单片机</font>学习之十四:定时器应用(模式1)
快速掌握单片机学习的八部曲
学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制。   第一步:数字I/O的使用   使用按钮输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能。每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机编程的特点,千万不要怕麻烦,所有的单片机都是这样。   第二步:定时器的使用   学会定时器的使用,就可以用单片机实现时序
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved