从决定走嵌入式相关的道路到现在已经一年了,买了人生的第一块开发板,正式学习了相关的软件操作到现在,然后逐渐去学习一些基础外设,之后学习了电机控制,再买了电机开发板等等到现在,前前后后已经有了四块开发板了。但是最近导师那边接了新的项目,暂时没有精力专门去做嵌入式专门的项目了,学习的进度也得因此搁置,所以决定写一篇小小的笔记来进行一下自我总结,之后有空也继续按照现有计划去执行。
第一块开发板——精英
第一次买开发板当时在野火和正点原子之间琢磨了很久,其实两家的硬件和开源资料都做的蛮好的,价格上相差也不很大(开发板的一些外设不是很一样,我现在看野火好像貌似在Linux开发板上稍微便宜一点的样子,但两个板子的外设以及购买的套件配套不一样,总体看相差也确实不大;就是野火已经更新到了rk3588s,正点原子才到rk3568),是实验室师兄们有以前买过正点原子的,由此买了正点原子的精英开发板(入门级学习stm32,F103ZET6的芯片),开始了学习之旅。
学习资源
这里去正点原子的官方有许多学习的开源资料,而且b站上也有配套的免费教学视频,就入门而言这个资源绝对是很多的,而且还有配套的教学视频源码以及例程源码,学习起来是很简单的。
第一步——裸机开发
从学习的顺序来看,基本就是先大致了解一下什么是嵌入式开发,stm32的相关基础只是,然后就是最常用的开发软件Keil,学的是st公司的HAL库版本(虽然开发例程还是老一套寄存器那种,但是就嵌入式学习而言还是不错的,毕竟其它牌子没有cubemx);之后就是经典的GPIO输出输入,串口通讯,看门狗,定时器;最后就是各种常用外设的一些学习。
从我目前学习和用到的频率而言,GPIO还有定时器以及串口是最最常用和重要的!!定时器配置中断,是单片机计算的灵魂,GPIO就是最基础的配置输出输入一系列的操作,串口的话则是单片机和外界(学习开发最常用的就是你自己的PC)通讯的外设。
在这些基础上,再看一看OLED显示屏,LCD显示屏和触摸屏用于直接单片机上显示信息(外设,需要另行购买);ADC来采集电压(这个很重要,电机控制就很常用,采集外界信息),DAC输出电压(这个我没咋太多用过),DMA来绕过CPU直接传数据(这个在ADC里面也很常用,stm32就直接配一配就好了也不难),IIC和SPI通讯(许多外设都是用这两种通讯协议进而使用这些外设,很重要),然后就是485和CAN这种通讯协议还有红外遥控(485在一些屏幕上是通讯协议,CAN的话去车企必定接触,红外遥控比较少,自己做项目远程控制可以用这个)。
这些如果都学完了,后面的话看看TF卡SD卡,DSP测试(st有库,可以用,就是做些FFT变换什么的,这个我只知道也没学过用过),其他的一些什么照片啊汉字啊个人觉得其实也不会用到,没必要学那些。
以上基本就是最简单的精英板可以学习的一些裸机开发的知识点,要全学完得花点时间,而且其实都还蛮常见和重要的。
第二步——实时操作系统RTOS
以上全部学完(其实学完基础的,后面那SD卡什么的也不用学,学生阶段自己做项目很少用到),后面就可以考虑去学RTOS相关的内容了。这个的话相当于给单片机加了一个简单的操作系统,而且是实时系统,专门就是为了简单的嵌入式而设计的,现有开源的也比较多,我是看了很多资料,基本上也都是学FreeRTOS,内在的操作系统逻辑也差不多,学一种也就好了,其他比如还有国内的RTthread,也是类似的道理。
这里的话,同样也是跟着正点原子去学的,下载的资料里面就有这个学习的手册,同时b站也有教学视频。
如果只是从使用角度而言,我觉得你甚至可以不看视频,就对着手册看一下什么是RTOS,大致的概念有哪些,然后学一学怎么在裸机工程移植FreeRTOS,再看一看那些API怎么使用其实就可以了。
如果从学习角度,那么就跟着视频,他里面是有源码的一些带读的,讲解的也还不错,但就我个人而言,时间一长我自己也就忘记了,只记得一些大概的概念。我看一些大佬说这个自己多看看可能有些面试会考察RTOS的一些知识点,但具体我也不清楚。如果时间多学习肯定是很好的,时间不够的话我感觉你会使用,有配套的项目说我用到了也就差不多了,应该也不会问那么细。
第三步——找项目应用
我当时是正好有一个电机控制项目,所以就顺便去学了电机控制的课程。
这里同样还是正点原子的教学,b站是有免费课程的,同样去下载学习资源里面也有,只不过是在电机开发板的资料里面。
电机控制的学习,就是学有刷直流电机、舵机、无刷直流电机、步进电机这么几个常用电机的控制原理以及具体的代码实现。算法主要就是最最最常用的PID,然后步进电机有几个加减速的算法,无刷直流涉及六步换相还有FOC算法。
这里我当时就碰到了一些问题,你没买实际硬件其实是很难有感性认识的,只是对着课程看看没啥效果;自己买了步进电机,用学到的知识在F1上面来控制步进电机,结果梯形加减速算法就一直跑不起来;S型加减速直接给我报FLASH不够编译不通过……所以后来就买了第二块开发板来验证。当然这是后话,总体来说只是学习,看看视频的课程还是基本能掌握基础知识点的。
第二块开发板——电机开发板
基于以上原因,买了第二块开发板——电机开发板,还买了配套的电源以及无刷电机,这个就有点小贵了,还是看自己的经济实力。电机开发板是F407的芯片,同时运算性能和配套的FLASH容量都比精英板要好了很多,当然也因为学习有溢价(价格以及性能,做项目的话F1系列足够了),酌情购买。
电机控制
于是,进行了第二阶段的电机控制的学习,这一次有了配套的例程,相应的自学就快了很多,学习起来也有了更加好的认识。
从学术研究角度而言,肯定是PMSM研究的最多最好(看成一种无刷直流电机就好),常用的话直流有刷、舵机、步进都很多,所以都需要掌握。算法层面前面也说了,那如果是学术研究,基本就是PMSM的FOC,各种有感、无感FOC算法,还有更进一步的DTC算法,做速度的双闭环以及位置的三闭环,这些文献包括研究以及实际项目落地都很多,这一块是非常值得学习的!
我自己的话,项目跟PMSM有些类似,所以借鉴了很多六步换相、FOC的一些控制理念,这里不赘述,总之科研层面就多搞PMSM的矢量控制。如果是科研项目涉及的底层控制,那还是直流有刷+PID最最常见。
网络通讯
学完了电控之后,我感觉一千多买这个板子只学这些有点浪费,就去看看还能学啥,最后看到lwIP协议的学习,这个就是TCP/IP协议,网络通讯的内容了,物联网比较火的现在学学这个还是很不错的,于是投身开始学习。
这一部分不多讲,还是有资料加课程。
学习完的话,如果只是应用,就看一看lwIP的一些基本概念(就是简单的网络通讯架构以及基础知识),然后学一学怎么在裸机工程中移植lwIP协议,之后学一学socket的API来完成通讯,最后看看怎么跟服务器完成通信就可以了。
学习的话,视频里也有源码带读。这里我感觉其实正点原子的课程讲解有一点乱,不是很推荐看课来学,不过也可能是因为这一部分的内容本身很难拆分,拆成子模块进行讲解,各子模块之间仍会有较高程度耦合。
这里lwIP的话,如果直接买正点原子的战舰板也是可以学的,还是比较底层的一些内容。如果现在做项目,其实涉及物联网更多的是stm32+esp8266,或者直接esp32就可以完成wifi功能的联网实现了。那些直接去看esp32的一些api怎么用就可以了。就学习而言,只用stm32也可以联网,就是需要有网口来连接路由器,对硬件有要求,esp是无线有wifi来用的。
小总结
从简单的嵌入式的话,单片机的内容基本就到这里,我就学习了这些内容。当然如果还要做UI什么的,嵌入式同样有开源协议,在小开发板上,LCD屏幕实现图形界面的搭建。这一块我没有学习,感兴趣的同样能学。
之后我打算学习嵌入式Linux的一些内容,所以以上内容就不学了,这里就买了第三块开发板。
第三块开发板——STM32MP157
这里先提一句,稍微有点后悔买这个,用的人少你去搜资源也很少,入门的话Imx6ull,这个用的人多,相关开发者的帖子也多。
不过从学习角度而言,其实是一样的,就是用开发板学习基础的Linux驱动和Linux应用开发。
这一部分我自己也是最近才学完的,也没有做什么项目,自己想的一个最近时间不够也暂时搁置了,所以接下来写的也不会特别多……
Linux驱动
这里我也不确定能不能叫Linux驱动,因为并没有自己开发,而是用一些已有的开源代码,用他来驱动对应的外设而已。
学习的话同样是对着文档来学习,这里的话对应的课程b站是有的,但是MP157只更了一点点(问客服,说是销量不好,后来就没更新了;Imx6ULL那边好像是全的,也可以对着看,逻辑是一样的)。
学习的路线是学习一些基础的概念,然后学习怎么在开发板上移植最基础的Linux操作系统(MP157还多了一个TF-A这个安全启动的流程,然后就是常规的uboot,然后Linux内核,最后加上一个根文件系统就可以);之后就是学习Linux里面最基础的三类驱动,字符设备、块设备以及网络设备三个驱动巨头的学习。
字符设备用的最多,在设备树里面添加然后在自己的驱动文件里面加对应操作,这里比如GPIO输入输出,PWM,IIC和SPI通讯的外设,音频还有USB以及CAN都是字符设备驱动;然后是块设备驱动,这里主要就是一些RAM的驱动;最后是网络设备,比如WIFI啊4G啊这些外设怎么驱动;最后还学一下IIO驱动(就是ADC和DAC)。
这里我感觉其实跟单片机学习是一样的,只不过多了一步学习怎么移植操作系统。
Linux应用
这里就是相当于你外设驱动起来了,那得去用这个外设完成一些工作内容吧,这就是Linux应用要学习的知识。
这里首先是学习应用编程的一些基础知识,进程线程,文件I/O,文件属性等等;然后就是各种应用,对IO口的操作,LCD的显示以及触摸屏使用,PWM应用,摄像头的v4l2协议,CAN还有网络的一些应用,串口使用,以及音频应用。
这里的话学的会比较多,要花时间多看看,毕竟找工作linux应用岗位应该会更多一点,项目实际应用的话也更多是这一部分的内容。
之后再看了看QT的知识,这个就是做一个前端界面,在LCD上显示就好,熟悉一下API就可以了。
MP157特有
开发板上除了A7核,还有一个M4的核,可以做单片机的开发,多核之间也可以通讯,可以说是我下一步想学习的内容,准备把Linux和单片机结合在一起,但估计时间来不及了。
这里也可以学习该开发板的特有的裸机开发的工程。
第四块开发板——RK3568
这个是因为之前有做过一部分的视觉内容,而这个芯片以及开发板已经可以实现边缘嵌入式AI,所以买来想玩一下,时间来不及了,后面可能就当玩具自己玩玩。学习的话买这个来学视觉的内容我感觉没啥意义,不如直接自己在PC稿,配一个好一点显卡的电脑是王道,而且视觉现在已经很卷了,很难就业。
总结
以上就是到目前为止的嵌入式相关的学习经验,大家可以参考着看。
之后的话有时间想把自己想的MP157的项目抽时间把他做出来,目前的话只做了第一步就是摄像头的驱动自己搭好了,但之后想移植Ubuntu到开发板上目前有点卡住了,时间也不够了,之后从这一部分开始更新,希望能做出来,敬请期待……