首先请允许我做一下自我介绍,本人没有那么励志,也不是什么“黑马”觉醒的典范,只是一个读完本硕211的、想靠技术生存下来的平凡的人类。从大一开始接触单片机这个词汇,那时候只是想参加学校的智能车比赛,并且想通过学些技术毕业挣钱,所以开启了漫长的自学(自嗨)之路。首先是自己看图书馆的书,对一些基础知识来了个囫囵吞枣,那时候连C语言都不了解的,但是凭借一点兴趣慢慢积累。后来,在学长的推荐下买了第一部51单片机开发板(跳蚤市场80二手的,现在想来感觉被忽悠了),开始跟着视频教程编写代码,烧录到单片机调试程序,测试结果,当最初点亮那个LED的时候,别提多开心了。其实最开始安装keil4的时候,由于自己安装不了解必须英文路径,所以装了之后编译程序就报错,还好有百度,找到问题卸载重装(没点耐心是真的不行呀)。当我觉得自学差不多,甚至有点洋洋得意时,智能车比赛开始了,而我因为不适应从51到NXP K60芯片的转换,比赛成绩惨烈,这一打击让我意识到自己的能力有限,,需要继续学习。再接下来就是STM32单片机的入门了,先后参加过机械设计大赛,工程机器人大赛,创新创业比赛等等,可惜自己一直沉迷在低水平的内卷中毫不自知,技术并没有很大提升,而当我意识到这一点时,我已经踏上了另一条路--人工智能算法。
彼时,我已经上了研究生,课题方向是CV,开始了各种炼丹修行。在日复一日的参数调试过程中,我渐渐地迷失了自我,觉得自己会调参数很牛掰,各种智能模型算法聊起来夸夸而谈。直到我在小破站发现了稚晖君,我才被佬儿的技术啪啪打脸,我羞愧,因为我明明也是想走这么一条路,却越走越偏,越来越自我满足,在技术上不求甚解,根本没有大佬们的创客精神。我承认,那一刻我羡慕的要死,我嫉妒的要死,我想追赶他们,于是,我开始冲锋了。
由于有过基础,单片机很快被我拾了起来,但是想突破现有的水平,我就需要走一条高级点的路线,我开始冲Linux。起初并不简单,因为我也不知道Linux该怎么学,只看过一些Ubuntu系统操作的书籍,但是无法在开发板上实战。我搜集资料,找啊找,找到了正点原子,有免费的指导书看,但是开发板700+,这我承受不住啊(因为我担心有了书,相同的开发板也不一定能在我电脑上配置成功,以前就试过了)。于是,我找便宜的开发板,找到了全志系列,虽然没啥资料,但是学习嘛,没钱投资就只能动用脑子和时间了。
再后来,我出课程教学,给小白做一个指引,都是小白过来的,所以我更知道大家需要的是什么。免费的资源很多,但是Linux配置和使用的问题更多,谁也不会全部讲述清楚,而只有答疑,才能解决各种新鲜的、未知的问题,才不至于耽误很长时间。
好了,基本的心路历程就大概讲完了,还有一些后面再一点点补充吧!
接下来上点干货,把零基础入门嵌入式开发的路线分享给大家,一起进步!四个月的刻意训练,相信你完全可以入门并了解嵌入式开发,对各个方向有一定的了解,并能够找到自己的兴趣方向。
1、硬件基础(付出时间:✊)
对于一名想成为嵌入式工程师的我们来讲,硬件并不需要我们付出很长时间去了解。基本上,在任何一家中型以上的公司,都会有硬件设计师岗位,甚至还会分出专业的PCB Layout工程师。所以,我们只需要花费不到一两周的时间(这里指每天了解半个小时就行)去了解一些必须知道的硬件知识就好了。
必学 首先是,各种基础的电子元器件要认识,电阻、电容、电感、二极管、三极管,对他们的基本用途要有一定的了解。还需要熟悉各种元器件在电路中的符号,学会看懂电路原理图(不了解各种符号就无法知道电路图中的元器件都具备哪些电气连接关系)。
必学 然后是对基本电路的了解,举例说明:单片机最小系统电路(单片机、复位电路、晶振电路)、按键高低电平识别、LED高低电平工作。当能够一眼知道各个引脚的连接关系,知道各个功能模块哪些引脚需要用来调试的就OK了。这一部分没什么,多看看51开发板和32开发板的原理图(我直接给三份,分别是51、32和全志芯片的,其中全志的难度略大),很快就会入门了。
入门期间不学 最后,这一项任务可以工作了再做,如果有锻炼的机会更好。能够根据设备接口,完成设备与单片机或者Linux系统开发板的连线,因为我们总会遇到新的设备。但是即使是新的设备也只会使用常见的一些协议传输方式,照样是使用IO口进行复位或片选。自己接线时最需要注意的是电源问题,电压高了轻则烧设备,重则开发板全部报废,电压低了设备工作不稳定,错误难以发现。
最后,AD这款软件作为想走硬件设计路线的你来说是躲避不了了,提前用起来,提前学会各种布线布局规则,提前多练习(小破站视频一大堆),总有一天你会感谢你的努力。
推荐书籍:
《电子设计从零入门初学者入门》
《51单片机任意开发板电路原理图》
《32单片机任意开发板电路原理图》
推荐视频:
bilibili.com/video/BV1x341137iZ/?spm_id_from=333.337.search-card.all.click&vd_source=9b9be2200e716bf6c2f69a6f50a9cf1f
书籍和视频都是别人的经验,先学习再去创造,只看视频不如书细致,所以书籍的作用必不可少。
2、C语言(付出时间:✊✊✊✊)
必学 每本书,每部视频都会把C讲解的差不多,所以跟着一本书或者视频学到指针、结构体就好,后面慢慢进化。实战更重要,所以尽早进入单片机学习,当然C不能落下,每一次的回访都会有收获的。这是为了让大家尽快进入实战,找到学习的乐趣,再去挖掘枯燥但有用知识点。
必学 基础知识有:进制转换、变量与常量类型及范围、宏定义、算术运算、逻辑运算、关系运算、if for switch while 四大常用语句、函数、形参和实参、全局和局部变量、数组字符串、结构体、指针;后面还有内存、联合体、数据结构可以慢慢地补充。不要妄图一次学通,除非是在上学,不然等不到工作就饿si了。
推荐书籍:
《C和指针第二版》
《LinuxC编程一站式学习》
推荐视频:
bilibili.com/video/BV17s411N78s/?spm_id_from=333.337.search-card.all.click
3、51单片机(付出时间:✊)
必学 网上很多人对入门者学不学51单片机持有很大的争执,我的建议是学,但是不可入魔。51单片机是所有芯片的鼻祖,8位芯片的代表,学会操控51单片机,就基本知道如何去控制更高级的芯片,只不过高级的芯片都会有专业的厂商工程师提供好供调用的API函数。 51单片机学哪些内容,很多初学者对着别人代码一顿抄袭敲打,连为什么赋值引脚0和1都不知道,别人给寄存器什么值,自己就给寄存器什么值,搬运工没什么用。这也是网上许多课程的诟病,所以我才开设了一门通过手册来编写代码的课程,让大家知道根源在哪里,怎么配置寄存器,配置哪些寄存器,这些其实都在手册里面写好了,耐心读手册的学生,一遍下来就明白个大概了。
有初学者(比如我)从LED开始,按键,蜂鸣器,显示屏,SD卡,蓝牙,WiFi,继电器,红外开关,电机,舵机玩一圈,喜欢以自己玩过多少模块为傲,其实没一个驱动代码是自己写的。而且等回过头看,其实多数就是通用输入输出功能(那成品模块都给封装好了),加上串口协议,IIC和SPI协议,高级的协议51也玩不转的。
必学 所以个人推荐51单片机学会这些知识点就够了:看懂芯片各个引脚的功能(必读手册),输出(LED),输入(按键),外部中断,串口通信,定时器。协议在32中学,别在51一直走低端局浪费时间。 (当然,如果是想在51单片机这里练习练习C语言的高级编程,那方向没差,可以多玩,总之要有一个方向在提升)。
推荐书籍:
《新概念51单片机C语言教程》
《STC89C52数据手册》
推荐视频:
bilibili.com/video/BV1Mb411e7re/?spm_id_from=333.337.search-card.all.click&vd_source=9b9be2200e716bf6c2f69a6f50a9cf1f
推荐开发板:
某宝搜江科大51单片机(其实推荐视频链接下方就能找到哦)
4、32单片机(付出时间:✊✊✊)
32单片机很重要,因为现在全球各大企业,32单片机的销量很高,主要是性能好,成本低,深受喜爱。这玩意儿可比51功能强大的多了,能直接输出PWM控制电机转速,也能直接捕获外部脉冲周期,定时器多达30路以上(仅仅f1系列)等等,手册都有,不再详细赘述。
必学 推荐32单片机需要学会的知识和技能点:看懂芯片各个引脚的功能和复用功能(必读数据手册,库函数手册(标准库、HAL库选其一),cortexM3内核手册浏览即可),输出(LED),输入(按键),外部中断,串口通信,定时器,PWM,输入捕获,IIC,SPI协议。好,学会这些,做几个小项目练练手(贪吃蛇游戏,物联网小车和物联网天气显示)。想到此为止的就去找工作吧,不一定非要等学会多少知识,去了企业根据项目还会调整自己的知识和技能体系,你现在需要的就是一个锻炼的机会。
如果你还有时间学习(强烈推荐在校生),请一步进阶Linux开发。 当然,想通透32单片机可以先上FreeRTOS系统玩一玩操作系统,熟悉系统下编程需要考虑的点(我本人是直接Linux了)。
推荐书籍:
《STM32不完全手册库函数版》
《cortexM3权威指南》
《STM32F10中文参考手册》
《FreeRTOS源码详解与应用开发 基于STM32》
推荐视频:
bilibili.com/video/BV1th411z7sn/?spm_id_from=333.337.search-card.all.click&vd_source=9b9be2200e716bf6c2f69a6f50a9cf1f
推荐开发板:
某宝搜江科大32单片机(其实推荐视频链接下方就能找到哦)
5、Linux驱动开发(付出时间:✊✊✊✊)
很重要,就算是以后做其他方向,也建议懂一点这个,这是根基,让你编程出现问题的时候学会分析。Linux很庞大,网上资料一堆,真的是学完东家学西家,学完感觉自己还是什么也不会,为什么?因为第一,资料无法很详细;第二,开发者用的开发板你不知道是什么,软件版本你不知道是什么,所以人家从头做到尾,你卡到了开头,这些,你网上肯定找不到详细的指导教程,不然人家怎么赚钱呢。
要知道Linux走的就是高级开发路线,那么好学就成了单片机了,没得玩了就(不知道是谁说的,技术学学就能学会,资料一大把。是,一大把资料,问题也是一大把,尤其是Linux,真的能崩溃)。 Linux驱动开发属于底层,是建立在内核态以下的,但是随着多年的发展,其也有一套编写框架,因此就不是那么复杂了。
在编写驱动之前,还有一件事情很重要,那就是芯片移植和驱动移植,也就是将Linux系统移植到现有的ARM开发板上面,需要考虑开发板自身的外设,这就需要对Linux内核有一定的了解,我也推荐了优秀的书籍。接下来是驱动开发的学习路线,请查收:
必学 Linux基础命令(shell命令,不必恋战,只掌握常用的就好,如果不知道什么是常用的,我再推荐个网站,百度搜索“Linux菜鸟教程”)->ARM系统移植(不移植到开发板怎么用,但是对于初学者,可以使用现成的别人搭建好的uboot、Linux镜像、以及根文件系统),等到后面学个差不多了,多去读读内核源码,就能自己玩转各种源码搭建了->字符设备驱动开发(包括,从简单的寄存器读写操作LED开始,然后学习设备树下LED驱动的开发,接下来是基于pinctrl和gpio子系统的GPIO输入和输出开发,中断、阻塞非阻塞,接着是设备树下基于platform平台的设备驱动,MISC驱动实验,INPUT子系统实验,IIC驱动,SPI驱动。其中,弄清楚设备树,pinctrl,platform,MISC和INPUT开发各自之间的关联与区别)->块设备驱动开发(RAM模拟磁盘,针对存储设备的,我也没尝试过)->网络设备驱动开发(转网络工程师)
推荐书籍:
《跟我一起写Makefile》
《UNIX环境高级编程》
《深入理解LINUX内核_第3版》
推荐视频:
貌似开源的视频没多少,正点原子的去搜搜吧,反正基本都是卖板子送视频(懂得都懂)
6、Linux应用编程开发(付出时间:✊✊✊)
没啥说的,很多人想像的嵌入式软件工程师就是这个了,准确的说更贴合一些。
必学 直接说路线:
文件IO操作(基础的读写开闭和高级IO操作),文件系统资源与管理,信号,进程与进程通信,线程与线程同步,然后与开发板结合,点亮LED(Linux有专门的函数),GPIO应用编程,输入(按键)编程,串口应用,网络编程基础(转网络工程师) 。这部分除了网络编程是专业方向,其他的都应该有所掌握,最好是学会多线程开发,哪怕是只了解一点,在面试的时候也会提高自己的竞争力。不是说自己会写基本的文件读取程序就OK了,多多的敲代码,学代码,然后往难一点的方向(多线程开发)靠拢,总能有所提升的。
推荐书籍:
《UNIX环境高级编程》
《TCPIP详解卷》
7、Linux界面开发(付出时间:✊✊✊)
必学 直接说路线:
C++基本特性和语法的了解(类似于学C语言的时候),QT各个控件的认识(多看QT软件手册,QWidget、Qwindow、pushButton、label、text、list等),定时器,文本读写,绘图和表,多媒体。这部分主要是学会布局,具备一定的审美观,对各种控件的理解和应用越熟练越好。再就是网络编程(转网络工程师)。而后是QT与开发板连接做上位机应用、云控制等等。其实仍旧是控制开发板的输入输出、串口通信取数据。 以前我总觉得这部分最简单,就是单纯的界面设计,其实,能做到极致的就是大佬,就是能比普通技术员多出每月几个w的薪资,为什么,去看看我放在下方的牛人博客链接吧,刷新下咱们的认知。
推荐书籍: (有好书再给大家分享,看看软件自带的help手册就能练成内功了)
《QT软件帮助按钮下的各种函数介绍》
推荐视频:
bilibili.com/video/BV1Jp4y167R9/?spm_id_from=333.337.search-card.all.click&vd_source=9b9be2200e716bf6c2f69a6f50a9cf1f
推荐牛人博客: Qt/C++原创项目作品精选(祖传原创/性能凶残/界面精美)_feiyangqingyun的博客-CSDN博客
尽管代码都是抄抄改改,但是最具有竞争力的是编程思维,能够独立开发项目的工程师到哪里都会受到重用。当然,项目结束后就被束之高阁了,不要想着哪家公司就是自己一辈子的铁饭碗,上岸先斩意中人,做大先裁工程师(是人性,是金钱)。
写在最后,真正的热爱才会让你敢于孤身走暗巷,走出坦途,否则,挣些钱满足自己的小欲望就好了,不要让自己的实力匹配不上自己的野心。另请注意,不要各种方向都浅尝辄止,选择一个方向深耕下去,其他的成为自己的扩展领域就好。这里大家需要注意,不是人人都要跟我一样成为一个讲课老师的,备课做课不一定适合每一个人,去合适的行业和岗位发挥自己的优势就可以了!!!
一丁点脑子都不想用的小伙伴也不用来问询课程,因为我也不会推荐你学这个的,它的难度适合有兴趣和愿意付出时间来思考的人学习。
书山有路勤为径,学海无涯苦作舟。
沉舟侧畔千帆过,病树前头万木春。
长风破浪会有时,直挂云帆济沧海。