看完这篇文章,还不知道怎么学单片机,来打我!
扫描二维码
随时随地手机看文章
经常有人问我,嵌入式该怎么入门,怎么学习,怎么精通,怎么成为专家。我前思后想掏心掏肺,花了大概2周的时间,写了这样的一个成长路径。注意!本文又干又长,如果此时你无法抽出大约10分钟时间,建议看个开头,然后点个关注、收藏之后再(也不)看。首先如图:嵌入式学习路径之单片机。为什么单说单片机呢,因为我觉得嵌入式是一个比较笼统的概念,可以按处理器性能大致分成两类。性能低的比如51、stm32、arduino,这类设备一般用作开发比较便宜的产品,比如手环、插座、牙刷、小型玩具什么的,这样的芯片资源有限,没办法运行linux操作系统;还有一类是高性能的,像我们手机那种处理器,能运行linux、安卓操作系统的,这类芯片一般用作开发比较贵的产品,像智能音箱、自动售货机、摄像头、路由器等等。这两种性能不同的处理器都是嵌入式,但需要掌握的技术是有一定区别的,这期就先讲低性能的,单片机的成长路径,如果看完觉得不错记得关注,后面会再写一篇嵌入式Linux的成长路径。依然是熟悉的4个阶段,这是科岩独创学习4阶段,小菜鸡、入门鸡、进阶机、老司机,也就是从入门到精通(入土)的几个阶段。看完欢迎留言告诉我你在什么阶段。
小菜鸡
先从小菜鸡开始,小菜鸡就是一个纯小白,就是你茫然无知什么都不懂。需要学习的有三个部分,基础概念、C语言基础、单片机基础。如图,基础概念内容如下:你要知道单片机是什么;要知道MCU、RAM、ROM、IO引脚、中断、定时器这些概念指什么;另外,常见单片机有8位、16位和32位的。
还要对电路板有概念,什么是原理图,什么是PCB,这些硬件概念在小菜鸡阶段知道就行。再然后是软件,其实也就是运行在单片机中的程序,我们也把它叫做固件。有了硬件和软件,就要把软件安装到硬件中执行,这个过程叫做编译、下载、运行,一般会用到Keil、IAR、gcc等等工具。我们人生中烧录到单片机的第一个程序一般是什么呢?就是点灯,点灯其实就是嵌入式工程师的hello world,一般电路板上都有led灯,LED灯点亮了,就说明这块板子的硬件,包括电源、处理器、引脚等等是没有问题的,还说明软件的烧录、运行等一系列的步骤是没有问题的。板子是好的,才有后面的工作。所以作为嵌入式工程师,一般也自称为点灯工程师。最后一点,就是知道什么是嵌入式工程师,一般行业内称呼一名嵌入式工程师都是某某工。比如你姓张,大家就会称你为张公,姓李呢,就会叫你李公,像我呢,我姓老,不知道此刻看文章的你姓什么嘞?工程师上班一般都在做什么呢?就是在画板子,写程序,调板子,烧板子。你烧过板子么,反正我是烧过,特别好玩,直接冒烟,把我们上班的大楼都给整停电了,是不是很有趣。嵌入式工程师的标准穿搭:黑框眼镜,格子衫,黑色或者灰色的双肩包。非常典型,工作经验一般可以通过发际线的高低做判断。对单片机程序有概念之后,就要学习C语言了。这里写了三点,参考c语言路径图;达到小菜鸡水平就可以上手单片机;最好是能达到进阶机。
这是什么意思呢,之前我做过一个C语言的学习路径图,也是分成了4个阶段。小菜鸡是基础就是学C语言的语法;入门鸡算是培养兴趣可学可不学;进阶机比较高级,数据结构、算法、网络、linux都该学了,最好能到这个水平;老司机就不强求了,可以后面再学。具体如下:
这部分可以看看日本作家写的几本计算机知识相关的科普书,《计算机是怎样跑起来的》、《程序是怎样跑起来的》,这两本书对新手都非常友好。
看书有一个原则,就是千万不要把”读完“当做目的,计算机相关的图书很多都是大部头,等到你读完,黄花菜都凉了。所以最好是带着问题读,把它们当做一部字典,只读你关心的部分,找到答案就可以把书放下了,不要纠结读没读完。对计算机和编程有了基本的概念后,就要学习C语言的语法了。C语言的语法其实非常简单,里面所涉及的概念也不多,都是一门编程语言中最基础的东西。数据类型、常量、变量、表达式、函数、分支、循环、数组、结构体、指针、C库,一共就这11个概念,对新手来说,前面的简单点,后面的可能稍微难理解点,平均每个概念学习3到4小时左右就可以了。
这些基本概念该怎么学习呢?下面说第二个学习原则:一定要有合适的练习题。什么是合适的练习题,合适的练习题有3个特点。一是有明确的训练目的。比如说学习函数,那合适的练习题就会把练习重点放在函数的各个特征上,而不应该有其他的一些知识盲点。二是不应该需要花费太长时间。这个花费的时间应该刚刚好能够使你保持专注,一旦失去专注力,浪费时间不说,还可能完不成练习。三是合适的练习题的难度应该是能够稍稍高出你自身的水平。使你每次练习都有一点新的收获,如果每次练习都在画菱形、画正方形,画了也白画。有了合适的练习题的训练,你就会比较快的掌握基础知识了。我建议这个阶段快速突击,小菜鸡的阶段不宜久留,宜速战速决,1周时间搞定,最多2周。否则啊,学习很容易变得枯燥乏味,就会产生这玩意到底有没有用啊,这种负面情绪。还是拿登山做举例,小菜鸡阶段就是在山脚下听老师讲理论课,老师讲了半天,登山鞋有哪些品牌,如何选择,登山杖该怎么使用,登山时姿势是什么样,全身肌肉如何发力,遇到雨雪天气怎么保暖,遇到山体滑坡怎么自救等等,一直讲这些理论。你说我报名了登山运动练习班,光理论讲了半年,学员当然要问,会选登山鞋到底和会不会登山有什么关系?学登山么,懂了最基础的理论知识,就赶紧是骡子是马拉出去溜溜了!先登个几百、一千米看看,把登山实践过程中遇到的问题点记录下来,再翻书本找教练学习理论。学习编程语言也是一样,懂了最基础的之后,就可以做些与实际生活相关的小项目,遇到不会的再回头学就可以。这里我插入第三个学习原则,叫做「最少必要知识」。就是说刚接触一个领域,一门知识,先把最关键的那些知识学会,你就可以做些简单的东西出来了,这时就应该尽快开始实践,特别是那种需要动手的学科,没有必要纠结要全学完再开始,而且有些高级的东西必须需要时间的积累才能理解,就算你学会了考试考过了,没有时间打磨,那也是纸上谈兵啊。所以我再强调一遍,小菜鸡阶段不宜久留,应当速战速决,1周时间搞定,最多2周。得马上做点有成就感,有满足感的东西出来。所以,赶紧进入第二个阶段,入门鸡。这第二个阶段的目的是在对编程有了一点初步认识之后,尝试自我开发自己对编程的兴趣。我建议用windows系统的接口做一些比较有趣、好玩的程序,比如我简单列了几个适合练手的小程序。我为什么推荐windows呢?一是因为windows的图像界面编程是非常方便的,拖拖拽拽就能画个界面出来,所见即所得很容易形成成就感;二是因为windows特别适合小白,它把程序背后编译、链接等等在新手阶段不需要了解的知识全部隐藏掉了,只要关注你的代码就好。可以从最简单的开始,比如说先弹出一个这样的对话框,其实也没有写几行代码。但是这个东西就很有趣,就要比那种黑乎乎的命令行看着顺眼的多对吧,你可以把这个程序发给你的同学,如果你同学只会写杨辉三角,那你这简直就是高了一个段位。这是什么?这不就是成就感吗?我上学那会就对图形界面很感兴趣,我到现在依然记得第一次用windows编写了一个最简单的对话框的那种喜悦,我感觉我就是计算机的上帝,我让他干嘛他就干嘛,这才叫编程嘛。我用C语言写过一个音乐播放器,还用java写过一个扑克牌游戏,当时真的是,课程设计都直接高分。图形界面编程很容易激发一个人的兴趣,俗话说,兴趣是最好的老师,一旦你学习编程的兴趣和热情被点燃,那这兴趣会驱动着你继续学习下去,你会不断完善你所编写的代码,直到它展现出你想要的样子。在这些编程练习中,你会反复用到第一个阶段学到的理论知识,遇到不会的,翻翻书,找找视频马上补上,这样的练习有了理论指导会事半功倍。这个阶段的时间长短呢,自己决定,如果越做越爽,也可以一直在这个阶段玩下去。这里我再插入第四个学习原则,就是要自己给自己订立目标。不能漫无目的的瞎学,要有个指引,订立的目标最好是可以衡量的,不然你都不知道自己学没学会。比如立下目标,要在3小时内学习5个C标准库的接口。能够知道在什么情况下用、并且会用5个接口就算达成了目标。再比如做个音乐播放器,要把一个音乐播放器做到什么样的效果,有哪些功能,先从整体上考虑好,然后为了实现这些目标不断完善,一旦达到了目标,就可以进入下一个目标了。那么下面是第三个阶段,进阶机。这个阶段要学一些编程语言之外的东西。数据结构、算法、网络的理论和实践都该安排上了。数据结构可以先学些最基础的,像栈啊、队列啊、链表,他们的概念是什么,有什么区别和联系,树形结构比较难理解,看不懂可以先略过。简单的算法也要懂一些,排序和查找是最常用的,必须要掌握。计算机网络是整个互联网行业网络通信的理论基础,也必须学,物理层、链路层可以不会,网络层、传输层和应用层必须掌握最关键的几个协议。最后,学习了这些理论知识还是要实践,没有实践的理论就像是盖在沙子上的碉堡,俗称沙雕。如果你不想做沙雕,那就把代码写起来!这个阶段该学习在linux上写代码了,毕竟在实际的工作中,基本没有人在windows上用C语言开发程序。我觉得非常合适的一个练习项目就是网络聊天软件,像QQ一样的,可以用linux写服务端,用windows写客户端,这个过程中的练习会加深对操作系统的系统调用、数据结构、网络这些知识的理解。而且网络聊天软件很有趣,做起来也没那么枯燥,做好了之后发给你女神一个专属客户端,你们在你自己写的软件里聊天,边聊天边吹牛,岂不美哉!这个阶段涉及不同课程的知识,应该花费比较长的时间。我建议代码要一行一行的写,就像饭要一口一口的吃,三连支持要边看边点。项目中每一行代码都要搞明白什么意思,这样你才能写出健壮的、没有bug的代码。我在写这个稿子的时候专门去找了一些开源的聊天软件,没有找到我想要的C语言的windows linux这样组合的,并且适合新手的项目。那么接下来呢,就来到了C语言学习的最后一个阶段:老司机阶段。这个阶段不再需要学习基础知识,而是要开始向高手、向大师学习了。使用广泛、经得起时间考验的开源代码是这个阶段最好的学习资料,我列出了几个网络行业相关的C语言的开源项目,这也是我在工作中经常接触到的项目。有JSON格式数据的解析库cjson、最小的http服务器tinyhttpd、高性能的http服务器nginx,还有物联网常用的传输协议mqtt,如果想学习tcp与udp的实现,有个协议栈找叫lwip,与linux内核的网络协议栈相比,代码量少了不是一星半点,非常适合学习。我不知道你是什么行业,你所在的行业又有哪些著名的开源C项目,欢迎留言分享给大家!我相信它们都可以拿来做自学的材料。刚开始学习开源代码肯定是一脸懵B的,你会惊呼,C语言还能这样写?你会怀疑,我眼前的代码还是那个熟悉的C语言么。相信我,每个人都是这样的,我总结了几个学习源码的方法也分享给大家,这个脑图后面也有:首先要保证代码是没有错误可以直接运行的,不然一运行就出错,就没有办法继续下去;接着我们要先从整体上理解整个项目的功能是什么,它的输入是什么,输出是什么,先在头脑里有个预期;在看代码的时候可以只关注数据结构中最关键的字段和最关键的语句,与主干逻辑无关的代码可以直接忽视掉。**进阶机阶段是学习的是怎么使用接口,老司机阶段就是学习怎么实现接口了。能看明白开源代码,能讲明白实现原理,你就踏入了专家之路。有了C语言基础,接下来就是一些单片机的基础了。首先要选一款学习资料丰富的mcu,建议直接选STM32,资料非常丰富,如果有任何问题查资料基本都能找到答案,对初学者来说非常友好
接着就要写代码了,我们的程序一般是通过轮询,或者定时器,或者中断这三种方式来进行触发,要学会编写这三种方式的代码。接下来是外设,单片机存在的意义是什么呢?其实就是通过外设,可能是键盘也可能是传感器,这种输入类型的外设,输入一定的数据,进行处理再通过输出类型的外设,可能是显示屏,输出一定的结果。在小菜鸡阶段要学习使用各种常见的外设,LED灯、蜂鸣器、键盘还有IO引脚,这都是最基础的。还要学习这3种很常见的串行口,uart、spi、i2c,要掌握通信协议的设计和编解码的处理,很多传感器就是通过固定的协议与单片机通信,另外单片机再和其他单片机、PC机等设备通信时都会用到协议编解码。接着要学习一些调试手段,比如说Keil和IAR软件的调试功能。都挺简单的,如果程序有问题,可以用调试手段来查查内存、某个变量的值,排查问题。小菜鸡最后,要做几个简单的实践。我列出来两个,一个是测距,可以用红外或者是超声传感器来做。另外一个实践是,可以读一些传感器的数据,比如温湿度、人体检测,把数据显示在屏幕上。小菜鸡阶段结束后,你就可以做些简单的小项目。菜鸡学习时间呢,大概两周左右就可以了。
入门鸡
接下来就来到了入门鸡阶段,有这么几个部分:单片机高级部分,学习电路板知识,再做几个复杂点的实践小项目。先看单片机的高级,包括这些内容:写代码要有一定的规范,包括缩进、注释、变量和函数的命名等等,要按规矩写。
入门鸡阶段,项目中要用一些基础的数据结构了,不要全局变量和flag满天飞;还要学些基础的算法,主要的就是排序和查找。接着要会用状态机编写稍复杂的程序,小菜鸡学会的轮询、定时器、中断只能做些简单的程序,复杂点程序就要有结构进行控制了,状态机是比较好的一种代码框架,要理解状态机的原理、编写的手法。再复杂点的程序,就得上操作系统了,学会使用嵌入式实时操作系统,也就是RTOS,要了解它们的任务、锁、信号量和消息队列是怎么使用的。如果做和物联网相关的项目,就要编写网络相关的程序,得会写socket程序,调用socket接口收发tcp/udp/mqtt的数据。单片机联网一般会用到无线模块,可以通过串口透传或者AT指令控制模块,比如Wifi、蓝牙、ZigBee等等传输数据。很多项目中的单片机是需要用电池的,电池容量有限,所以要学会编写低功耗的程序,比如控制单片机睡眠、停机、待机,还有低功耗如何测试、有哪些指标衡量功耗的高低,都要掌握。第二部分,要学习看电路板了。
得能看懂简单的原理图和PCB就行。
最后,入门鸡的实践:我建议做一个物联网设备,连接某个云平台。阿里云、腾讯云、百度云,都可以连,他们都有物联网的接入平台,接入后,设备要与平台 APP打通。比如做一个联网的温湿度采集器,可以在APP上看到设备从传感器读取数据,也可以做一个联网的智能插座或者智能灯,通过APP来控制它的开关。入门鸡要花一定的时间,可能是你工作个一年后到三年之间的这样的一个状态,会灵活的使用以上的这些软件接口与硬件器件,时间久了就可以编写复杂的程序,做复杂的项目了。
进阶机
接下来是进阶机阶段,这个阶段要学习的东西不但变多了,还更深入了。我把进阶机的学习范围分成2大部分,一部分叫“通用内功”,就是几乎哪个行业都通用的东西,学会内功,才能以不变应万变;另一部分叫“独门绝技”,指的是某一个细分领域的专业技术知识,学会了至少不用担心失业。咱们先看通用内功,首先是最上层,嵌入式实时操作系统源码的学习,我建议学习FreeRTOS、RT-Thread、μC/OS这三个比较常用的嵌入式系统。
入门鸡阶段是会用RTOS,进阶机就要学习任务、锁、信号量怎么实现了。接下来是网络源代码的学习,同样的,在入门鸡阶段是会用网络接口,进阶机就要学习如何实现了。我们可以通过lwip这样的轻型协议栈源码来学习TCP或者UDP,mqtt是物联网传输的协议,HTTP是WEB的常用协议,图中这几个源码都是可以直接学习的。然后是模块的二次开发,模块二次开发指的是基于无线模块直接做编码,而不是通过MCU进行控制。这样可以减少一颗MCU主控芯片的使用,节约硬件成本,毕竟咱们硬件行业成本第一啊!接着可以学习对代码性能进行优化,我列出了4种方式,这些都可以了解,有的项目有特殊的需求,咱们就要知道怎么优化。下面是代码的可移植性,其实也是按照一定的规范编写代码,我也是列出了4点。如果写代码时习惯考虑代码的可移植性,那你写的代码也能很容易的移植到不同平台。有时我们做一款产品,产品升级了或者更换了硬件芯片,之前代码移植性好的话,可以很快替换成新平台。然后是编译和链接的脚本,要学习C语言代码是如何编译成机器指令,机器指令又是如何在芯片中进行组织的。代码编译完会进行链接,要指定加载地址、指定代码段、数据段地址,这个也是有些特殊的产品需要人工设置。除了C语言,还要掌握几种其他编程语言,Python、lua、shell都建议学学。学会了C语言,这些语言其实都不怎么用学,看看语法就能上手写,我们经常用这类语言处理有规律的文本、处理二进制固件,方便快捷。后面三个是学习底层知识,首先要学会看芯片手册,通过芯片手册能学到太多东西了。在工作的过程中会遇到各种各样的芯片,可能会有一些比较少见的特殊芯片,没有封装成C语言的库,或者某些不常用的功能芯片提供的库没有封装,这时你就要通过操作寄存器直接控制它们。芯片手册第一次看肯定看不懂,这个也需要花时间,时间久了,看得多了自然就懂了。而且每个芯片的芯片手册套路、结构都差不多,看懂一个,基本其他也都懂了,所以大家不用担心。再往下一层就是汇编指令集,单片机arm的体系结构居多,应当学一下arm的指令集,比如说Cortex M系列的核,它有37个寄存器,要了解它的一些常见汇编指令。能看懂,能够编写简单的程序就可以了。最后再下一层就是电子学了,要学模电和数电的知识,电压电流,电阻电容,半导体二极管等等,都要知道它们是干嘛的,接着门电路、CPU、存储器的电路是怎么设计的,知道理论就可以了。上面这些知识都是内功心法,无论做哪个行业,只要和硬件打交道,都能用得上,是咱吃饭的家把什。下面再看看独门绝技都有啥,独门绝技就是能让咱们吃的爽,吃的久。首先是通信协议栈的开发,比如PHY层、MAC层、空口各层协议的开发,像Wifi、4G、5G都有类似的开发需求、岗位,现在5G这么火,如果你能参与开发一个5G模组,那就非常厉害了!
下面是算法,算法这个分支也是一个比较专业性的分支,我列出了一些咱们单片机上可以跑的算法,滤波、姿态,惯导,PID,还有slam算法,有些是做可穿戴设备需要的,有些是无人机、无人车需要。做算法是有很高门槛的,基本都研究生起步,如果你没有读研究生,或者读了但对数学没兴趣,建议还是不要去搞算法了。我学历就是个普通小本科,算法这方面简直是个白痴,不懂。算法是真的牛,算法yyds!接下来是安全,这个我不知道有没有人了解,也是个细分领域。包括芯片安全,网络安全。比如为数据加个密再存储、比如给固件签个数字签名再烧录到芯片,这都是安全工程师需要设计和考虑的。未来万物互连,越来越多的家电产品,甚至汽车也都能用手机控制。所以,嵌入式、物联网的安全不能忽略。再后面是FPGA设计,学习编写Verilog HDL语言,学会用硬件描述语言设计组合逻辑电路和时序逻辑电路,这也是一个比较细的一个分支,专业性非常强。学习了FPGA之后呢,还可以再学习下设计CPU,包括流水线,取指、译码、执行,总线,中断异常等等这些硬件的设计,这已经非常非常底层了。为什么嵌入式工程师要学习FPGA或者设计CPU呢?我觉得这是底层原理,会底层的原理,解决上层的问题会思路更开阔,好比你明白TCP的原理,那如果HTTP出了问题,你会更容易解决。好,以上就是进阶机阶段需要学习的东西了,此刻的你觉得兴奋还是觉得可怕?如果掌握了这些呢,工作中遇到的任何技术问题,基本上没有你解决不了的了。进阶机阶段,一般是工作至少5年吧,5年8年10年都有可能。想要理解和掌握,既需要不断的学习理论知识,也需要积累实践经验。进阶机到此结束,马上就要迎来最后一个阶段,老司机阶段。让我们来一起揭开老司机的神秘面纱吧。
老司机
老司机阶段,分了4个部分,技术、管理、行业、公司。到了老司机阶段,你不单单是一个懂技术的人了,还要懂管理、懂行业。仍然可以继续学习技术,可以学一些横向的技术扩展,比如上位机、APP的编写;测试工具、测试流程的学习;有兴趣可以学学Matlab仿真。
如果喜欢画板子,可以多画画PCB;愿意做设计,也可以学学工业设计、结构设计这些知识。那么管理呢,包括了这些内容:可以边带团队边学习管理知识,要依靠团队的力量实现你想实现的产品或者功能。
你还要有一定的行业认知,就是你要懂行业,我大概总结了几个单片机涉及到的行业:不要把目光集中在手上开发板的一亩三分地儿,要关注行业的市场空间,是否处在上升期。
要努力成为某个行业的专家,行业的专家,行业的专家!什么是行业的专家?举个例子,如果你在医疗行业,那你就要懂些医疗方面的知识。比如做个血糖仪,要学习血糖对人体有什么作用、正常血糖值是什么范围,还要懂一个血糖仪是怎么设计、生产的,都有哪些人参与,客户是哪些人,他们在哪,通过什么样的方式或者渠道能把产品卖给他们,有没有什么行业潜规则。大家现在听我这么说可能觉得很难,但其实没多难,你如果喜欢一个行业,那就去那个行业干几年,稍微用点心,都不用太久,慢慢就不知不觉都学会了。老司机的最后一点就是公司了,我列了整个电子行业上下游的产业链出来:从最上层的芯片原厂再到中间的模组厂传感器厂、操作系统、云平台、运营商,最后是B端或C端的硬件厂商,或者是集成商或者渠道商。
无论哪种类型的公司,都会有嵌入式工程师的需求。作为一个老司机的你,应该了解你们行业中头部、腰部、尾部的公司,了解他们的商业模式,他们的生存状态,了解同行在做什么产品,都有哪些业务,为什么开展这些业务,这是一个老司机应该懂的。这些行业认知和公司认知,都是需要在多年的从业中,摸爬滚打获得的,这些经验在哪本书或哪篇文章中都是学不到的。