logo
0
0
Login

单片机技术和电子产品开发

本系列章节目录

单片机模块功能目录

单片机应用目录

开源说明

本系列文章同步开源于如下地址:

https://github.com/zc110747/embedded_based_on_stm32

单片机技术总结

单片机技术是基于芯片和外部器件的使用方法,通过软硬件开发,最终实现电子产品的综合性技术。首先要确认一点,单片机的学习和使用阶梯并不陡峭,各芯片厂商也在大力度的提供图形化开发工具,如ST的STM32CubeMX、英飞凌的DAVE、 Microchip的Microchip Studio、都支持图形化生成工程的方案,降低了使用门槛。目前看懂原理图,掌握了图形工具的使用方法,理论上对于单片机并不熟悉也可以上手应用开发。

对于单片机来说,简单外设驱动其实开发起来并没有难度。这部分的图形化工具替代工作并不明显,反而提供最大的帮助是复杂功能的实现,如Fatfs、USB、 LWIP、GUI库、电机运动库的支持。八年前我刚入行嵌入式的时候,花了1个月从无到有移植调试了uCos-II、LWIP,后面还在因为偶发卡顿去理解每个配置项并调试。而基于STM32CubeMX图形界面操作,我花了就2个小时,就调试支持FreeRTOS、LWIP应用,能够跑通Ping和简单的socket应用。当然我也花了半天时间进行了配置调优,这就依赖以前的调试积累。

图形开发可以说简化了大量操作,但并不是没有代价的。对于从最初从寄存器、标准库过来,移植过项目和库的开发者,至少对我来说,能够轻松理解生成代码的执行流程;如果遇到工作不符合预期,可以很快知道如何检查,从何处去修改。而如果只学会了那套图形操作方法,生成后直接工作正常,那是皆大欢喜;不正常的话,去梳理生成代码的逻辑,理解各个配置项的意义,难度上反而更高。并不是说操作简单,复杂度就不存在,只是复杂度被芯片厂商的工程师隐藏实现了而已。如果你的应用刚好被软件覆盖,没有问题;而没有覆盖的应用,或者支持不完善的应用,反而要去理解芯片厂商的软件工程师开发思路,再此基础上才能进行修改,复杂度其实是增加的。另外各厂商的图形工具虽然逻辑都是选项配置,导入外部模块,但配置项并不相同。底层的逻辑都是通过寄存器控制硬件功能,是有其一致性的,只有掌握了其背后的芯片运行和功能执行的逻辑,芯片应用为主,图形化开发为辅,才能以不变应万变,应对不同开发环境和功能需求的开发.

图形化开发主要包含创建项目、勾选功能、配置参数、最后生成功能,逻辑上比较清晰简单。选择平台后,下载对应图形化工具就可以。单片机技术就比较复杂,主要包含以下方面。

  • 项目构建,能够构建单片机项目(基于MDK或IAR)
    • 启动文件,库添加,驱动实现,应用文件
    • 配置下载项,完成调试和下载实现
    • 调试打印接口
  • 外设模块功能和配置理解
    • 外设模块的功能(RCC,GPIO,EXTI,USART...)
    • 外设模块的寄存器功能说明
    • 外设间的关联
  • 外部器件的操作说明
    • 接口类通讯I2C,SPI器件功能
    • SD卡相关器件操作功能
    • PHY配置相关功能
    • CMOS和LCD相关操作
  • RTOS的移植和应用技术
    • RTOS的移植实现
    • RTOS的应用,semperature,queue,messagebuffer,软件定时器等
  • 复杂库的移植和应用
    • Fatfs文件系统
    • USB Library支持
    • LWIP库支持
    • TouchGFX、LVGL等图形库支持
    • 电机运动控制算法支持

上述这些技术都统称芯片应用技术,或者说单片机技术。但这些只是产品开发中驱动相关的功能,或者说是很小的功能。如果到了具体产品还需要组合这些功能,再搭配应用逻辑才能实现具体功能。单片机技术最终要服务于具体的产品,那么电子产品就是最终落脚到实处的地方。

电子产品示例

电子产品一般是由硬件板,电源(电池或者外部供电)在加上结构框架(外壳)构成的具有特定功能的器件。日常所见的手环,智能手表,雾化器,智能门锁,空气加湿器,智能音箱,电吹风机都属于电子产品的范畴,不过这类产品并不一定是单片机开发的,也有可能是基于嵌入式SOC开发,往往是性能,成本的权衡。这里以比较简单的手环为例去理解如何开发具体产品。

第一步:梳理产品需求,定义产品功能,输出相关文档。

  • 界面显示,支持滑动触摸
  • 各类检测(心率,血氧)
  • 睡眠,计步和轨迹记录
  • 蓝牙连接手机,信息和数据同步
  • 蓝牙升级
  • 支持充电,长时间待机
  • 其它附加功能,如表盘切换,闹钟,语音通话,调试接口等

第二步:将功能转换成单片机环境下功能,输出相关文档。

  • 带触摸的GUI屏幕驱动移植支持,界面开发,满足低功耗和少的接口(可选SPI的OLED屏幕)
    • SPI驱动和器件支持
    • GUI驱动库移植调试
  • 心率/血氧传感器支持,数据处理
    • I2C驱动和器件支持
    • 心率和血氧传感器数据处理
  • 重力传感器/三轴加速度计功能支持,处理转换算法
    • I2C驱动和器件支持
    • 睡眠判断算法实现
    • 计步算法实现
  • 蓝牙模块或者直接使用蓝牙芯片,支持低功耗蓝牙,实现上层交互协议
    • 蓝牙模块一般为串口通讯
    • 使用蓝牙芯片则要进行蓝牙协议开发,并在基础上构建应用协议
    • 手机APP数据和配置同步功能实现
  • bootloader开发在线升级
    • bootloader实现, 升级调试
  • 硬件支持充电,低功耗开发
    • 低功耗相关的硬件设计
    • 低功耗相关的软件开发
  • UI功能开发,软件逻辑开发
    • 自绘图形或移植GUI图形库
    • 实现功能界面,并关联到具体硬件操作和硬件状态

第三步: 根据功能,电子部分进行硬件器件选型,原理图设计,软件部分完成框架设计,进行原型验证。

  • 硬件器件选型(电子),主要选择产品的软件工作平台(单片机,满足合适的容量,频率,接口,功耗),以及所有外部器件(传感器,屏幕,数模器件)。
  • 原理图设计,PCB打样投产,进行产品打样
  • 软件部分根据工作平台定义完成软件框架,创建项目,并基于相应开发板进行驱动相关的原型验证。

第四步: 硬件更新迭代,软件产品开发。

  • 硬件基于软件开发中遇到到问题,进行版本更新迭代
  • 软件进行具体的功能开发,包含整合驱动,处理数据,实现协议和应用交互,低功耗功能,图形界面开发,实现最终产品。

第五步: 产品测试,量产

上述只能说简化的电子产品的开发流程,真实过程可能还有多次迭代和测试的情况,还有试投产和小批量的过程。事实上在第二步已经大概了解了电子产品中软件部分的主要开发工作。可以看到,驱动只涉及I2C,SPI和串口,大部分都是具体功能逻辑的实现,这不仅需要在产品开发中不断积累,还需要下意识的有技术管理的思想去理解项目,如果只看到单个驱动,或者单独的功能,很容易一叶障目,不见泰山。

单片机开发技术是一切的根基,图形化界面是简化的工具,而电子产品开发则是最终的果实。从哪个方向去学习,在延申到其它方面,要根据个人的情况选择,并没有唯一答案。充足时间的大学生或者已经入职但发现基础欠缺的工程师,任务也不紧张,从单片机开发技术去理解巩固可以更好发展;如果只是硬件工程师,只是需要掌握快速进行硬件功能验证的方法,图形化界面开发就能够满足要求;而对于已经有丰富软硬件调试开发经验的工程师,如果遇到了职业瓶颈,那么理解电子产品开发的思路,能够更好的从开发者到技术leader的转变,不过本系列文章就帮助不多,可以用来开阔思路。

本系列主要讲述单片机开发技术,分模块讲解芯片外设功能配置,原理,虽然讲解上遵从简单到困难的顺序,不过学习时并不需要按部就班。选择自己需要的章节直接去学习,培养兴趣反而更重要。单片机去控制硬件看起来很有趣,但并不能掩盖开发其实是枯燥的,有时候带着目的性反而更容易掌握,作为产品手环复杂,但实现个单独的功能,如心率监测,UI图片显示或UI图片切换,这些功能进一步分解,就没有那么困难。带着目的去开发代码,才可以知道需要掌握的是什么,才能更快的进步。

项目结构说明

本系列主要基于正点原子的STM32F429IGT6平台,以模块和综合项目的形式展示单片机相关的技术,目录说明如下。

  • src/ 分章节说明STM32F4的模块功能。
  • code/ 按章节提供可验证的代码,项目见code/xx-STM32F429_xx

学习方法总结

本节从开始梳理了嵌入式开发需要的技术,又拆解了手环产品的实现流程,描述了作为产品需求的单片机开发技术,这个可以讲明了单片机开发需要的技术总纲。本系列按照顺序,讲解了单片机支持的大部分模块,并在此基础上扩展了外部库的支持;但我不建议只是简单的按顺序复现功能,或者直接用STM32CubeMX生成代码,运行下就结束了,大部分情况下意义并不大,既不会对面试有帮助、或者对未来的开发有帮助,这也是很多人按照开发板的例程都练习了很久,仍然学习进度缓慢的原因。这里我按照自己工作学习的经历,分享下经验感悟。

  • 入门阶段

入门阶段主要包含熟悉常用编译工具Keil和下载工具Jlink、ST-Link,学会通过HAL库,创建工程、添加启动文件、完成基本的功能验证。这个阶段是为后续所有工作打基础,同时掌握基础的模块功能,包含RCC、GPIO、NVIC、串口的应用。能够不依赖图形工具,完成这些基本功能的调试和验证(可以参考本系列的相关章节说明),涉及到不理解的配置项去看芯片手册分析解决。之后在基于STM32CubeMX生成项目,实现上述功能。这一步是打基础的关键步骤,如果上来基于图形界面,那么一切就是空中楼阁,后续复杂模块反而更难理解学习。

  • 提高阶段

提高阶段主要就是进一步熟悉单片机的其它模块,这时候可以直接使用STM32CubeMX生成,也可以自己仍然手动添加(本系列的代码除了特别复杂的模块,如USB、ETH,其它都是自己手动添加的)。按照模块就比较多了,I2C、SPI、RTC、DAC、ADC、DMA、Timer、SDIO、CAN、ETH、DCMI、LTDC等。如果是按照顺序一个个去学习,一是花费时间特别长,二是学久了枯燥乏味,很多细节的知识即使说明很重要,单纯靠背诵记住也不可能,其实参考上面的手环开发流程说明,通过一个个小的应用去学习就是比较好的方法,这个要根据自己感兴趣的方向去实践;这里可以阐述些例子。

  • 带闹钟功能钟表,支持时间设置、闹钟设置、时间显示、蜂鸣器报警功能。
    • 设置通过按键(GPIO),时间显示最初可通过串口打印,后续可以通过LCD显示。时间通过RTC存储。
  • 光照、温湿度显示功能。
    • 通过i2c器件检测光照和温湿度,初始通过串口打印,后续可以通过LCD显示。
  • 检测环境光控制LED自动开关。
    • 环境光通过i2c器件检测,GPIO控制LED。
  • 串口转发和协议解析功能。
    • 串口通讯、添加协议解析处理(Modbus或者自定义协议)。
    • 将协议解析后的数据转发到相应接口(如I2C、SPI、CAN、网络等)。
  • 串口桌面软件控制硬件设备和获取设备信息(如LED、蜂鸣器、DAC电平、ADC采样、环境光、温湿度-I2C接口)。
    • 串口通讯、添加协议解析处理(Modbus或者自定义协议)。
    • 获取设备信息(如环境光、温湿度),并通过串口返回。
    • 进行硬件操作,控制相应硬件。
  • 网络功能控制硬件设备和获取设备信息(如LED、蜂鸣器、DAC电平、ADC采样、环境光、温湿度-网络接口)。
    • RTOS移植、LWIP以太网协议栈。
    • 网络应用功能实现(如Web服务器、MQTT客户端等)。
    • 获取设备信息(如环境光、温湿度),并通过网络服务返回。
    • 进行硬件操作,控制相应硬件。
  • 本地UI界面控制硬件设备和获取设备信息(如LED、蜂鸣器、DAC电平、ADC采样、环境光、温湿度-GPIO接口)。
    • UI界面设计,基于图形化界面库(如LVGL),实现按键、滑动条、LED显示等功能。
    • 触摸屏事件处理,实现触摸屏动作,进行相应处理。
    • 进行硬件操作,控制相应硬件。
  • 数据、日志和升级服务。
    • 数据存储服务,用于存储配置信息和部分数据(SPI FLASH)。
    • 日志服务,用于记录系统关键运行状态,可选择串口打印或者按时间写入SD文件
    • 升级服务,实现IAP或者OTA升级,支持通过网络、串口或者SD卡升级。
  • 图像采集、显示和存储的照相机功能
    • DCMI采集图像,LTDC显示图像。
    • 通过图像库压缩图像,按照时间戳命名(RTC),存储到SD卡指定目录(SDIO,FATFS)。
  • 多单片机系统构建
    • 多个单片机通过CAN、ETH等通信协议连接,实现数据交换和协调。

上面列出了一系列包含多个功能模块的应用,在实践这些应用时,就可以根据需求去学习了解相应的模块。对于有些复杂的功能模块,可以分解成多步骤去实现;例如网络综合应用,可以按照步骤先尝试完成网络功能的移植,成功后在基础上实现HTTP服务器和web界面,之后在将学习调试过的硬件一个个添加到项目中,完善前后端逻辑实现,最终构建一个完整的项目。不要试图一下就全部完成,而是在实践中,发现自己的不足,然后去补足其中的知识。不过我这里提到的需求对比实际产品也只是冰山一角,如果自己想扩展思路,可以多去购物网站查一下那些电器设备,根据功能去反推需要实现的功能逻辑和需求,然后去模仿其中的一部分模块功能来实践。不要是千篇一律的智能小车,带着思考去学习实践,这样才可以事半功倍。

About

No description, topics, or website provided.
23.04 MiB
0 forks0 stars1 branches0 TagREADMEAGPL-3.0 license
Language
C95.7%
Assembly4%
C++0.1%
Makefile0.1%
Others0.1%