本系列文章同步开源于如下地址:
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应用。当然我也花了半天时间进行了配置调优,这就依赖以前的调试积累。
图形开发可以说简化了大量操作,但并不是没有代价的。对于从最初从寄存器、标准库过来,移植过项目和库的开发者,至少对我来说,能够轻松理解生成代码的执行流程;如果遇到工作不符合预期,可以很快知道如何检查,从何处去修改。而如果只学会了那套图形操作方法,生成后直接工作正常,那是皆大欢喜;不正常的话,去梳理生成代码的逻辑,理解各个配置项的意义,难度上反而更高。并不是说操作简单,复杂度就不存在,只是复杂度被芯片厂商的工程师隐藏实现了而已。如果你的应用刚好被软件覆盖,没有问题;而没有覆盖的应用,或者支持不完善的应用,反而要去理解芯片厂商的软件工程师开发思路,再此基础上才能进行修改,复杂度其实是增加的。另外各厂商的图形工具虽然逻辑都是选项配置,导入外部模块,但配置项并不相同。底层的逻辑都是通过寄存器控制硬件功能,是有其一致性的,只有掌握了其背后的芯片运行和功能执行的逻辑,芯片应用为主,图形化开发为辅,才能以不变应万变,应对不同开发环境和功能需求的开发.
图形化开发主要包含创建项目、勾选功能、配置参数、最后生成功能,逻辑上比较清晰简单。选择平台后,下载对应图形化工具就可以。单片机技术就比较复杂,主要包含以下方面。
上述这些技术都统称芯片应用技术,或者说单片机技术。但这些只是产品开发中驱动相关的功能,或者说是很小的功能。如果到了具体产品还需要组合这些功能,再搭配应用逻辑才能实现具体功能。单片机技术最终要服务于具体的产品,那么电子产品就是最终落脚到实处的地方。
电子产品一般是由硬件板,电源(电池或者外部供电)在加上结构框架(外壳)构成的具有特定功能的器件。日常所见的手环,智能手表,雾化器,智能门锁,空气加湿器,智能音箱,电吹风机都属于电子产品的范畴,不过这类产品并不一定是单片机开发的,也有可能是基于嵌入式SOC开发,往往是性能,成本的权衡。这里以比较简单的手环为例去理解如何开发具体产品。
第一步:梳理产品需求,定义产品功能,输出相关文档。
第二步:将功能转换成单片机环境下功能,输出相关文档。
第三步: 根据功能,电子部分进行硬件器件选型,原理图设计,软件部分完成框架设计,进行原型验证。
第四步: 硬件更新迭代,软件产品开发。
第五步: 产品测试,量产
上述只能说简化的电子产品的开发流程,真实过程可能还有多次迭代和测试的情况,还有试投产和小批量的过程。事实上在第二步已经大概了解了电子产品中软件部分的主要开发工作。可以看到,驱动只涉及I2C,SPI和串口,大部分都是具体功能逻辑的实现,这不仅需要在产品开发中不断积累,还需要下意识的有技术管理的思想去理解项目,如果只看到单个驱动,或者单独的功能,很容易一叶障目,不见泰山。
单片机开发技术是一切的根基,图形化界面是简化的工具,而电子产品开发则是最终的果实。从哪个方向去学习,在延申到其它方面,要根据个人的情况选择,并没有唯一答案。充足时间的大学生或者已经入职但发现基础欠缺的工程师,任务也不紧张,从单片机开发技术去理解巩固可以更好发展;如果只是硬件工程师,只是需要掌握快速进行硬件功能验证的方法,图形化界面开发就能够满足要求;而对于已经有丰富软硬件调试开发经验的工程师,如果遇到了职业瓶颈,那么理解电子产品开发的思路,能够更好的从开发者到技术leader的转变,不过本系列文章就帮助不多,可以用来开阔思路。
本系列主要讲述单片机开发技术,分模块讲解芯片外设功能配置,原理,虽然讲解上遵从简单到困难的顺序,不过学习时并不需要按部就班。选择自己需要的章节直接去学习,培养兴趣反而更重要。单片机去控制硬件看起来很有趣,但并不能掩盖开发其实是枯燥的,有时候带着目的性反而更容易掌握,作为产品手环复杂,但实现个单独的功能,如心率监测,UI图片显示或UI图片切换,这些功能进一步分解,就没有那么困难。带着目的去开发代码,才可以知道需要掌握的是什么,才能更快的进步。
本系列主要基于正点原子的STM32F429IGT6平台,以模块和综合项目的形式展示单片机相关的技术,目录说明如下。
本节从开始梳理了嵌入式开发需要的技术,又拆解了手环产品的实现流程,描述了作为产品需求的单片机开发技术,这个可以讲明了单片机开发需要的技术总纲。本系列按照顺序,讲解了单片机支持的大部分模块,并在此基础上扩展了外部库的支持;但我不建议只是简单的按顺序复现功能,或者直接用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等。如果是按照顺序一个个去学习,一是花费时间特别长,二是学久了枯燥乏味,很多细节的知识即使说明很重要,单纯靠背诵记住也不可能,其实参考上面的手环开发流程说明,通过一个个小的应用去学习就是比较好的方法,这个要根据自己感兴趣的方向去实践;这里可以阐述些例子。
上面列出了一系列包含多个功能模块的应用,在实践这些应用时,就可以根据需求去学习了解相应的模块。对于有些复杂的功能模块,可以分解成多步骤去实现;例如网络综合应用,可以按照步骤先尝试完成网络功能的移植,成功后在基础上实现HTTP服务器和web界面,之后在将学习调试过的硬件一个个添加到项目中,完善前后端逻辑实现,最终构建一个完整的项目。不要试图一下就全部完成,而是在实践中,发现自己的不足,然后去补足其中的知识。不过我这里提到的需求对比实际产品也只是冰山一角,如果自己想扩展思路,可以多去购物网站查一下那些电器设备,根据功能去反推需要实现的功能逻辑和需求,然后去模仿其中的一部分模块功能来实践。不要是千篇一律的智能小车,带着思考去学习实践,这样才可以事半功倍。