从零基础到精通:嵌入式学习全攻略(30K字)

发表时间: 2024-03-09 16:40

引言

很多同学在跟博主私聊的时候,经常问博主该如何学习嵌入式。这个问题其实很难以回答,每个人的具体情况都不一样,也没有什么万能的方法,保证大家都能学好嵌入式。本篇文章,博主将结合我自己的经历和理解,谈论下博主自己的学习路线,希望能够对大家有所帮助。

一般嵌入式学习(以stm32为例)中,主要集中在四个方面:C语言、STM32(外设及内核)、RTOS、工具链。接下来将详细的阐述下,上述四个方面该如何学习,如果是本身没什么基础的同学,可以直接按照博主说的学习,博主本人就是这么学习的。

注:嵌入式是工科,工科讲究实践。说的再多、懂得再多,不能做出实际的东西,是没有意义的。学习嵌入式的核心原则之一就是多动手写代码。另外还有一个原则就是:从浅到深学习。接下来的内容将贯彻这两个原则。最后强调一点,各个方面的技术是齐头并进的学习,而不是某一个方面学的非常好才去学习下一个方面,这种方法在博主看来并不可取。实际开发中,用到的技术会很多,我们只需要做好其中一部分就行了。

导航栏

  • 01 【 C语言】
  • 02 【stm32】
  • 03 【浅谈学习方法】
  • 04 【常见问题简答】
  • 05 【薪资水平】

01 C语言

C语言是嵌入式开发必备的基本技能之一,对它的学习没有尽头,需要大家认真学习C语言。熟练使用C语言开发,只是嵌入式工程师的基本要求。

1.1 开发环境

学习C语言本身,可以使用各种工具链,这里博主比较推荐微软的VS开发工具,在win下学习C语言。作为小白而言,简单、好用的工具更重要,VS提供了开发C语言需要用到的各种工具。对于个人学习而言,社区版本完全够用,可以在微软官网下载到VS软件。博主使用的是VS 2019版本,也可以用其他的版本。

1.2 C语言入门

C语言的视频视频B站很多,大体上没有太大差距吧(指内容),博主自己也只是看过一些郝斌的C语言视频,这个可以看看,博主学习的时候更喜欢看书,主要是看书信息接受效率高。这里推荐一本C语言入门级别书籍:《C程序设计语言》,作者是布莱恩·克尼汉,丹尼斯·里奇。C语言创始人写的一本书,非常经典,在世界上都享有盛名。大名鼎鼎的Hello world程序就是这本书提出来的。

这本书的经典程度网上一搜就有,博主就不多赘述了,用它作为C语言入门书籍完全没问题。书里面的代码风格也是值得借鉴学习的,非常建议读一读该书。

1.3 C语言提高

对C语言基本的语法使用有一定理解之后,就需要对C语言进行提高了。提高阶段,博主推荐如下三本书:《C与指针》、《C专家编程》、《C陷阱与缺陷》。

这三本书应该读哪个?

这三本书,博主都研究过。三本书的内容有不少重复的地方,看完一本之后,另外两本看的也挺快的。如果有时间的话,建议三本都看看,时间不够的话,就只看《C与指针》这一本也行,这本书内容详实,有入门有提高,从浅到深,也可以拿来入门C语言。至于其他的书籍,博主因为没有过多研究,就不推荐了。

以上C语言的资料学习完成之后,基本上对于C语言有了较深入的理解了,应付平常开发应该没有太大的问题。

02 stm32

stm32是目前市面上资料较多的ARM芯片(指Cortex-M系列芯片,下不赘述)了,用的人非常多,资料很全,遇到的各种问题在网上都可以找到解决办法。有些问题真找不到的话,那就触及到深入的领域了,也不是初学者该遇到的和能解决的。因此,博主建议,以stm32为切入点,学习ARM 32位处理器的使用。stm32芯片有非常多的系列,每个系列又有很多芯片,这里博主推荐stm32f407的芯片(博主也是用这个芯片学习的),兼顾成本、性能、学到的知识,性价比高。下面谈谈该如何学习这款芯片(其他的芯片类似)。

2.1 stm32基础

stm32芯片里面的内容其实非常多,但作为初学者,并不需要关心特别高深的内容。我们只需要掌握stm32常用的开发以及基本的知识点。博主根据自身的开发经验和经历,总结了如下常用的外设:GPIO、UART(串口)、中断、TIMER(定时器)、AD、DA、SPI、I2C、PWM、DMA。这些外设都是非常常见的,基本上所有的ARM芯片都会有。上述外设的学习可以不分先后,但还是推荐按照上面的顺序进行。

除此之外,还要学会使用一款开发工具链(推荐Keil,毕竟是ARM公司的)。能够掌握基本的Keil使用方法就行了。比如多文件编译、调试仿真、常见配置等。

学习完基本的外设之后,就可以动手写一些简单的项目,巩固所学知识。这些项目博主以后都会放到公众号里面,供大家免费下载学习,也会出一些文章,讲解项目的思路,供大家学习。

2.2 stm32进阶

以目前的招聘需求而言,学完基本的stm32内容已经无法满足了(太卷了)。因此,需要开始往较深入的内容学习。这里博主将进阶路线分为如下两条主线:软件主线、硬件主线。

2.2.1 软件主线

1. C语言:继续往精通方向学习C语言,比如,C语言的高级用法,C语言是如何实现面向对象思想的,C语言代码是如何控制硬件的,C语言代码是如何使用内存的、代码是如何在内存中布局的,C语言代码是如何在芯片中执行的,这些问题都是需要深入研究的。除此之外,也应该学习下常见的数据结构,如链表、树等。至于图这种数据结构,太复杂的,别为难自己。

2. RTOS:除此之外,还要学习RTOS(推荐FreeRTOS,背靠亚马逊,用的人多,资料也多,市场广阔),并且应该往深入的地方学习RTOS,而不应该仅仅浮于表面。知道使用FreeRTOS怎么创建任务、信号量、互斥量、队列等,这些只是表面,内部实现的原理和机制才是面试要考察的(毕竟所有的RTOS都类似,掌握了原理才能很快上手其他的RTOS)。而且这些原理性的知识是通用的,也是一个嵌入式工程师的内功,面试考察的就是内功。我们还可以借鉴一下FreeRTOS源码中优秀的设计思想,用到我们的代码中,一举多得。

3. 中间件:有精力的话,可以学习一些常见中间件的使用,如emwin(写GUI界面用到,或者LVGL也可)、Fatfs(文件系统,管理数据用的到)、Lwip(网络协议栈,以太网通信用的到),这些中间件以会用为学习目的和标准,不需要深入研究,除非以后做这方面的工作。

2.2.2 硬件主线

stm32芯片的基本外设学完之后,我们还需要学习复杂的外设和芯片内部的一些内容。下面的图,建议大家背下来,这是博主在学习的过程中画的stm32芯片内部功能逻辑图,具有普遍意义(针对Cortex-M系列芯片)

我们学习的常见外设,只是挂载到总线(AHB、APB总线)上的一个个独立的功能单元,CPU(图中Cortex-M3就是芯片内部的CPU)如何与外设进行交互、芯片的调试系统、中断系统、总线系统等等,还有非常多的内容需要我们学习。

在学习stm32的时候,我们会遇到一些比较复杂的外设,这里面时钟系统(RCC)还是要学习的,RCC就相当于芯片的动力系统,连接着芯片内部的各个功能部件。除此之外,RTC(实时时钟)、CRC(循环冗余校验)、CRYP(加密处理器)、RNG(随机数发生器)、HASH(散列处理器)等外设看心情学习。但比较复杂的,如USB、以太网、FSMC(灵活的静态存储控制器)、SDIO(安全数字输入/输出接口)、DCMI(数字摄像头接口)这些复杂的外设,就不太建议学习了,可以了解下,不需要进行深入研究(学习成本高,真正用到了,学的那点也不够,导致性价比太低)。如果以后想专精某一个方面,可以去学习。CAN总线用于汽车领域,如果不打算从事汽车领域工作的话,可以不用学习。stm32f407芯片的外设就这么多,都在上面讲述了,各位同学根据自己的需求进行学习。

除了外设之外,M4内核还支持DSP指令集,这个用于对数学运算、控制运算、信号处理、数据处理等方面,也可以学习下如何使用。对DSP指令集的学习,只需要学习该如何使用DSP库即可,库里面的算法都是使用DSP指令集进行加速过的,我们只需要会用就行。

学习完上面的内容之后,也可以研究下CPU部分,如常见的堆、栈、流水线、寄存器、CPU现场等相关内容,这些在学习FreeRTOS时用得到,也是面试中常问的内容。

在软件主线、硬件主线之间,还有一个就是工具链,主要是编译器在链接期间的部分知识。这部分内容,也是我们经常用到的一些技能,如进行IAP开发、OTA开发等,还有一些特殊用途,也需要对链接阶段进行改动,以满足应用需求。

这里推荐几本书:《Cortex-M3权威指南》、《STM32F4xx参考手册》配合起来一起学习。

2.3 学习顺序(重要,小白跟着做即可)

  1. 入门:首先要有C语言的基础(能用基本的语法编写程序即可),接着开始学习stm32的基本外设(常见的外设,上文中有提到)。这个时候可以做一些简单的项目,巩固下学习效果,学习stm32的核心原则之一就是多动手写代码。这里博主推荐江科大的视频(B站有),市面上少有的精品、免费视频了。收费的基础课,博主觉得都很难与其进行比较,看得出来,江科大的视频是用心做的,强烈安利~。
  2. 提高:这个时候需要提高C语言(推荐的书都去看看,研读一遍),先把C语言水平提上来,否则后续学习会因为缺少C语言基础而非常痛苦。之后,再去学习FreeRTOS,或者也可以先去学习stm内核部分,这两个先后顺序其实无所谓的(反正对新手来说都是新知识,都不简单^^),二者有些东西也是相辅相成的。
  3. 这个时候应该做一些有难度的项目,将自己学习的内容、技术体现在项目中,用于找工作。

学习到这里的话,基本上找工作已经没啥太大问题了。

2.4 stm32深入

这部分内容属于较深入的技术了,适合对技术(工资)有追求的同学,需要静下心来,慢慢研究的技术。这些技术都是较深入的,如果连上面的内容(指入门、提高部分)都学不会的话,这些内容还是算了,别为难自己,即学不懂,学了也没啥用(水平不够,用不到)。这里只放一下学习大纲,有兴趣的自己学习。

C语言

芯片内核


Keil提高

FreeRTOS


2.5学习路线思维导图

在最后,放一个学习路线思维导图,拿着这个,按照上面的知识点,一点点学习,肯定可以成为大佬(30K+)

03 浅谈学习方法

博主学习stm32已经7、8年了,对stm32的学习也有一点心得,这里浅谈下学习方法,仅供参考。

3.1. 挑选一个合适的开发板

作为一个初学者而言,开发板并不是越高端越好,能够有基本的功能、满足自身学习即可(土豪当我没说)。博主在第一次学习stm32时,就只买了一个核心板、一个TFT屏幕、一个J-Link下载器就开始学习了(博主大学的时候真是一个穷学生)。后续的学习过程中,缺什么就买什么,不重要的东西,基本上都没去接触(如can总线、以太网等)。

这里给一个极致低价的stm32学习硬件:一个stm32核心板、一个st-link下载器、一个usb转ttl(用于调试),这一套成本也就30左右(博主在小红书里面推荐过这一套方案,很适合穷学生(比如博主大学的时候),可以去某宝上找下。

一般而言,博主比较推荐用stm32f407入门stm32,这个芯片的性能较强、价格也够低、性价比很高,除此之外,资料也很丰富,还可以用标准库开发,某宝上一搜一堆。

3.2 动手实践

嵌入式是工科,工科讲究熟能生巧。在学习的时候一定不能偷懒,一定要多动手写代码。每学习一个外设都应该去动手写代码,将这部分功能的代码调通。每学习一个知识点都应该写代码验证自己的想法是否正确(到今天博主依然也是这样学习,学习某个知识点之后,写代码验证)。写代码写多了,自然就能理解了。同时也要注意写项目,巩固已经学习的知识,顺带锻炼自己项目整合的能力。

3.3 从浅入深

工科的任何知识学习都应该遵守从浅入深、从看得见摸得着的内容开始学习,逐渐过渡到看不见、摸不着的领域(这个时候只能靠自己的基础,推理到这部分了,然后做实验进行直接、间接验证)。stm32的学习也是,从基本的外设开始,这些最容易看到(改个参数,就能看到现象),然后逐渐过渡到对内核的学习、对工具链、RTOS等一些比较深入领域内容的学习。

04 常见问题解答1

学stm32是用hal库学习还是标准库学习?

这里首先要明确一个概念,hal库是st公司为自己家的stm32系列芯片开发的一套库,一套库兼容所有的stm32芯片,必然导致代码臃肿(为了兼容性)。标准库是st公司早期为stm32芯片研发的开发库,目前只支持到stm32f429系列,再往后的stm32f7系列就只有hal库了。hal配合cubemx开发,速度飞快,确实有多种优点。

但博主不推荐使用hal库学习,理由如下:

1. hal库是st的,只支持st的芯片,而我们以后开发芯片,不知道是哪家公司的,其他家芯片提供的开发库更类似于标准库(这里可以看出st真是有实力的巨头)。

2. hal和标准库差别不大,但hal学习起来成本更高(为了兼容性,使用了较复杂的软件特性),而且会了标准库,hal上手难度并不大,学习成本基本为0,过度平滑。

3. 最关键的,hal库编译太慢了,真的巨慢,比标准库慢多了,博主当年的笔记本性能也是还可以的,也觉得编译慢,无奈选择标准库开发(再吹一波cubemx,真的开发超快)。

我们从hal库和标准库本身出发,得到初学者更适合学习标准库的结论。所以,作为初学者,别纠结了,无脑标准库吧。当然要是实验室的同学、或者老师、或者小伙伴都是hal库学习,还是拿hal库学习stm32吧,可以更好的交流。

学习stm32之前需要先学习51单片机吗?

博主本人在刚上大一的时候,就开始玩51单片机了,博主确实是先学51单片机、再去学习stm32。所以我对这个问题还是有发言权的。结论是:没有必要先学习51单片机。因为51和stm32差别太大了,我除了大一玩过51单片机,再也没写过51代码,都已经忘了怎么写了。stm32和51虽然同属MCU,但就跟五菱和劳斯莱斯都属于汽车一样(没别的意思,别乱想,仅仅比较价格而已),二者差别太大了。在51上面学习的内容除了外设原理在stm32上有用之外,基本没啥太大用处了

但这些知识在stm32上同样可以学习,所以大胆的学习stm32吧,现在招聘都要求会一款32位处理器。

05 常见问题解答2

在这一节中,我们简单的聊一聊招聘市场的情况。经济学里面有一个论断:供需关系决定价格。对于我们工程师找工作而言,就是招聘市场上找工作的人与企业招聘人数,二者决定工程师的工资水平。我们工程师找工作靠的是技术水平(能做什么),技术水平的高低(准确的说是稀缺性)决定我们的工资水平。

  1. 3、5k薪资水平:这是绝大部分应届生的水平。这些人大概会一些stm32外设的配置,使用这些外设,配合一些模块(比如屏幕、蓝牙、陀螺仪等等)做一些应用开发,做一些小项目。这种水平的同学,找工作其实比较难(因为大家都类似,企业凭什么要你),这是个很现实的问题。而且这种水平对应的工作也不会太好,一般就是3、5k的样子,市面上一抓一大把。
  2. 7、8k的薪资水平:要想再进一步,就要学习更多的东西,比如RTOS。RTOS是一个非常好的技能点,它是和周围同学、同事拉开差距的一个切点,也是关键点。能够使用RTOS提供的功能,如任务管理、信号量、邮箱、互斥量等,可能还会配上其它的中间件,如LVGL,fatfs等,做一些项目,这种应届生都是比较少的了。相比较前面那些同学,这种应届生更容易找工作,但依然处于初级阶段,依然还是做简单的应用开发,并未涉及较深入的内容。
  3. 10k以上:若是想拿到这种水平的offer,就不能光局限在应用层面了。前面两者都是在应用层打转,并没有涉及较深入的内容。我们需要了解RTOS内部的实现机制、实现算法,stm32内核IAP是个好东西,非常适合作为深研stm32的切入点)。只有到这个时候,我们才算是开始真正具备走向一个技术大牛应该有的基础。这个水平的嵌入式工程师,有了走向成为技术大牛的可能和基础,已经在技术大牛的起点了。
  4. 20k以上:能在应届生水平拿到20k以上offer的,都是有两把刷子的。以博主本人为例,在2.4节提到的那些技术,博主都有所涉猎,不仅如此,我还在Linux驱动、嵌入式AI领域有所研究。2.4节提到的技术,可以说20K薪资只是起点了,以后30K、50K也可以理解为2.4节技术的深入研究了。

上面只是博主自己的理解,具体情况,各地可能都不一样,不能进行统一比较,也可能说的并不对,仅供参考(希望大家也不要在这里较真,只是参考的数据)。