我刚开始接触嵌入式的时候,感觉学这个好变态啊。
要学的东西太多了,数字电路、模拟电路、C语言、汇编、51单片机、Protel 99SE、Pcb Layout、STM32单片机、RTOS、Linux、ARM等等....
可以说,随便拿个魔法电路出来,想达到精的程度,都够摸索好几年。
所以,我的建议是:精于基础,广于工具。
做了单片机开发10年,虽然产品类型一直在变,但如果做多了,会发现,很多都是能够改改复用的,很多都是能够举一反三的。
特别是对于单片机来说,更是大同小异。
我用过STC、NXP、NUC、ST、TI等单片机,其实内部资源,最常用的无非就是GPIO、定时器、串口、ADC、IIC、SPI等等,也不多..
你会用ADC采集电池电量,你也能举一反三,用ADC去采集各种传感器信号了。
无非就是,采集以后,数据结构和算法的差异。
我见过大多数的新手,普遍分不清工具和基础,以及对它们重要性的权衡失误。
有些新手,51单片机都玩不转,常用通信协议都没用过,就疯狂进阶STM32、RTOS。
最后发出感叹,卧槽,这太难了。
其实就是花了太多时间,在工具层面的学习,而基础是千疮百孔的。
工具是什么?
我觉得是编程语言、单片机、RTOS、Keil、stm32cubeMX、AD...
要知道,我们最终的目的是什么?
往近了说,就是要有做项目的能力,这决定你找工作,能否有优势?能否开高工资。
往远点说,就是要解决用户的需求,这决定企业能不能挣到钱,能不能在市场立足。
好比写作文,哪怕你精通行书,楷书,草书,隶书....对于写好作文来说,帮助不大。
工具,其实会随着时间,不断变化的,比如今年STM32用得多,或许明年就被国产替代了。
基础是什么?
以我们无际单片机项目特训营的项目3为例,举个简单例子。
比如我要检测按键短按、短按释放、长按、连续长按、长按释放功能,要求做到移植方便,扩展按键方便。
这种功能,我的实现思路和步骤是什么?
第一步:先搞懂硬件原理。
硬件原理很简单,就是检测单片机IO电平,低电平代表按键按下。
第二步:思考单个按键实现按键短按、短按释放、长按、连续长按、长按释放的逻辑。
其实检测短按、短按释放、长按、连续长按、长按释放的核心,就是检测IO口低电平的持续时间。
我程序对短按的定义,就是2秒以下,都是短按,2秒以上是长按,然后2秒以后,每个150ms,代表连续长按。
所以,写代码,首先要抓到功能硬件原理的规律线索,再思考程序怎么实现。
刚开始,先实现功能,出第一个功能版本,再继续优化成几个按键的,这样难度会小一点。
代码有点长,且是我们付费项目代码,就不截全了。
这个代码,有很多数组,是因为已经实现可多按键的功能。
第三步:考虑如何扩展多按键
为什么要考虑多按键的扩展?
因为傻杯项目经理,整体要改功能需求,做好预留,免得哪天晚上加班改到凌晨。
像这种,多个器件(按键/LED)有同样功能的,最好的解决方式,就是用数组,然后用for循环去遍历了。
所以,我采用数组的方式,单个按键电平检测是单独的函数,最后整合到函数指针数组里,这样方面for去遍历。
用这种程序架构,有什么好处?
1.增加,减少按键很方便,直接修改相关的数组,还有电平检测函数就可以了。
2.可移植性强,哪怕换一款产品,换了不同的单片机,只要定义hal1_getKey1Sta这些硬件驱动层接口就好了,不需要改按键检测核心函数hal_KeyProc。
总结下,基础是什么?
我觉得是功能实现背后的原理、协议、思路、接口、思维、框架。
有好的编程思维,代码水平,以这两者为基础,能衍生出更好的程序架构、数据结构、算法。
我们应该精于这些东西,虽然每个产品的功能不一样,但实现思路是一样的,是能举一反三的。
就像等你做了开发5年以后,突然有一天,对指针是灵魂的理解,恍然大悟,卧槽,原来c语言也能实现面向对象的代码风格。
而不是死记,c是面向过程的语言,java是面向对象的语言。
最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单
片机最佳学习路径+单片机入门到高级教程+工具包」,全部无偿分享给铁粉!!!
除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手!
教程资料包和详细的学习路径可以看我下面这篇文章的开头。
《单片机入门到高级开挂学习路径(附教程+工具)》
《单片机入门到高级开挂学习路径(附教程+工具)》
《单片机入门到高级开挂学习路径(附教程+工具)》