Blogs

单片机简介-入门

迈克·席尔瓦2013年8月20日12条评论

欢迎使用本微控制器编程入门教程系列。如果您希望学习微控制器的嵌入式编程基础知识(以及一些嵌入式硬件设计),希望这些教程对您的发展有所帮助。这些是我在这里的第一篇文章,我正在撰写本教程系列,因为多年来,我看到无数新手问同样的问题,绊倒了同样的绊脚石,而且我认为我可能可以提出一些有用的答案这些问题,并避免出现跳闸点。

快速链接

目标观众

本教程系列适用于希望学习微控制器编程基础知识或希望在此类编程知识方面填补空白的学生,业余爱好者,程序员和硬件设计人员。尽管将讨论微控制器特别感兴趣的编程技术,但本教程一般不会教您编程。尽管将说明使用微控制器时通常面临的硬件问题,但本教程也不会教您硬件设计。我希望它将做的是帮助新手了解微控制器(μC)是什么,通常具有什么功能以及如何使用这些功能。它将从一开始就通过如何在μC上发现的各种功能和外设(例如中断,计时器/计数器,UART,SPI,I2C,ADC,DAC,PWM,看门狗等。 它还将检查常见主题,例如反跳输入,滤波ADC值,驱动字符LCD和其他类似的杂务。

本文以PDF格式提供,便于打印

警告告示者

每个规则都有 许多例外。这几乎适用于您将在本教程中阅读的所有内容。如果您在此处阅读“ X”,则不要认为它表示“在任何可能的情况下,X永远只有X,并且无例外或无条件。”微控制器设计师提出了许多不同的,有趣的,有时只是更奇怪的做事方式。作为微控制器的用户和程序员,您也可以想出许多不同且有趣的做事方式。以我的经验,给定一个N步程序,可能至少有N平方的方式编写该程序。本教程的目的是尝试为您提供μC编程的坚实基础,而不是成为该领域的综合百科全书。对于每个示例程序,我将尝试以一种简单易懂的方式编写它,并让您在以后的工作中发现自己的聪明技巧。

术语的混淆可能是造成混淆的另一个原因。对于相同或相似的功能,寄存器和配置/状态选项,不同的制造商经常使用不同的术语。在本教程中,有时我会采用μC系列之一使用的术语 在教程中使用,其他时候我将使用非特定术语。我将使用似乎适合每种情况的任何东西。

什么 is Embedded Programming?

嵌入式程序设计是指生活在我们的房屋,汽车,工作场所和社区中的计算机程序,它生活在并运行着许多计算机控制的设备。需要明确的是,所有微控制器编程都是嵌入式编程,但并非所有嵌入式编程都是微控制器编程。关于此的更多内容将在后面讲。有时这些术语可以互换使用,但是本教程系列的重点始终是微控制器。

对于您拥有的每台台式机,笔记本电脑或平板电脑,您可能会有十几个或更多(也许更多)微控制器悄无声息地执行嵌入式任务,而使用这些设备,许多人甚至都没有意识到它们只涉及运行一台微型计算机的微型计算机。程序。但是确实有,那些程序必须编写,这就是为什么世界需要嵌入式程序的原因。微控制器为无数的设备和系统增加了智能,使这些设备和系统能够更好,更快,更安全,更有效,更方便,更有用地运行,并且在许多情况下允许存在无法通过其他方式构建的设备和系统。花一些时间环顾四周,尝试识别μC的工作原理,您将开始了解到40多年来,它们已经变得无处不在。

最重要的是,包括我在内的许多人发现,μC编程是编程树特别引人入胜的分支,而我们只是 喜欢 对嵌入式系统进行编程。嵌入式程序与大多数台式机或大型机编程的方式大不相同, 东西,对于嵌入式程序员来说,做东西的乐趣无穷无尽。

什么 is an Embedded System?

该问题没有完美的答案,因为每个答案都会有一些例外。但是,出于我们的目的,让我们声明一个嵌入式系统是一个使用一台或多台微型计算机(即小型到非常非常小的计算机)的系统,该计算机运行自定义专用程序。 程序并连接到专用硬件,以执行一组专用功能。这可以与通用计算机(例如,熟悉的台式机或笔记本电脑)形成对比,后者不能设计为仅运行带有一组专用硬件的一个专用程序。这不是一个完美的定义,但这是一个开始。 

嵌入式系统的一些示例是:

•警报/安全系统

•汽车巡航控制

•暖气/空调温控器

•微波炉

•防滑制动控制器

•红绿灯控制器

• 售货机

• 加油站

•掌上数独游戏

•灌溉系统控制器

•唱歌墙边鱼(或本礼品季的同等礼品)

•多旋翼

•示波器

•火星漫游者

在大多数情况下,我在较不复杂的一端列出了嵌入式应用程序示例,因为这毕竟是一个入门教程。到本教程系列结束时,您应该已经掌握了良好的常规 构思如何对这些应用程序中的大多数进行编程,并概括地说它们将需要什么样的I / O,定时,中断和通信硬件及功能。 

关于上面的列表,有几件事值得注意。尽管许多嵌入式系统使用相当传统的用户输入输出设备(键盘,显示器),但许多其他系统却没有。此外,许多嵌入式系统都直接与人类互动,而其他系统则没有(人类仍在等待,看看火星漫游者是否会与任何火星人直接互动)。

什么 is different about Embedded Programming?

嵌入式程序必须与构成硬件的专用组件和自定义电路紧密配合。与在全功能操作系统上进行编程不同(在硬件上,尽可能从程序员的注意和控制中删除硬件细节),大多数嵌入式编程直接在硬件上或在硬件上起作用。这不仅包括CPU的硬件,还包括构成系统所有外围设备(片上和片外)的硬件。因此,嵌入式程序员必须至少具有硬件方面的良好知识,至少与编写与该硬件正确接口并对其进行操作的软件有关。这些知识通常会扩展到指定硬件的关键组件(微控制器,存储设备,I / O设备等),在较小的组织中,有时甚至会进行硬件的设计和布局(作为印刷电路板)。嵌入式程序员还需要对调试设备有很好的了解,例如万用表,示波器,逻辑分析仪等。

与通用计算机的另一个区别是,与前者相比,大多数(但不是全部)嵌入式系统非常有限。嵌入式系统中使用的微型计算机可能具有几千到几十万字节的程序存储器大小,而不是台式机中的千兆字节,并且通常具有比程序存储器更少的数据(RAM)存储器。此外,CPU通常是较小的8位和16位设备,而不是台式机中的32位和较大设备(尽管小型32位微控制器现在的价格适中,不到一美元,这令人惊讶地惊人)。 较小的CPU字长意味着,与在较大字长的CPU上运行的等效程序相比,程序将需要更多的指令(​​因而需要更多的时钟周期)。 最后,较小的微控制器的运行速度远小于PC的运行速度。 典型的较小的微控制器时钟频率在1到200 MHz之间,而不是PC的GHz频率。

什么 机,微处理器和微控制器之间有什么区别?

通常将微处理器理解为单片中央处理单元(CPU),其中CPU是计算机的“大脑”-计算机中执行程序指令的部分。微型计算机是围绕微处理器构建的任何计算机,以及根据需要的程序和数据存储器以及I / O设备和其他外围设备。微控制器(在本教程中通常简称为μC)是一种单芯片设备,不仅在微处理器上而且还在同一芯片上构建了非易失性程序(ROM)和易失性数据(RAM)存储器,并配有有用的外围设备例如通用I / O(GPIO),计时器和串行通信通道。因此,可以得出结论,所有的微控制器都是微计算机,但并非所有的微计算机都使用微控制器。

在较小的嵌入式系统中,最常见的是使用微控制器而不是基于微处理器的设计  因为微控制器可提供最紧凑的设计和最低的硬件成本。另一方面,如果找不到合适速度和功能的微控制器,则较大的嵌入式系统可能会使用一个或多个微处理器。这可以扩展到工业PC甚至更强大的硬件的使用。 也可以在复杂的嵌入式系统中同时包含微处理器和微控制器。唯一的实际规则是,在预算,可用性,时间,工具等方面存在限制的情况下,使用适合任务的任何设备。

还应该指出的是,如果板载混合不能满足所有系统需求,则对于大多数微控制器,可以添加外部存储器和外围设备。当需要添加此类外部设备时,而不是选择具有板载所需资源的更大的微控制器,则需要根据个人设计进行选择。

什么 is an N-bit CPU/microprocessor/microcontroller?

关于将设备称为N位处理器的含义有一些讨论,但是在大多数情况下,这很明显。如果设备可以对不超过N位的数据字执行大多数数据操作指令,则该设备是N位处理器。举例来说,设备可以具有可以对8位数据进行操作的全套指令,以及可以对16位数据进行操作的一些指令。 该设备应被视为8位设计,即使市场部门另有说明并称其为16位芯片也是如此。

从数量上看,8位微控制器是嵌入式市场上最大的部分。许多应用程序根本不需要更多功能,而且永远也不需要。 16位设备功能更强大,但它们被压缩在低端的8位设备和高端的32位设备之间。 除了最复杂或高性能的设计之外,对于所有设计,32位设备都处于嵌入式频谱的高端,但是它们的价格却在不断下降。

什么 microcontroller families are used in these tutorials?

为了简要概述可用的各种微控制器,本教程将围绕一个8位系列(Atmel AVR)和一个32位系列(以STM32系列形式的ARM Cortex M3架构)编写。 )。选择这两个系列是为了全面了解微控制器领域中发现的设备和方法。前几个软件示例将使用汇编语言针对这些系列以及C进行编写。 之后,示例将仅用C编写。

什么 else is required for these tutorials?

我想虽然可以仅使用微控制器模拟器来完成本教程的大部分内容,但我强烈建议您使用微控制器培训/开发板,或者什至只有裸露的μC芯片,各种组件和有源面包板。另外,您将需要一个C编译器, 定位到您的设备,并选择定位到您的设备的汇编器。为芯片寻找免费的汇编程序应该没有问题,即使它是商业编译器的简化功能版本,您也应该能够找到免费的C编译器。您还需要一种将程序下载到μC中的方法。此下载过程的详细信息将直接取决于安装在其上的特定μC和电路板。

就测试设备而言,数字万用表确实很便宜,没有理由没有它。 诸如Harbor Freight之类的地方有时会以几美元的价格出售它们。 任何嵌入式工程师必须拥有的另一台设备是一台像样的示波器。 不要惊慌,这些教程不需要范围。 但是,如果您能达成共识,您将学到更多,并在交易中节省大量时间。 USB示波器可以很好地降低成本,某些导入示波器(或者当然是可用的二手示波器)也可以。 去年年底,我用一块巨大的屏幕(对我来说)将自己放在一个美丽的安捷伦示波器上,每次使用它,我都很高兴自己花了这笔钱。

关于 这些教程中使用的微控制器, 这是硬件的详细信息,我将用于每个处理器系列:

AVR

•硬件:已安装ATmega8515的Atmel STK-500板

•工具:Atmel Studio 6(免费)

ARM Cortex M3

•硬件:STM32VL发现板,安装在定制对接板上

•工具:Rowley Crossworks(150美元的个人许可证-建议使用IAR Embedded Workbench Kickstart Edition作为免费工具集)

哪种编程语言?

现在是时候谈谈可以用来编写嵌入式软件的各种编程语言的好时机。我将在本教程中使用的两种语言是C和汇编语言。我想指出的第一件事是 不是 嵌入式程序员只能使用两种语言,而且在许多情况下,其他语言可能是更好的选择。话虽如此,C语言和汇编语言都不仅对学习μC编程有用,而且对于实际进行高效的μC编程也很有用。它们无处不在,因为无论您选择哪种微控制器,几乎都可以肯定有一个汇编器(用于处理汇编语言源代码)和一个C编译器(用于处理C源代码)。 代码)。对于其他语言,绝对不是这样。但是我鼓励您考虑使用其他语言,如果您愿意的话,也可以考虑使用其他语言,如果您的设备系列可以使用它们。

关于汇编语言,即使您不打算在嵌入式编程中使用汇编语言,我也强烈建议您至少对概念和μC指令集有所了解。这样做的原因是,即使您最终没有写任何汇编语言(我几乎再也没有做过),您仍会发现自己需要检查编译器和/或编译器提供的输出。用汇编语言编写或输出的启动文件。

还要注意,在本教程和其他地方,术语“汇编语言”通常会缩写为“ asm”或“ ASM”。

嵌入式程序如何运行?

在深入讨论嵌入式编程之前,这里是简要概述嵌入式程序如何启动和运行的好地方。假设您已生成程序文件并将其加载到μC程序存储器中(我们将详细讨论的所有步骤 稍后),当您打开设备或按RESET按钮时,好东西就会发生。当μC退出任一动作的复位状态时 它总是将转到制造商定义的特定存储位置,以开始执行在此找到或指向的任何代码。 有时,此存储位置直接包含代码;例如复位后,程序将从程序地址0开始执行。其他时间,固定存储器位置是向量,该位置保存程序开始的实际地址;例如复位后,控制器将使用程序地址0xFFFE处的值加载程序计数器,从而在位置0xFFFE和0xFFFF处的地址处开始执行代码(假定16位程序地址,存储在2个字节中)。在第一种情况下,您必须确保程序已加载到指定的启动地址,而在第二种情况下,必须将程序存储器放置在控制器地址空间中的任何位置加载程序,并且必须确保您然后将该启动地址加载到重置地址向量中。 请注意,启动方法的选择并不由您决定,而是将内置于您选择的μC的设计中。 AVR使用第一种方法,Cortex M3使用第二种方法。

当嵌入式程序开始运行时,通常必须进行大量的初始化和内务处理,然后才能开始执行程序。大多数初始化过程是普通台式机程序员从未见过的,因为它是由计算机启动代码和操作系统处理的。但是在嵌入式系统中,很有可能没有操作系统,因此必须明确提供所有引导代码和其他启动代码。一些非常关键的硬件可能需要首先初始化,例如控制内存访问时间和地址映射的硬件,以及系统时钟硬件。然后可能需要进行一些软件初始化,例如设置堆栈指针,并可能将数据从非易失性存储器复制到易失性存储器中,以便在其中进行访问并进行修改。之后,通常会进行另一轮硬件初始化,设置系统所需的所有外围设备,并设置初始输出状态。最后,可能还会发生另一轮软件初始化。

这种初始化通常分为两部分,第一个硬件和软件初始化步骤通常是在所谓的启动代码中完成的,而后面的硬件和软件步骤则在用户程序中完成。这种描述在C程序中更为明显,在C程序中,启动代码对于C程序是不可见的,是在运行main()之前发生的代码,并以对可见C程序开始处的main()的跳转或调用结尾。在汇编程序中,所有初始化步骤在用户代码中都可以同等可见,尽管即使如此,第一步仍可以驻留在单独的启动源文件中。

关于示例程序的注意事项

每个教程部分都将包含许多简短的示例程序。这些示例将从最简单的概念开始,并在随后的每个程序中添加一些概念。在此过程中,将修剪一些注释,以尝试帮助保持视觉混乱,并专注于呈现的新概念。例如,有关“需要为您的特定硬件调整此位/端口/地址”的注释最终将消失,因为届时您应该知道如果我正在讨论PORTA位0上的LED输出,而您在硬件上正在使用PORTB位7上的LED,那么您将进行相应的更改。或者,当我在第一个程序中提到“ ret”指令后,最好先设置堆栈,一段时间后,该注释和其他类似的注释将消失。

什么 next?

在继续我们的第一个微控制器程序,即闪烁的LED“ Hello World”之前,我们需要介绍有关微控制器的设计和操作的更多详细信息。 这将是本系列下一个教程的主题。


[-]
评论者 溴化镁2013年8月26日
您好,感谢您撰写本文!我是一名五年的C / C ++软件工程师,希望攻读微控制器编程。有太多的选择,观点和决定让我对初学者感到不知所措。

您的文章井井有条,简洁,我喜欢您列出使用的硬件。我有兴趣逐步跟进您,以赢得自己的立足之地,但是在采购您列出的确切硬件时遇到了一些麻烦。我在Atmel的网站上找到了一个Atmel STK-500入门板,但我不认为安装了ATmega16会附带该板。您能否提供任何帮助或直接链接到我可以找到您的两个硬件平台的地方?

我熟悉焊接和一般固态电子设备,因此不必组装组件就不成问题了。金钱真的不是问题;我只是一个有限的空闲时间的专业人员,希望消除那些无聊的研究和无休止的研究,并开始学习/制作东西! =)

再次感谢,祝您有美好的一天!
-Adam
[-]
评论者 米吉尔瓦2013年8月28日
嗨,亚当,您正是我想要针对这些教程的那种人。我已经使用STK500很长时间了,在某个时候我一定已经换掉了ATmega16随附的ATmega8515。为避免混淆,我应该重新插入'8515,并更改教程文本。

无论如何,您都不需要我在这些教程中使用的确切硬件。在AVR方面,几乎任何带有ATmega的板都应该做(例如,任何Arduino AVR板)。

提这个还为时过早,但是我已经发送了ATmega1281板的设计文件,该文件将插入我设计的教育板(我称为BusyBoard)中。 BusyBoard已经采用了两个低端STM32开发板(Cortex M0和M3),并且与ATmega开发板一起还将具有AVR功能。我正在强烈考虑为两个委员会进行kickstarter项目。这是一个潜行高峰:

http://tinyurl.com/pdfn6g6
[-]
评论者 Jamil82013年10月26日
首先,我是菜鸟的菜鸟。所以我想知道,在不破坏资金的情况下,我可以在哪里获得硬件组件?谢谢!
[-]
评论者 曼尼斯982014年10月26日
您好,谢谢您这篇文章,我是电子产品的新手,没有接受任何电子学方面的正规教育,我对C语言或编程一无所知,但我想学习嵌入式编程,您对我有何建议,请回复
[-]
评论者 cso_n_gin_ear2013年11月19日
迈克尔,做得好。我已经浏览了许多示例和教程,但这确实向我展示了如何以适合我的学习方式的方式来做事情。

我是一名电气工程师,负责产品表征,经常需要一种将命令发送到我正在研究的芯片上的方法。这将使我无需运行生产/自动测试仪即可执行此操作。

谢谢,

账单
[-]
评论者 沙拉德272014年1月31日
如何下载这个PDF文件
[-]
评论者 湖南2014年4月26日

编写一个程序,按下板上的STM32 DISCOVERY中断按钮即可产生。在中断程序中,数量紧凑
确定按下按钮。按下按钮的次数
由四个用户可编程LED组成的四位二进制数
此范围正在显示。
[-]
评论者 萨文德拉·库马尔(Savindra Kumar)2014年10月31日
非常感谢 ................
我喜欢你的文章。
[-]
评论者 greg892015年3月30日
真的很好
[-]
评论者 卢卡卜2015年4月8日
嗨,我是一名电气工程专业的学生,​​在这里我发现了一些非常不错的入门知识,有些地方是微控制器,不是菜鸟,甚至不是专业人士。第一次接触是在去年的大学,当时我正在组装atmega168程序,此后我购买了arduino uno板并开始使用arduino处理语言进行少量编程,它类似于C,但要容易得多,所以我从事RF船现在。
我打算在ebay上为atmega32购买一些程序员,并开始使用C / C ++进行编程,本教程对您有很大帮助
谢谢克罗地亚的问候
[-]
评论者 Kevin22015年5月26日
你好。八年前,我获得了电子工程硕士学位。从事了大部分的元件选择,原理图设计和电路板开发工作(但没有代码)。我的另一项工作是使用Labview和其他一些随机的高级语言(例如MatLab)(没有嵌入式代码)来进行系统测试设置。不久之后,我意识到,... $%^ *我不记得如何进行任何嵌入式编程或编写C代码的任何基础知识!我需要刷新才能找到其他工作。 :) 万分感谢!
[-]
评论者 Tahirsengine七月24,2018

你好, 

你们是真正统治这个世界的人之一。仅仅为了他人的福利而进行的工作,却没有任何实质性的期望,这确实值得赞赏。

上帝祝福你。

要发布对评论的回复,请单击每个评论所附的“回复”按钮。要发布新评论(而不是回复评论),请查看评论顶部的“写评论”标签。

注册后,您可以参加所有相关网站上的论坛,并获得所有pdf下载的访问权限。

注册

我同意 使用条款隐私政策.

试试我们偶尔但很受欢迎的时事通讯。非常容易退订。
或登录