第一次嵌入式系统编程,使用哪种微控制器有关吗?

37
我有几年桌面和网络编程经验,现在想转向嵌入式系统编程。在询问了初步问题后,我想知道应该从哪个硬件/软件IDE开始...

或者...无所谓吗?

哪个开发平台最容易学习和编程(考虑到IDE的易用性)?

如果出现问题,哪个平台最容易调试?

我的目标是了解“IO端口如何工作,内存限制/要求(包括可能的分页),中断服务例程。”。学习一个将来会使用的平台更好,还是高级概念应该适用于大多数微控制器?

谢谢!

更新:这个dev kit作为起点如何? 评论?建议?


1
建议使用“嵌入式”而不是编程——这个网站上几乎所有的问题都与编程有关。 - Jason S
7
Arduino不是微控制器,它是一个搭载Atmel AVR微控制器的开发板品牌。Atmel不是微控制器,而是一家公司,其产品包括AVR、AVR32和ARM等多种微控制器架构。同样,Freescale也是一家公司,有许多不同的架构,包括ARM、PowerPC和ColdFire。因此,您提出的两个建议没有指定架构,而一个是重复的。 - Clifford
1
@Henry,我认为EKI-LM3S3748没有任何问题。它使用FTDI驱动程序通过USB模拟JTAG。因此,您不必购买编程器。109美元对于您所获得的东西来说似乎是一个合理的价格。此外,请务必阅读“Cortex-M3低成本工具选择指南”(请参见我的答案中的链接)。 - Judge Maygarden
2
非常感谢您,评委,您的亚马逊愿望清单在哪里? :) - Henry
不要使用Arduino尝试学习低级细节,它并不是为此而设计的。使用任何有良好文档记录的评估板,根据我的经验,CodeFire是一个不错的选择。 - W.Sun
显示剩余3条评论
14个回答

19

个人建议使用基于ARM Cortex-M3的微控制器。高功率的ARM内核极受欢迎,而这些低功率版本在仍然充斥着专有8/16位内核的领域可能会很受欢迎。这里是一篇关于该主题的最新文章:The ARM Cortex-M3 and the convergence of the MCU market

Arduino非常适合爱好者。 Atmel的外设库在处理器类型之间非常普遍。因此,从AVR转换到ARM后期可以更加顺畅。

我并不是要声称ARM比AVR或其他内核更好。选择商业产品的MCU通常取决于外围设备和价格,其次是现有代码库和开发工具。此外,微控制器通常比台式电脑简单得多。因此,一旦您掌握了它,从一个微控制器转移到另一个微控制器并不难。

如果您对实时操作系统(RTOS)开发感兴趣,请查看FreeRTOS。它是开源的,并包含有关RTOS以及如何实现RTOS的良好介绍。事实上,他们的演示例子甚至针对AVR。


嵌入式系统的开发工具可能非常昂贵。然而,对于更加开放的核心(如ARM和AVR),通常有开源替代品。例如,请参阅WinARMWinAVR项目。

这些工具链基于GCC,因此也可(依我之见,更易于使用)在非Windows平台上使用。如果您熟悉使用GCC,则知道有丰富的“IDE”可适合您的口味,从EMACSvi(我最喜欢的)到Eclipse

商业产品可以节省很多设置方面的麻烦。然而,选择某个产品将取决于您的目标硬件和预算。此外,一些硬件支持直接USB调试,而其他一些可能需要昂贵的JTAG适配器。


其他链接:


低成本Cortex-M3开发板:


新的Arduino将使用ARM Cortex-M3处理器代替AVR微控制器。


谢谢提供链接,确实很有趣,但我担心基于ARM的微控制器的成本。http://beagleboard.org/看起来是个好主意,但所有基于ARM的微控制器/处理器是否都兼容相同的ARM代码?谢谢。 - Henry
7
Beagle板使用的是ARM Cortex-A8处理器,与ARM Cortex-M3完全不同。A8的主频超过500MHz,具有MMU、FPU功能,Beagle板还配备了几百兆字节的内存和一个SD卡槽,可以扩展GB级别的闪存,并且专门设计运行像Linux这样的操作系统。而M3只能达到72MHz的主频,拥有数十KB的内存和数百KB的闪存,是一个“真正”的嵌入式系统,具有性能方面的限制,需要您进行相关学习。 - KeyserSoze
@Henry 为什么不明确你的预算和所需功能(USB,LCD显示器,NAND闪存等),然后人们可以提出详细的建议?我有Atmel和ST Cortex-M3开发板,价格在200美元至300美元左右,如果我没记错的话。还有许多其他供应商,例如NXP、Toshiba、TI等。 - Judge Maygarden
我还不确定需要哪些功能,预算<= $200就可以了。我只是想在C/C++中进行一些嵌入式编程,并与传感器、电机和LCD显示屏一起工作。谢谢! - Henry
1
@dopplefish,我在STM32和SAM3U目标上使用FreeRTOS的经验非常好,但我习惯于在没有操作系统的情况下运行。建议在AVR或Cortex-M3上使用Linux并不是很实际。 - Judge Maygarden
显示剩余10条评论

5

考虑到您已经有编程经验,您可能想考虑购买Arduino并擦除固件,使用AVR Studio + WinAVR进行自己的项目。Arduino为您提供了一个很好的起点,以了解电子方面的知识。删除Arduino引导程序将使您更好地访问Atmel的内部。

为了实现您设定的目标,我还建议深入探索台式计算机,通过x86编程更加深入地了解它。例如,您可以构建一个x86操作系统内核。


清除 FirmWare = 解Arduino?酷,从未想过。您建议先学习 x86 中的这些概念是因为……开发周期更短,更容易调试吗?请告诉我如何学习 C 内核编程以及如何将这些知识应用于微控制器编程。我认为它们是完全不同的主题..谢谢。 - Henry
主要是因为x86非常好文档化。这也更容易看到你在做什么。而且你已经有了一个x86电脑。许多与微控制器相关的概念性内容也适用于桌面计算机上的低级内容。你可以在这里阅读一些详细信息:http://www.osdever.net/bkerndev/index.php?the_id=90,这里还有一个“烹饪风格”的教程:http://www.jamesmolloy.co.uk/tutorial_html/index.html。 - Brian
谢谢你的建议,但我想我应该直接用C语言编程mcu。你会推荐哪个AVR开发套件?我想尝试使用AVR Studio / WinAVR控制一些LED / 控制器、扬声器、电机或其他有趣的东西。谢谢。 - Henry
如果您了解一些基本的电子知识,甚至不需要AVR开发套件,它非常容易在面包板上设置。然后只需要获得一个编程器即可。 - starblue

4
ARM是最广泛使用的嵌入式架构,覆盖了来自多个供应商和各种成本范围的大量设备。尽管如此,ARM7、9、11和Cortex设备之间存在显着差异,特别是Cortex。然而,如果您的目标是专业从事嵌入式系统开发,具有ARM经验将对您有很大帮助。
8位架构通常更易于使用,但在内存容量和核心速度方面通常非常有限。此外,由于它们易于使用,因此8位技能相对容易获得,因此对于潜在雇主来说,这不是一项吸引人的技能,因为可以通过内部或经验较少(因此费用较低)的员工轻松实现。
然而,如果这只是一项爱好而非职业,零部件、板子和工具的低成本以及易用性可能使得 8 位变得有吸引力。我建议使用 AVR,因为它支持免费的 avr-gcc 工具链。一些 8 位目标由另一个开源的 C 编译器 SDCC 支持。我相信 Zilog 会提供他们的 Z8 编译器免费使用,但你可能需要支付调试硬件的费用(尽管这相对便宜)。许多商业工具供应商提供代码大小有限的工具版本进行评估和非商业使用,但要注意大多数调试器需要专门的硬件,这可能很昂贵,尽管在某些情况下,如果只需要基本功能和低速度,则可以自行构建。

不管你选择什么,务必看看 www.embedded.com。如果你选择 ARM,在商业项目中我已经成功地使用过 WinARM,尽管它并不是为舒适而建!这里有一份很棒的 ARM 资源列表 here。对于 AVR,一定要查看 www.avrfreaks.net

我只推荐Microchip PIC零部件(至少是低端产品)用于成本极为敏感的项目,其中外设组合与应用非常匹配;不适用于学习嵌入式系统。PIC更像是一个品牌而不是一种架构,各个系列PIC12、16、18、24和PIC32彼此之间差异很大,因此在其中学习并不能保证你能熟练使用其他系列——通常你甚至需要购买新工具!话虽如此,基于PIC24架构的dsPIC可能是一个不错的选择,如果你想同时获得一些简单的DSP经验。

在所有情况下,都要检查编译器的可用性(特别是是否需要C++支持)和成本,以及调试器硬件要求,因为这些通常是您开发套件中最昂贵的部分,而板子和零部件通常是最便宜的部分。


AVR在商业产品中有使用吗?还是它主要被业余爱好者使用? - Henry
什么是适用于ARM Cortex-M3的好的IDE / Toolchain?我需要硬件调试器才能开始吗?它们有什么作用?谢谢。 - Henry
1
没有芯片供应商能够仅服务于业余爱好者市场而生存。AVR在商业产品中被广泛使用。 - Clifford
1
AVR和PIC通常在8位微控制器市场份额上争夺头把交椅,因此两者都被广泛商业使用。2008年Microchip曾提出收购Atmel的提议,但Atmel回应称“绝不可能”。 - Mark
1
各种8位设备,包括AVR在内,广泛应用于商业产品中,但这些设备往往是简单、低端或深度嵌入式设备,例如玩具、加热控制器、家用电器等。因此,您可能不知道它们,但它们可能构成了绝大多数应用程序。Atmel声称他们拥有“8位Flash微控制器”市场的30%。Microchip和Atmel曾经声称自己是第一名。但无论如何,与低端PIC相比,AVR是更好的技术设计,其指令集更适合C代码生成。 - Clifford

2
不,如果你想学习如何编程嵌入式设备,那么这并不重要。但是你需要知道从哪里开始,接下来该做什么。因为市面上有许多微控制器可供选择,你不知道该选哪一个。所以最好在开始之前先有一张路线图。
依我看,你应该从任何AVR板开始(atmega 328P - arduino板或AVR板),然后转向ARM微控制器-首先做ARM CORTEX TDMI,然后转向ARM cortex M3板。这将为您提供总体视图,然后您可以根据正在进行的项目类型和需求选择任何板子。

2

2

这是一个比较难回答的问题,因为你理想的答案很大程度上取决于你想学习什么。

如果你的目标只是深入了解计算机系统内部运作,我几乎建议你放弃嵌入式路线,选择一本关于编写Linux内核模块的书籍。编写一个简单的程序,从SMbus读取温度传感器等。

如果你想进入高级(手机等)嵌入式应用开发领域,下载Android SDK,你可以在Eclipse中使用Java编码,甚至有一个不错的模拟器。

如果你想进入“真正”的微控制器领域,并且真正地研究低层系统编程,我建议你从非常简单的架构开始,比如AVR或PIC,没有MMU的东西。

进入中间领域,例如带有MMU和某种操作系统(无论是Linux还是其他),将会是一个巨大的挑战,因为如果你没有系统编程和硬件接口方面的背景,除了编写非常简单的应用程序(例如计数按钮按下次数等),其他任何事情都会非常困难。


旁边的问题,AVR的复杂度级别是否类似于Freescale HC08/HC12?谢谢。 - Henry
像ATmega328(Arduino)这样的AVR是一种8位MCU,并且在设计/功能上类似于HC08,两者都类似于低端PIC18或PIC16部件。 HC12是一种16位MCU,并且最类似于PIC24、dsPIC或AVR XMEGA。 我相信所有这些MCU都是RISC设计,并使用哈佛架构。就我个人而言,对MCU编程的第一次介绍是学习68HC11核心上的汇编语言,这是HC12的前身。从那里,我转向了PIC,后来又转向了更复杂的核心。 - Mark

1

这很重要,你需要从简单的系统开始逐渐获得经验。请注意,我所说的简单并不意味着功能较弱,而是指易用性、设置等方面的简便性。基于这个原则,我建议使用以下产品(我对任何产品均没有特别利益,只是认为它们最好):

我已经开始使用其中之一(MBED开发板)。对我来说,最大的卖点是我可以在C或C ++中编码,通过USB进行直接连接以及流畅的在线开发环境(完全不需要本地工具安装!)。

http://mbed.org/

打开盒子五分钟后,我成功运行了一个简单的闪烁程序(嵌入式世界的“hello world”),代码如下:
#include "mbed.h"

DigitalOut myled(LED1);

int main()
{
    while(1)
    {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}

就是这样!以上就是完整的程序了!

它基于ARM Cortex M3,适用于嵌入式项目(100MHz,256K闪存和32K RAM),速度快且内存充足。在线开发工具有非常好的库和大量示例,并且有一个非常活跃的论坛。对于连接设备到MBED等方面也有很多帮助。

尽管我有丰富的嵌入式系统经验(ARM 7/9、Renases M8/16/32、Coldfire、Zilog、PIC等),但我仍然发现这是一个令人耳目一新且易于掌握的系统,同时具有强大的功能。

最初我在一个基本的面包板上试用了它,然后从这些家伙那里买了一个基础板:http://www.embeddedartists.com/products/lpcxpresso/xpr_base.php?PHPSESSID=lj20urpsh9isa0c8ddcfmmn207。这个板子有一堆 I/O 设备(包括一个微型 OLED 和一个 3 轴加速计)。从同一网站我还购买了一个 LCPExpresso 处理器板,价格便宜,功耗/内存比 MBED 小,但非常适合小型任务(仍然能够击败 PIC/Atmega 处理器)。基础板支持 LCPExpresso 和 MBED。购买 LCPExpress 处理器板还使我获得附带的 JTAG 调试器和离线开发环境(Code Red 的 GCC/Eclipse 开发套件)。这比在线 MBED 开发环境复杂得多,但是在你掌握 MBED 后,这是一个逻辑上的进步。

关于我的原始观点,需要注意的是 MBED 控制器比 LPCExpresso 控制器功能更强大,但使用和学习起来更简单。


1

我使用微芯片PIC,这是我开始使用的,主要是因为《邪恶天才的123个微控制器项目》一书。我在学校修了一门微处理器课程,学到了一些关于中断和定时等方面的知识,这对我的微控制器编程有很大帮助。我想其他程序员可能会更好/更容易,但是对于只需要36美元的PicKit1,我太过吝啬去买另一个……而且坦率地说,如果不使用它们,我不知道它们是否更容易/更好,我喜欢我的并且会在每一个机会推荐它,最终我终于能够通过ICSP从板外编程另一个芯片。我不知道其他程序员是如何做到的,但对我来说,最好的事情就是5线接口,然后你就可以编程了。这是无法用棒子打败的……


1

我只用过其中一个。

Freescale 是一款很好的芯片。我多年来一直为小项目使用 HC-something 芯片。唯一需要注意的是,我不会碰 CodeWarrier 嵌入式开发环境。你可以找到一些免费的 C 编译器和汇编器(我不记得我上次使用的叫什么了),它们可以很好地完成工作。Codewarrior 太大且混乱了,无论我对芯片架构和 C 编程有多少了解,它似乎总是使事情变得更困难。如果你曾经在 Mac 上使用 Codewarrior 并认为 CW 很棒,那就完全不一样了。CW 嵌入式看起来有点相似,但它运行方式却非常不同,而且效果不佳。

命令行编译器通常是可以的。那些能够支付高额开发环境费用的专业人士肯定能做得更好,但没有这些也比在 1990 年为台式电脑编写汇编代码要好得多,我们当时还是能很好地完成工作。:-)


根据我的经验,专业人士都希望能够放弃那些拥有糟糕编辑器和文件管理功能的高价集成开发环境(IDE),转而使用一些真正的工具,例如“命令行编译器”。 :) - XTL

1

无论你做什么,一定要确保你有一个好的开发环境。虽然我喜欢Microchip的微控制器,但我不是他们开发工具的粉丝(我被MPLAB + ICD弄疼了太多次,太麻烦和功能失调)。TI的2800系列DSP非常好,并且有一个基于Eclipse的C++开发环境,你可以花不到100美元进入(获取其中一个“controlCARD”实验套件,如28335)——调试器通信链接非常稳定;IDE很好,尽管我偶尔会崩溃。

在那里有更好的IC和板子;我对嵌入式微控制器领域不是很熟悉,但我对质量差的IDE和另一个软件工具链没有耐心,我必须想办法绕过所有的错误。


我赞同这一点。好的开发工具可以起到至关重要的作用,甚至比微控制器的选择更重要。 - semaj
是的,这就是为什么我在芯片旁边使用IDE提出这个问题的原因... :) - Henry
关于PIC ICD的情况,如果你计划要对电路进行任何修改或者甚至让电子元件暴露在外,最好备一个备用的PIC编程器。我曾经烧了不少这种编程器,因为它们没有很好的保护机制来防止高电压和短路。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接