说说嵌入式系统(3)——怎样学好嵌入式系统

时间:2022-03-27 22:32:38

【转自】http://blog.sina.com.cn/s/blog_9ed067ad0100yob1.html

许多话你天天听,都听腻了,但它说的确实是对的。“理论联系实际”就是这样一句话。大家都知道它的意思,但真正能做到的人并不多。嵌入式系统的应用性极强,它与实际生产生活相联系的紧密程度超乎想象。学习嵌入式系统,“理论联系实际”是对的,不过这句话把“理论”两个字放在前面,对学习嵌入式系统来说似乎不妥,个人感觉“实践”更重要。
    我常把学习嵌入式系统的方法分成4类:
    第一种是看教科书学。这是许多在校生学习相关嵌入式课程的一般方法。老师在上面讲,你在下面听,再布置点作业外加几个验证性实验。如果这些都做的很好,通常可以考个高分,但是考完就忘了,真正毕业后去干这一行,还得从头来。大学里这么做有它的合理性,毕竟谁也不知道你毕业后到底要做哪一行,课程那么多,时间和教学资源都有限,不可能每一门课都要求你精而通之。经过这样的学习,可以达到入门级,以后做这一行至少不会发憷了。
    第二种是用仿真软件学。有些人学了教科书后开始对嵌入式系统有兴趣了,但是经济实力有限,就用仿真软件模拟嵌入式系统。尤其是代码的软件仿真,更是简单易行。许多嵌入式系统的编程软件本身都有仿真功能,例如Keil,如果你仿真的程序不牵扯硬件,在Keil上直接执行都可以。近几年流行的Proteus EDA软件,可以实现从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计与仿真。Proteus支持8051、PIC、AVR、ARM、8086、MSP430等处理器模型,编译支持IAR、Keil等常用软件。我的理解,“仿真”的意思是“仿佛是真的”,你千万别把它当成是真的,尤其是硬件,嵌入式系统的实际工作环境千变万化,仿真软件很难把各种情况都模拟出来,如果真想从事这个行业,仅靠仿真软件来学习是远远不够的。
    第三种是利用商业开发板学习。如果你经济上可以承受,这也是一种很好的学习方法。商业开发板一般都提供详细的硬件电路图和PCB图,完整的源代码,系统的各种功能应有尽有。通过学习,你可以全面掌握所学嵌入式芯片的各种功能,而且有了这个巨人的肩膀,之后想开发实际的产品非常快,好多硬件设计和软件代码都可以直接拿过来用,大大加快了产品的开发和上市时间。不过好的开发板都价格不菲,便宜的其技术水平又值得怀疑,这需要根据个人情况斟酌。
    第四种是自己动手制作嵌入式模块学习。对于初学者来说,这有些难度。但任何事情都有它的两面性,自己动手一开始可能很难,但是只要过了第一道坎,后面就是阳光大道,因为你的起点就是产品级的。你学习的各种知识和经验都经过了实践的检验,这些第一手的知识和经验将牢牢扎根于你的大脑中,成为以后漫长行业生涯中可以慢慢享用的财富。自己动手有许多方式,你可以用一个硬纸板做底板自己打眼连线,可以买面包板动手插接线,可以买覆铜底板自己布线腐蚀,当然也可以直接做成PCB拿去厂家加工。自己动手,你会遇到各种各样的情况,常常陷入“山穷水尽疑无路”的困境,但更多的是“柳暗花明又一村”的畅快。
    无论哪种方法,学习的态度都应该是开放的,尤其是前人的经验和教训要概括吸收,要擅于站在巨人的肩膀上。无论如何,只要有兴趣,只要抱定一颗坚定的心,结合适当的方法,你就会成为嵌入式系统行业的专家,实现自己的人生价值,并获得丰厚的回报。

 

1、网上51单片机开发板成千上百种,但是种种不离其宗,无外乎多样的外设、精美的外观,然而实际用途差不多,都是入门51单片机。在这里不建议购买开发板,可以自己看懂单片机最小系统后动手做一个,无外乎复位、电源、下载(一般串口)电路。这样既可以提升动手能力,还可以为自己准备一些电子工具,为日后设计开发铺路,还可以熟悉电子元器件的型号、参数等。做好之后,编程调试仿真也可以提升编程能力。
2、先学好单片机,再学STM32,如果两样一起学,可能会花去很多时间,并且收获甚微。学习过程要专一,你觉得你能驾驭单片机了就接触STM32,毕竟ARM系列的就要学习嵌入式了,裸跑就当做单片机用,没体现优势来。
3、51单片机也好,STM32Cortex-M3)也罢,现在Proteus最新版支持Cortex-M3了,所以你都很有必要安装Proteus+keil 4了,不用购买硬件设备就可以利用PC平台学习单片机等的电路、程序开发设计以及仿真调试等。
希望帮到你。
1、你先做个最小系统试试,等你做完了就懂了。你要学习其他外设的通信、控制,那就得再接着买外设,然后外设的问题又来了,你要自己做外设呢,还是买现成的模块呢?自己做吧,测试模块的正确运行就好很久了,买现成的吧,玩一两次就扔一边了。照我说的的,你先做个最小系统、以及一排led八个等。
2、但是仿真就不一样了,你爱设计什么模块就在Proteus上设计就可以了,其实弄懂单片机和外设之间的控制原理才是最重要的,编程才是重要的,你懂了原理,爱做什么就做什么。


51单片机核心, 采用8bit, CISC架构, 来自INTEL.
STM32核心, 采用32bit, RISC架构, 来自ARM.
 
=================================================================
知乎上的一个问答:https://www.zhihu.com/question/22684212
先说一下我个人的能力背景
============
PHP开发多年,了解C语言,《C Primer Plus》认真的看完了,比较短的C语言代码能够读完并理解,没有用C写过成品。汇编不会,学了十来天的51单片机,郭天祥的书,中断部分看完第一种中断了。自己能用C写一个计时器,几个小时内基本上没有误差,没试过更长的。

说一下我学单片机的原因
============
个人兴趣,希望能做一些好玩的东西,例如自平衡的小车或者飞行器,能拍摄,无线传输,能通过红外线或者超声波之类的东西感应地形,wifi定位之类的功能。

我的疑问
============
我在一个电子方面的群里,一个前辈对我说现在51已经落后了,建议我从STM32开始,成本相差不多但是性能却高了很多。我不知道前辈这么说的对不对,不知道大家的意见呢?

额外的疑问
============
1.如果要是学STM32的话,有什么好的板子或者教程推荐么?
2.我对数电模电什么的都不了解,如果要达到自己画板,找人做PCB(是这样吧?我是听说的PCB要找人做),然后焊原件,编程实现功能的话,都需要学什么内容,有什么书推荐么?(我最近在看《编码》感觉这书很不错,不知道看完它的话,能不能算入个门?)
3.不知道达到我2.里面说的那样的水平的话,通常来讲要多久?如果达到这样的水平的话,大概的收入是什么样子的?因为真心觉得这东西好玩,要是能收入也可以和现在相比的话,等熟练了之后弄不好会考虑转行的。
==============================
 
作者:Jexbat 链接:https://www.zhihu.com/question/22684212/answer/22254990 来源:知乎 著作权归作者所有,转载请联系作者获得授权。
在这个行业开发也有两三年了,我来谈谈自己的看法吧→_→(高手勿喷) 这个行业主要分工就两个方面:硬件开发和软件开发,但是硬件软件基本上是没法分家的,因为软件是基于硬件开发的,硬件是基于软件设计的。所以要有完美的产出,就要有硬件和软件都懂的工程师。 ================ 硬件开发: 硬件开发主要就是根据需求设计硬件电路,画原理图、PCB布线啥的,主要软件可以看这个链接 Comparison of EDA software,好像也不是很全,我所知的市面上用的多的就是Altium Designer 、Protel 99SE、MentorGraphics PADS、Cadence、Eagle PCB等(排名不分先后),当然PCB设计水平高的人也能用低档次的软件设置高水平的PCB,主要还是看自己的技能。 硬件设计主要就是模电和数电了,当然数电比模电简单多了,数电方面根本不需你去设计什么电路,一是一些芯片的datasheet已经给出了应用电路图;二是互联网这么发达,你想过的电路别人基本上都设计过,照搬就行了。模电方面大部分也都是经验电路,自己设计需要好好啃啃模电的书了。当然硬件设计离不开画PCB了,复杂的PCB设计还是挺有难度的,最重要的是不要空想,要自己画,也就是烧钱了,一个10×10cm的PCB板子打样是50-100RMB,里面会有5-10片的样子,具体打样的地方不一样,数量也会不一样,打样淘宝或者嘉利创都不错的。打样回来焊接芯片,又要学习焊接了,学焊接也是个烧钱的路,所以这些最好在学校里就学会,一片芯片十几到几十块,焊错了、脚摔折了,说扔就扔,板子也是,设计错了,拿回来都不要拆包了直接扔垃圾桶了.... ============ 软件开发: 嵌入式软件开发需要掌握的东西也太多了,至少我学到现在还有好多东西没接触、不熟悉。当初学的时候一上来当然用IDE咯,就是那些KEIL、IAR等等,当初想这些公司真太好了,开发这么一好软件,so easy啊.....从此踏上不归路啊....越往后,等你写的代码越来越多...你就会出现那种莫名其妙的bug,完全摸不着头脑的bug,这个时候你就会怀疑是不是你软件的问题(硬件工程师是这么想的),还是硬件的问题(软件工程师也是这么想的),等你确定是软件问题的时候,你又不的不回到开始,把代码的编译->汇编->链接,把MCU怎么从上电到进入main函数从新学一遍.....当初没人告诉我这里面全是坑啊....所以你又得装个arm-none-eabi-gcc,把这些一个个试过来.....而且这些IDE的编辑器完全就是十几年前的产物,什么语法纠正、多行编辑一概没有,所以现在都是sublime text 2写代码,然后切换到这些IDE编译...软件开发不仅仅是学好C语言那么简单,汇编也要会,如果接触到CPLD、FPGA,还要学VHDL、Verilog(当然FPGA这些硬件开发我也分不清到底是硬件开发还是软件开发)....后续还有,等从你会点LED了,到开发裸机的程序基本没问题了,后续操作系统又来了....又一大坑.....你又会纠结接下来学哪个RTOS啊,还是直接上linux啊......所以科技行业的从业者必须不断学习啊.... ================ 看看你的问题吧: 你说要不要学51,因为你不知道学51学的是什么,你要学的是底层的东西,底层的东西什么芯片都能学.....性能什么的没什么好比的,只是说最适合该产品的芯片是最好的...当初一学弟拼性能,从51开发板、STM32、S3C2440一路升级到Cortex-A8,然后就没有然后了..... 你要说光会画个PCB,会编程,开发一些基本的功能,你之前也是IT行业的,对你来说应该很快就会入门(当然入门归入门) 确实能做自己想做的电子小玩意一直是始终坚守在这个行业的动力啊,不像纯软件的只能对着电脑玩啊..弄不好爸妈还说一天到晚玩电脑没出息啊... 收入方面都是科技行业不会太低的....当然自己创业是最好的啦...
=================================
作者:Tony Ho 链接:https://www.zhihu.com/question/22684212/answer/22254560 来源:知乎 著作权归作者所有,转载请联系作者获得授权。
一个个回答你的问题。 回答你的疑问 ============
一个前辈对我说现在51已经落后了,建议我从STM32开始,成本相差不多但是性能却高了很多。我不知道前辈这么说的对不对,不知道大家的意见呢?
先来一颗定心丸“ 不管51有没有落后,学习51都是值得的,个人认为不会浪费你的时间和精力”,理由如下:
  1. 从外设上面看,都是类似或者一样的。 通讯方面的I²C/SPI/UART、模数AD/DA、Timer/Interrupt/PWM/DMA/USB/Ethnet/I²S/Can/PulseCounter等。这些东西在增强型51上面大部分都有(请自行搜索我们熟知的“伟大的”STC芯片Datasheet),STM32自然也有(同样,自行搜索一个STM32F103系列芯片的Datasheet,下面有附图1), STM32上面的这些集成外设有可能功能较为强大,但是简单些的51外设学起来会更快(门槛较低嘛),同时学东西本来就是循序渐进的,对比51的外设操作STM32/ARM的无非就是多几个寄存器和功能而已,例如有可能有脉冲累加器PulseCounter还有脉冲捕捉功能。51简单,学习51恰恰可以让初学者快速上手,这个对于初学者才是关键。
  2. 从学习编码的角度来看。ST公司给STM32提供了库,因此,我们我们可以很方便的来设置一个寄存器和操作外设,当然也可以不使用库自己手动读写寄存器,此时就和51一样了。
  3. 成本。学习成本和金钱成本。金钱成本:没错对于个人而言,买片低端的STM32和增强型的51芯片价格差不多。但是既然你已经有了51的学习板子和资料(我猜),那么就先好好使用它学完基础再说吧。对于企业开发产品而言,价格的决定因素太多,不做评价。学习成本:同样是中国特色和谐版的Keil/MDK/Gcc软件上面有什么区别呢?下载同样可以使用串口ISP,有什么区别呢?但是STM32可以使用同样是中国特色的和谐版Jlink来调试却远比一次次的串口下载看效果来得有效。当然51也有对应的调试器,但是我们一般不会去买。
作者:Tony Ho 链接:https://www.zhihu.com/question/22684212/answer/22254560 来源:知乎 著作权归作者所有,转载请联系作者获得授权。
因此总结一下我的看法: 既然学习51一段时间了,那么继续学习51的其他基础,然后转到STM32,因为用STM32来做飞控控制器更佳。 回答额外的疑问 ============
1.如果要是学STM32的话,有什么好的板子或者教程推荐么?
STM32硬件有什么太多区别嘛?贵点的就多个什么NorFlash、网卡等外设外,没有什么区别。管它什么神舟几号、安富莱、野火、百为、奋斗…… 按需(外设什么的)选择吧。 提供的教程和配套程序很关键:我做毕设的时候买了个特贵的STM32板子,然后我需要用高版本的μCGUI/emWin,结果就是我自己移植了μCOSII和μCGUI,没错,STM32的东东大多类似,但是如果你赶时间,那就不一样了。
2.我对数电模电什么的都不了解,如果要达到自己画板,找人做PCB(是这样吧?我是听说的PCB要找人做),然后焊原件,编程实现功能的话,都需要学什么内容,有什么书推荐么?(我最近在看《编码》感觉这书很不错,不知道看完它的话,能不能算入个门?)
  1. 数电模电:那个郭天祥的视频教程里面,会讲AD/DA,译码器什么的,算是无痛入门。因此学到那些地方的时候看看数电模电对应的章节就够了。刚刚翻了下以前买的但是没有看过的《编码》,觉得足够了。遇到没有学过的东西再看数电模电吧。如果觉得大学的数电模电看得不舒服,那就买本专科院校的数电模电书,肯定管用,哈哈。
  2. PCB:顺手将郭天祥/于振南的Altium Designer PCB设计的视频也下载了吧,跟着他学会很快入门的,当然郭同学讲得很细致因此特别慢,其中某些地方,郭天祥也是现学现用,比较有意思。想来我还是得感谢他。陪我度过的大学低年级。
  3. 焊东西:这个我真的没有什么可以教的,优酷视频什么的,杜洋应该最擅长这类的教学,哈哈希望他不会介意我这么说。搜一搜吧。看来除了要感谢我的实验室老师和学长外,还应该感谢杜洋。
3.不知道达到我2.里面说的那样的水平的话,通常来讲要多久?如果达到这样的水平的话,大概的收入是什么样子的?因为真心觉得这东西好玩,要是能收入也可以和现在相比的话,等熟练了之后弄不好会考虑转行的。
时间:我觉得很快(原谅我打太极),也许就是一个学期的时间,也许是2个月,也许是1个月或者一年,我不知道。这个需要看你在这方面可以付出的时间有多少。但是当你决定学下去的时候,就很快了。就做个飞控什么的而已很快的,网上可以参考的太多了。 收入:不知道。我学自动化的,按理就是搞控制的,但是似乎大些/好些的控制公司只要研究僧,我无名小菜末流本科生似乎难以进去。当然这个和我没有学好现代控制理论/最优解之类的专业课有极大关系。因此如果仅仅会简单的PID的话,我真的不知道,这个只能看情况,学长让我去他们工控公司给的较多,但是我没有去。想来还得感谢学长。或许有一款查工资的软件可以帮助你。 最后,祝你玩得开心,学得开心。 对啦,学习STM32的时候,如果没有基础的话,不要买《STM32权威指南》。不管有没有基础也不要买那些照抄STM32库的书籍。
===================================
作者:向晨 链接:https://www.zhihu.com/question/22684212/answer/141427226 来源:知乎 著作权归作者所有,转载请联系作者获得授权。
这个问题我有资格说一句吧! 1. 学习51单片机的目的不是为了工作中为了使用51,而是为了培养直接调试寄存器与软硬件接口bug的能力。 2. 51单片机没有sdk的支持和过多的软件封装,能够直接把外设寄存器功能暴露在你面前,让你真正体验调寄存器的感觉。。 3. 不用花太多时间专研专精所谓51单片机,但是还是应该通过一两个中等规模的项目,来培养通过调寄存器和数字电路交互,debug的能力,找到调寄存器的感觉,这种感觉很重要。 4.搞嵌入式有时候就像NBA篮球赛,常规时间得分都是写软件,调用api,设计数据结构。可能调寄存器的功夫大部分时间都用不上。 5. 但是到了最后几秒的绝杀时刻,比分僵持(要到交付日期了,但是底层还有未知bug,不清楚到底是软件还是硬件bug),这个时候,抛开sdk和api封装,直接调试寄存器诊断软硬件bug的功力就体现了,这就像投绝杀球一样,直接决定比赛胜负(项目成败)。。 6. 绝杀球不是每场比赛都有机会投,一场比赛大部分时间都不要投绝杀球,但是你们觉得投绝杀球的能力(直接调试寄存器,诊断软硬件bug的能力)要不要有,要不要纳入你的训练范围。 7. 直接调试寄存器,诊断软硬件bug的能力,你们认为应该通过什么方式来培养,stm32 A8/A9这么复杂的datasheet寄存器手册,得花多少时间培养这样调寄存器的感觉呢?
===================================
作者:王天祺 链接:https://www.zhihu.com/question/22684212/answer/32175560 来源:知乎 著作权归作者所有,转载请联系作者获得授权。
非常同意 Kaiser Li。 电子这一行,最基本的就是模电、数电、微机原理这三门课,这是打地基建骨骼的功夫,想在这行干下去,这个是绕不开的东西。 之前给实验室的小盆友们搞培训,自己也接触过外面各色培训机构教出来的学生,不少都对大学里面还在教数电、教8086表示鄙视,觉得太老套。大家都觉得你看我用STM,我用Cortex-M,我们用的芯片紧跟潮流高大上,我能做wifi,我能搞红外,我们的培训机构教出来的才是真正的人才。 可是呢,所谓高大上的wifi啦,智能车啦绝大多数都是现成的模块拖来用罢了,一通培训下来,你只不过熟悉了一种IDE,记住了一两款芯片的名字,你心目中EE不过是在编辑器上敲几行代码,点个运行,不过是在EDA工具里连连线罢了,这么简单的东西学校里居然搞那么复杂,听得我一头雾水!这都是教育的错,这都是*问题blabla!然后你自以为搞定了一个多NB的工程,培训机构也乐得多卖了块板子多赚了份学费。然后遇到一个以前完全没人涉足过的工程时,没有现成的IDE,没有现成的库,或者老板让你自己去选择芯片。最后你只能茫然地去论坛上问,我要做个xxx,求各位大神指点。 以上是私货的吐槽,主要是看到一些干了多年的同学还不知道为啥访存会有延迟,不知道什么是cache,不知道电路板上为啥要走差分线,为这些人舍本逐末感到可惜。书归正传,仔细看一遍这三门课,你就能明白所有的数字电路最基本的原理,知道51、STM、Cortex-M这些处理器的共性,知道CPU、FPGA、ASIC这些东西的区别,遇到实际的问题才好针对性地去挑选性能、成本、开发周期上折中的解决方案。当然,指望学一遍就精通这一切也不现实,但是心中有这些概念还是至关重要的。在这之后才是参照着各家的芯片手册,找一块板子,去做一个实际的项目让这些飘在天上的理论落地。