• 跳至主要导航
  • 跳到主要内容
  • 跳到主要侧边栏
  • 跳到页脚

单片机技巧

微控制器工程资源,微控制器新产品和电子工程新闻

  • 产品展示
    • 8-bit
    • 16-bit
    • 32-bit
    • 64-bit
  • 应用领域
    • 汽车行业
    • 连接性
    • 消费类电子产品
    • 产业
    • 医疗类
    • 安全
  • EE论坛
    • EDABoard.com
    • 在线电子技术.com
  • 影片
    • TI单片机视频
  • EE资源
    • 快速设计
    • 电子书/技术提示
    • 常见问题
    • LEAP奖
    • 播客
    • 网络研讨会
    • 白皮书
  • EE学习中心

初学者’微控制器指南

2015年12月2日 通过 艾米·卡尔诺斯卡斯(Aimee Kalnoskas) 6条留言

乔恩·怀尔德(Jon Wilder)

我一次又一次地看到初学者尝试着从嵌入式电子产品开始,只是不知所措,不知道从哪里开始。有些人甚至在尝试不编写自己的微控制器之前就犯了错误,他们试图编写自己的代码’与他们一起使用的编程语言’重新使用,甚至是基本的编程概念。不过不用担心…本文应该成为入门的好书,让您在嵌入式电子世界中步入正轨。

本文不打算讲授任何特定的微控制器/微处理器,而是作为介绍适用于所有微控制器/微处理器的一般概念的入门书。

首先,关闭…let’问自己几个问题。第一个问题–

什么是微控制器?
微控制器是芯片上的微型计算机。它具有一个CPU,RAM(随机存取存储器),特殊功能寄存器,程序ROM存储器,数据ROM存储器,从一个到几个并行I / O(输入/输出)端口中的任何位置,并且可以具有许多片上外设,包括但不限于模数转换器(ADC),数模转换器(DAC),串行UART,一个或多个定时器,比较器/片上基准电压源,捕获/比较/ PWM(脉冲宽度调制)模块,用于SPI(串行外围设备接口)/ I2C(内部集成电路)通信的主同步串行端口,USB端口,片上振荡器上的以太网端口以及其他许多外设。

什么是微处理器(等等,你的意思是那里’确实有所不同)?
微处理器是微控制器的一切,但没有程序ROM。程序代码位于芯片外,位于单独的外部EPROM芯片中。

程序ROM和数据ROM
微控制器上的片上ROM存储器(只读存储器)就像微控制器一样’s hard drive. It has two partitions. One partition is reserved for the storage of the program code while the other partition is reserved for permanent storage of data that is used by the chip during normal program execution. On a given PIC microcontroller with say 8K of program space, the program space would occupy ROM 地址es 0x0000 – 0x1FFF (or 0 – 8191 in decimal). The data space would start at program ROM 地址 0x2100. If the data ROM space were 256 bytes long, the data ROM space would occupy ROM 地址es 0x2100 – 0x21FF (or 8448 – 8704 in decimal).

中央处理器
中央处理器代表中央处理器。基本上是“brains”微控制器的它是从代码存储器中获取指令并执行所获取的指令的过程。

数据RAM
数据RAM(随机存取存储器)是用于临时存储微控制器在正常程序执行期间使用的常量和变量值的数据空间。给定微控制器上的物理RAM空间大小因一个微控制器而异。微控制器上的数据RAM被组织成几个“registers”,每个都有自己的独特之处“address”. A RAM register on an 8 bit microcontroller can hold a total of 8 bits, or one byte of data. A typical RAM space specification may specify that it is 256 x 8. This means that there are a total of 256 寄存器 in the RAM, and those 寄存器 can hold 8 bits each.

A register is just a location in memory that you can write data to or read data from. Some of us refer to 寄存器 as “locations”.

特殊功能寄存器
The special function 寄存器 (or simply SFR’s) on a microcontroller are just like the 寄存器 in data RAM. You can write data to them as well as read data from them. Where they differ is that some SFR’直接控制微控制器上的片上硬件,而其他则由微控制器上的片上硬件控制。

SFR中的每个位都分配给一个功能。在SFR中’您有控制位和标志位。控制位就像“switches”可以根据在SFR中的该位位置写入1还是0来打开或关闭功能。标志位就像“indicator lights”根据标志位是1还是0指示给定条件是否存在。控制位直接控制硬件。标志位由硬件控制。在任何给定程序中,我们通常在读取标志位时写入控制位(某些标志位必须通过写入来手动清除,具体取决于微控制器…more on this later).

微控制器上的每个硬件都至少分配有1个SFR。一些硬件可能具有多个SFR’分配给它。咨询您的微控制器’的数据表,以了解有关其特定SFR组织的更多信息。

配置位
大多数微控制器都有特殊的位,称为“configuration bits”。这些位在微控制器上配置特殊选项,包括但不限于–

*振荡器类型
*看门狗定时器开/关
*开机/关机定时器
*掉电复位开/关
*低压编程开/关
*故障安全时钟监视器开/关
*内部/外部切换开/关

在PIC微控制器上,甚至还有用于程序代码保护和数据代码保护的配置位。这些位防止外部编程硬件读取程序或数据空间,以防止他人窃取您的代码。在Atmel AT89S芯片(8051衍生产品)上,此设置由已知的“lock bits”.

有些人将配置位称为“fuse bits”。这来自于过去的微处理器“fuses” on chip that would get blown if certain fuse bit controlled functions were turned off. These 保险丝 were “一次可编程”…一旦被炸开,就没有了“unblowing”他们。但是,随着现代微控制器上可用的闪存的出现,没有更多的字面意义了。“fuses” on the chip. But the term itself carried over due to the 配置位 essentially providing the same control as the 保险丝位 did.

ALU(算术和逻辑单元)
该硬件本质上负责微控制器执行的所有数学和逻辑运算。在大多数微控制器上,ALU将具有3个与之关联的标志位–

* 零位 –每当数学运算结果为零时,硬件会将此标志位设置为1。每当数学运算导致非零结果时,硬件会将其清除为0。

* 进位/借位 –该标志位用作加法运算的进位,而用作减法运算的借位。一种“carry”当加法运算的结果得出的值大于寄存器能够保存的值时,就会发生这种情况。一个8位寄存器可以保存最大值255(十六进制为FF或二进制为11111111)。

If an addition operation results in a result of greater than 255, the 携带 flag gets set to 1. If an addition operation results in a result of less than 255, no 携带 takes place so the 携带 flag gets cleared to 0.

For subtraction operations, the 携带 flag works as a borrow flag instead. The borrow flag works in reverse of the 携带 flag. If a subtraction operation results in a negative result, the borrow flag gets cleared to 0. If a subtraction operation results in a positive result, the borrow flag gets set to 1.

* 数字进位/借位 – This flag bit does the same thing as the 携带/borrow flag, but it only works to indicate if a 携带/borrow takes place between bits 3 and 4 only.

可以随时读取ALU标志位以了解数学运算的结果是否为零,正/负或大于/小于等,等等。

零位是一个方便的标志位,它使我们可以比较两个值以查看它们是否相等。如果我们将两个数字相减,结果相等时将为零,如果不相等则将为非零。因此,要比较两个值以查看它们是否相等,我们将它们相减,然后读取/检查零位以查看该位是1还是0。如果零位= 1,则减法结果为零,这意味着两个值相等。如果零位= 0,则相减的结果为非零,这意味着两个值不相等。

The 携带/borrow bit is a handy flag that allows us to compare two values to see if one value is greater than/less than the other value. Example…我们有两个值:VALUE1和VALUE2。在代码中,我们执行此操作–

VALUE1– VALUE2 = VALUE3

Once the subtract operation has been executed, we then read/check the high/low state of the 携带/borrow bit.

If VALUE2 is greater than VALUE1, the result of the subtraction will be negative, which will clear the 携带/borrow bit to 0. If VALUE2 is less than VALUE1, the result of the subtraction will be positive, which will set the 携带/borrow bit to 1.

请查阅数据手册以了解哪个SFR包含这些位。在PIC单片机上,ALU标志位位于STATUS SFR中。在MCS-51上,它们位于PSW SFR(程序状态字)中。

计划柜台
程序计数器是一个“address pointer” that tells the 中央处理器 where to find the next instruction to execute in program ROM. The 中央处理器 will fetch the instruction which resides at the program ROM 地址 that is currently loaded in the program counter.

当微控制器复位时,程序计数器被初始化为0x0000。 中央处理器将提取驻留在程序ROM地址0x0000中的指令。提取该指令后,程序计数器将自动递增到0x0001的值。程序计数器会连续自动递增1的值,这会使CPU依次访问程序ROM中每个寄存器位置的内容。它会一直这样做,直到CPU提取并执行了修改程序计数器值的指令为止。此类指令包括跳转指令(MCS-51上为ajmp和ljmp,PIC为goto),子例程调用(MCS-51上为acall和lcall,PIC为调用),以及任何向或从中添加或减去值的指令程序计数器。

堆栈
微控制器上的堆栈主要在子例程调用期间使用,并跳转到中断处理程序。它是一个“Last In First Out” buffer that is used to store 返回 地址es. During a subroutine call, the current program counter 地址 is “pushed” onto the stack with a +1 offset added to it, then the program counter is modified with the 地址 value where the subroutine being called resides. This makes the program counter jump to the subroutine code to execute the subroutine.

在子程序末尾,将有一个“return” instruction (ret on MCS-51, 返回 on PIC). Upon the execution of the 返回 instruction, the stack is “popped”, and the last ROM 地址 value that was 推 onto the stack is 弹出 off of the stack and back into the program counter. This makes the program counter jump back to the instruction that resides after the instruction that called the subroutine (hence the need for the +1 offset at the time that the PC 地址 is 推 onto the stack), and program execution continues where it left off prior to the subroutine call.

一些微控制器具有“software stack” (MCS-51). A 软件堆栈 uses some of the microcontroller’内部RAM空间作为堆栈空间。其他微控制器具有硬件堆栈(PIC)。对于硬件堆栈,堆栈是其自己的专用空间,该空间与所有其他片上内存空间分开。

On some 微控制器, the stack is writable. This allows us to use the stack for temporarily backing up critical 寄存器 during subroutine calls and interrupt handler execution. Prior to executing the subroutine or interrupt handler, the contents of the 寄存器 to back up are 推 onto the stack. Then, just prior to 返回ing from the subroutine or interrupt handler, the contents we 推 onto the stack at the beginning of the subroutine are 弹出 off of the stack one at a time, then restored to their original 地点 in reverse order from how they were 推 onto the stack (remember…Last In First Out).

A good example of this would be how we back up the accumulator and the PSW 寄存器 on MCS-51 during the execution of an interrupt handler routine –

代码(文字):

将ACC推入;将蓄能器备份到堆栈上
推入PSW;将程序状态字备份到堆栈中

;在此处执行中断处理程序代码

弹出PSW;恢复程序状态字
弹出ACC;恢复累加器
reti;从中断返回主代码

如您所见,我们首先将累加器的内容压入堆栈,然后再将PSW的内容压入堆栈。然后执行中断处理程序代码。

After execution of the interrupt handler code, the PSW is 弹出 off the stack first, then the accumulator is 弹出 off of the stack after it…in reverse order from how they were 推.

典型的SFR
如下所示设置典型的SFR。

代码(文字):

| PORT 1 SFR |
———————————————————
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

这是MCS-51微控制器上用于并行端口1的端口锁存器SFR。MCS-51上的每个端口都是8位并行端口,并且端口SFR中的每个位都分配给该端口上的每个引脚。 P1.0将是端口1上的引脚0,P1.1将是端口1上的引脚1,P1.2将是端口1上的引脚2,依此类推。

如图所示,我们将所有零写入端口1锁存器SFR中的每个位。这会将端口1上的所有引脚置于低电平状态(0伏)。如果我们写1’s到任何端口SFR位,这将设置与我们写“1”到高状态(+ 5V)。

Example, 让’s将值01010101写入端口1 SFR–

代码(文字):

| PORT 1 SFR |
———————————————————
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
| 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |

如图所示,这会将引脚P1.0,P1.2,P1.4和P1.6置于高电平,而将引脚P1.1,P1.3,P1.5和P1.7置于低电平。

在数据表上一句话…and why they’re so important
并非所有的微控制器都是一样的。每个芯片都设计有特定的硬件。来自不同制造商的微控制器都具有不同的体系结构。您会发现PIC单片机与MCS-51单片机有很大不同,就像MCS-51在SFR方面与Motorola 65xx相比有很大不同’的实现,数据RAM的组织方式,指令集,配置字,并行端口的工作方式等。

确切了解如何与您的微控制器及其硬件一起工作的唯一方法是查阅其数据表。数据表解释了每个SFR,每个片上硬件,绝对最大电气额定值,程序/数据存储器的组织结构,并行端口的接线方式以及它们的工作方式,指令集摘要(适用于使用汇编语言编写的人员)语言等)。作为程序员,您需要了解的有关微控制器的几乎所有内容都在微控制器中’s datasheet.

其中大多数可以通过简单的Google搜索免费在线获得(我尚未找到一个’t)。说你不能’找不到数据表是不能接受的借口。任何人拒绝查找数据表的唯一原因是因为他们太懒或他们没有’不了解他们,但不要’不想让别人知道他们不这样做’t。我现在就说…关于微控制器的大多数论坛问题都可以’如果这个人花了时间在数据表中查找答案,我就会自我回答。

数据表是绝对强制性的。没有它们,您将无法编写自己的代码。

乔恩·维尔德·阿凡达最小关于作者
乔恩·怀尔德(Jon Wilder)是一位自由电子工程师和电子爱好者,已有20多年的历史。他在美国海军工作了四年,担任航空电子技术员。从13岁起,乔恩就开始担任吉他演奏家,从15岁起就开始整合电子和音乐。乔恩在17岁时建立了他的第一台真空电子管放大器。乔恩说:“电子音乐”是他的爱和热情。  

乔恩 还是经常的贡献者和热情的成员 在线电子技术 工程界。上 在线电子技术,您可以从微控制器,可再生能源,汽车电子到电路仿真和设计等各个方面,向其他工程师提出问题并获得答案。此外,还有特定于MCU的论坛 8051/8951, AVR, 臂,Arduino的, Oshonsoft项目, 以及ASA 代码库 成员共享代码片段的地方。 

在Twitter上关注Jon,网址为 @PICmcuguy.

你也许也喜欢:

  • 微控制器与微处理器
    微控制器与微处理器:有什么区别?

提起下: 常问问题, 行业专家, 训练 标签: 基本, 在线技术, 嵌入式的, 常问问题, 微控制器, 微处理器, PIC

读者互动

评论

  1. 亨利·G 说

    2015年12月16日晚上9:38

    喜欢这个!很棒的深入分解。你不’不知道找到这样的高质量资源有多困难!明年开始时将为我的学生提供很好的参考。我正在考虑通过这篇文章在制造商/微控制器类型上建立更多细节 http://www.elex.co.nz/services/microcontroller-development-and-design/。还有其他建议吗?期待在这里阅读更多!

    回复
  2. ID10TError 说

    六月28,2018在1:11上午

    不错的文章。喜欢有关微控制器和cpu之间差异的部分,这对我来说是个新闻-

    回复
  3. 加布里埃尔·乌拉赫(Gabriel Urach) 说

    十月5,2018,1:50下午

    好文章,乔恩!谢谢!

    我也因为吉他而进入电子行业!

    摇滚万岁!

    回复
  4. 塞缪尔·A 说

    May 12, 2020年at 8:52 am

    精妙的微控制器初学者指南撰写,有关这些各种子主题的注释非常出色。
    感谢您抽出宝贵的时间将它们组合在一起。

    回复
  5. 基里尔 说

    November 25, 2020年at 4:39 am

    很棒的文章!

    Do you have any recommendation for courses/books for learning low level 嵌入式的 systems programming like writing reading from the 寄存器 and not just using frameworks

    回复
    • 艾米·卡尔诺斯卡斯(Aimee Kalnoskas) 说

      November 25, 2020年at 8:44 am

      你好,磷虾,
      I’d建议您在我们的在线工程论坛之一EDAboard.com中发布此问题。首先,您可以从该线程中收集一些有用的信息: //www.edaboard.com/threads/information-about-learning-embedded-systems.350907/
      干杯,
      艾米·卡尔诺斯卡斯(Aimee Kalnoskas)

      回复

发表评论 取消回复

Your email 地址 will not be published. 必需的地方已做标记 *

主侧边栏

快速设计

组件选择变得简单。

今天尝试
设计快速的globle

EE培训中心教室

“ee

“ee

“ee

“ee

订阅我们的新闻

订阅每周行业新闻,新产品创新等等。

立即订阅

的RSS 当前的EDABoard.com讨论

  • 即使有最大的可用磁芯,500W全桥也提供了过高的增量B
  • 带有MCU的运算放大器电路
  • 4-20mA电流回路测量保护
  • MOS电容器或mosfet用作盖子(D-S-B连接到GND)
  • "Sandwich"绕线变压器次级夹在不相等的绕组之间

的RSS 当前Electro-Tech-Online.com讨论

  • 小型商机!!!
  • Bixenon电磁控制器
  • 4岁的McIntosh前置放大器上闪烁的静音照明LED
  • 半松散的绕组会严重影响变压器的性能
  • 12F629 o intrare,o ieșire,trecere din pwm中闪烁

在推特上关注我们

MicroContrlTips的推文

页脚

单片机技巧

EE World在线网络

  • 快速设计
  • EE World在线
  • EDA董事会论坛
  • 电子技术在线论坛
  • 连接器提示
  • 模拟IC技巧
  • 电力电子提示
  • 传感器提示
  • 测试和测量技巧
  • 电线电缆技巧
  • 5G技术世界

单片机技巧

  • 订阅我们的新闻
  • 与我们一起做广告
  • 联系我们
  • 关于我们
在推特上关注我们在Facebook上添加我们在YouTube上关注我们 在Instagram上关注我们

版权© 2020 ·WTWH Media LLC及其许可方。版权所有。
未经WTWH Media事先书面许可,不得复制,分发,传播,缓存或以其他方式使用本网站上的资料。

隐私政策



    • <form id="RoIrVMA" class="REncjfq"><samp id="hBETxF3" class="hzoysIQ"><article id="ozBPqs3"></article></samp></form>
    • <tbody id="NNeqwt2"><dd id="NKmHK66" class="N2D3o8m"></dd></tbody>

    • <map id="BEM3jmm" class="B6stgeA"><center class="f3NrbuZ"><keygen id="DPoxHWg"></keygen></center></map>

      1. <abbr id="vl2vIPG" class="vlGtRU3"><samp class="biIqfK4"><strong id="NOwRDqY"></strong></samp></abbr>



            <xmp id="pwfV3FX">