跳转到内容

嵌入式系统/Atmel AVR

来自维基教科书,开放书籍,开放世界
(重定向自 Atmel AVR)

Atmel AVRTM 是由Atmel生产的8位RISC 微控制器系列。AVR架构是由挪威科技大学 (NTH)的两名学生构思,并在Atmel挪威(由两位芯片架构师创立的Atmel子公司)得到进一步完善和发展。

Atmel AVR 处理器的内存采用 改进的哈佛架构,其中程序和数据内存位于不同的总线上,以实现更快的访问速度和更高的容量。AVR 使用内部内存来存储数据和程序,因此不需要任何外部内存。

Atmel AVR 中有四种类型的内存:

  • 数据内存:寄存器、I/O寄存器和SRAM
  • 程序闪存
  • EEPROM
  • 熔丝位

所有这些内存都在与 CPU 内核相同的芯片上。每种内存彼此隔离,位于芯片上的不同位置。数据内存中的地址 0 与程序闪存中的地址 0 和 EEPROM 中的地址 0 不同。

程序内存

[编辑 | 编辑源代码]

一些 AVR 微控制器具有 16 位宽的非易失性闪存,而另一些则具有 8 位 闪存,用于程序存储,从 1 KB 到 256 KB(或 512-128K 典型程序字)。程序内存保存可执行程序操作码和静态数据表。程序内存是线性寻址的,因此不需要像页面银行或段寄存器这样的机制来调用任何函数,而不管其在程序内存中的位置。

AVR 无法使用外部程序内存;芯片上的闪存是 AVR 内核可用的唯一程序内存。SRAM(静态 RAM)是随机存取内存 (RAM),只要供电,它就会在内存中保留数据位。与动态 RAM(DRAM)不同,DRAM 将位存储在由电容和晶体管组成的单元中,SRAM 不需要定期刷新。

SRAM 速度非常快;但是,它有很多缺点。1)它需要 4-6 个晶体管来存储一个位,这使得 SRAM 空间利用率低下,2)由于组件数量多,SRAM 的功耗非常大,3)由于组件数量多和功耗成本高,SRAM 非常昂贵,4)SRAM 是一种易失性内存类型,这意味着当电源连接断开时,SRAM 中的所有数据都会丢失。

可以使用编程工具对闪存程序内存进行重新编程,最流行的是在原位对芯片进行编程的工具,称为在线编程器 (ISP)。Atmel AVR 也可以使用高压并行或串行编程器进行重新编程,并且在某些芯片上可以通过 JTAG(也是在原位)进行重新编程。AVR 中的闪存可以至少重新编程 10,000 次。

许多较新的 AVR(MegaAVR 系列)能够自我编程闪存。此功能主要用于 引导加载程序

数据内存

[编辑 | 编辑源代码]

数据内存包括寄存器、I/O 寄存器和内部 SRAM。

AVR 有 32 个通用 8 位寄存器(R0 到 R31),其中 6 个可以成对使用作为 16 位指针 (X、Y 和 Z)。

所有 AVR 微控制器都具有一定的 RAM,从 32 字节到几个 KB。此内存是字节可寻址的。寄存器文件(通用和专用)映射到第一个地址,因此也可以作为 RAM 访问。一些最小的 AVR 微控制器只有寄存器文件作为其 RAM。

数据地址空间由寄存器文件、I/O 寄存器和 SRAM 组成。工作寄存器被映射为前 32 个内存空间 (000016-001F16),然后是最多 64 个 I/O 寄存器的保留空间 (002016-005F16)。实际可用的 SRAM 在这两个部分之后开始(地址 006016)。(请注意,I/O 寄存器空间在一些更大型的设备上可能更大,在这种情况下,SRAM 的起始地址将更高。)即使有单独的寻址方案和针对寄存器文件和 I/O 寄存器访问的优化操作码,它们仍然可以被寻址和操作,就好像它们是 SRAM 一样。

I/O 寄存器(和程序计数器)在发生复位时重置为其默认起始值。寄存器和 SRAM 的其余部分具有随机的初始值,因此程序通常首先做的就是将它们全部清零或加载其他初始值。

无论写入多少次,寄存器、I/O 寄存器和 SRAM 永远不会磨损。

外部数据内存

[编辑 | 编辑源代码]

一些引脚数量较多的 AVR 微控制器允许对数据空间进行外部扩展,可寻址高达 64 KB。当启用时,外部 SRAM 会被内部 SRAM 覆盖;对数据空间中地址 000016 的访问将始终解析为片上内存。根据特定 AVR 中存在的片上 SRAM 的数量,从 512 字节到几个 KB 的外部 RAM 将不可访问。这通常不会造成问题。

任何支持外部数据存储器的器件的数据手册中都描述了所需的支撑电路,例如 Mega 162 的“外部存储器接口”部分。支撑电路非常简单,包括一个 '573 或类似的锁存器,以及一些芯片选择逻辑。SRAM 芯片选择可以连接到永久启用芯片的逻辑电平,也可以由 AVR 的引脚驱动。对于 32 KB 或更小的 SRAM,一种选择是使用更高阶的地址线来驱动 SRAM 的芯片选择线。

EEPROM 存储

[编辑 | 编辑源代码]

几乎所有 AVR 微控制器都具有用于非易失性数据存储的内部 EEPROM 内存。只有 Tiny11 和 Tiny28 没有 EEPROM。

EEPROM 内存不会直接映射到程序空间或数据空间,而是作为外设间接访问,使用 I/O 寄存器。许多可用于 AVR 的编译器隐藏了访问 EEPROM 的部分或全部细节。IAR 的 AVR C 编译器在变量声明中识别特定于编译器的关键字 __eeprom。之后,用户编写代码以使用与普通变量(在 RAM 中)相同的标准 C 语法读取和写入该变量,但编译器会生成代码以访问 EEPROM 而不是常规数据内存。

Atmel 的数据手册表明,EEPROM 可以至少重写 100,000 次。如果应用程序频繁写入 EEPROM,以至于在达到设备预期寿命之前就会达到写入限制,则应用程序必须实现磨损均衡方案。AVR 出厂时 EEPROM 已擦除,即 EEPROM 中每个字节的值为 FF16

许多 AVR 在某些电源条件下(通常在 掉电 期间)写入 EEPROM 地址 0 存在错误,因此 Atmel 建议程序不要使用 EEPROM 中的该地址。

保险丝设置

[编辑 | 编辑源代码]

保险丝是一个 EEPROM 位,它控制低级功能和引脚分配。保险丝无法通过程序访问;它们只能通过芯片编程器更改。保险丝控制芯片可以从复位状态退出并开始执行代码之前必须设置的功能。

最常修改的保险丝包括

  1. 振荡器/晶体特性,包括驱动强度和启动时间。
  2. 用于 JTAG 或 GPIO 的 JTAG 引脚
  3. RESET 引脚用作复位输入、debugWire 或 GPIO
  4. 掉电检测 (BOD) 使能和 BOD 电压触发点

还有一个保险丝用于启用串行系统编程,默认情况下它已设置。如果设置不正确,唯一可以对芯片进行编程的方法是使用高压编程器,例如 STK-500、AVR Dragon 或第三方编程器。因此,开发人员在操作保险丝时应谨慎。

AVR 的 RESET 引脚是一个低电平有效输入,它会强制复位处理器及其集成外设。该线可以由外部上电复位发生器、电压监控器(当电源电压下降到预定义阈值以下时会断言 RESET)或较大系统中的另一个组件驱动。例如,如果 AVR 在大型集成系统中管理一些传感器和伺服器,则另一个控制器可能会观察到一些需要复位 AVR 的条件;它可以通过断言 AVR 的 RESET 线来做到这一点。

AVR 还包括一个 看门狗定时器,它可以在超时时复位处理器。必须定期复位看门狗定时器以防止它超时。未能复位看门狗定时器通常表明程序代码已失败(锁定、进入无限循环或其他错误),应复位处理器。在一些 AVR 中,可以将看门狗编程为发出中断而不是复位处理器。此功能可用于唤醒 AVR 从休眠模式。

RESET 引脚用于系统内部串行编程、作为 GPIO 或用于 debugWIRETM 低引脚计数调试,具体取决于芯片和保险丝位的编程。如果禁用该引脚的复位功能,则无法通过系统内部串行编程恢复它,必须使用其他方法,例如高压编程。

AVR 支持多种中断源,包括内部中断和外部中断。中断可能是由内部外设达到特定状态(即 UART 上接收到字符)引起的,也可能是由外部事件(如引脚上的特定电平)引起的。每个中断源都会导致跳转到内存中的特定位置。该位置应包含 RETI(从中断返回)指令,以实质上忽略中断,或跳转到实际的中断处理程序。

大多数 AVR 至少有一个专用外部中断引脚 (INT0)。较旧的 AVR 可以通过高电平或低电平,或通过下降沿触发中断。较新的 AVR 添加了更多选项,例如在上升沿或任一沿触发。此外,许多较新的 AVR 为每组 8 个引脚实现了引脚变化中断,从而消除了对 轮询 引脚的需要。引脚变化中断处理程序必须检查与该中断向量关联的引脚状态,并确定要执行的操作。

由于按钮抖动问题,将按钮或其他用户输入直接连接到中断引脚被认为是设计不良;必须插入一些去抖动或其他信号调节,以便来自按钮的信号不会违反中断引脚上所需的建立时间和保持时间。

通用 I/O 端口

[编辑 | 编辑源代码]

通用 I/O 或 GPIO 引脚是 AVR 系列的数字 I/O。这些引脚是真正的推挽式输出。AVR 可以驱动高电平或低电平,也可以将引脚配置为具有或不具有上拉的输入。GPIO 被分组到最多 8 个引脚的“端口”中,尽管某些 AVR 没有足够的引脚来提供特定端口中的所有 8 个引脚,例如 Mega48/88/168 没有 PortC7 引脚。控制寄存器用于设置数据方向、输出值(或上拉使能)以及读取引脚本身的值。可以使用按位操作指令访问单个引脚。

每个端口都有 3 个与之关联的控制寄存器:DDRx、PORTx 和 PINx。这些寄存器中的每个位控制一个 GPIO 引脚,即 DDRA 中的位 0 控制 PortA0(通常简写为 PA0)的数据方向,而 PORTA 中的位 0 将控制 PA0 的数据(或上拉)。

DDR(数据方向寄存器)控制引脚是输入还是输出。当引脚配置为输出时,PORT 寄存器中的相应位将控制引脚的驱动电平,高电平或低电平。当引脚配置为输入时,PORT 寄存器中的位将控制该引脚是否启用上拉。PIN(端口输入)寄存器在早期 AVR 中是只读的,用于读取端口引脚上的值,无论数据方向如何。较新的 AVR 允许写入 PIN 寄存器以切换相应的 PORT 位,这在位邦定接口时可以节省一些处理器周期。

定时器/计数器

[编辑 | 编辑源代码]

所有 AVR 至少都具有一个 8 位定时器/计数器。为了简便起见,定时器/计数器通常简称为定时器。

一些 Tiny 系列只有一个 8 位定时器。在 Mega 系列的顶端,有一些芯片有多达六个定时器(两个 8 位和四个 16 位)。

定时器可以直接由系统时钟、由系统时钟的分频结果或由外部输入(上升沿或下降沿)进行时钟驱动。一些 AVR 还包括使用与系统时钟异步的外部晶体的选项,该选项可用于使用 32.768 kHz 晶体保持实时时钟。

在正常模式下,定时器向上计数到顶 FF8(或 FFFF16),回滚到零,并设置溢出位,如果启用,该位可能会导致中断。在中断例程中,除了所需的任何其他处理外,还可以将计数器加载为所需的值。

比较时清除定时器 (CTC) 模式允许定时器在达到比较寄存器中的值之前被清除,而不是在定时器达到顶端并溢出之前。在溢出之前清除定时器会操作定时器分辨率,从而可以更精确地控制比较匹配的输出频率。它还可以简化外部事件的计数。

可以随时读取定时器的值,即使它正在运行。(数据手册中记录了读取 16 位定时器的特定顺序,以便返回一致的结果,因为 AVR 只能一次移动 8 位。)通过将定时器的时钟输入更改为“无时钟源”,可以暂时停止定时器,然后通过重新选择先前的时钟输入来恢复定时器。

PWM(脉冲宽度调制)

[编辑 | 编辑源代码]

许多 AVR 包含一个比较寄存器,至少用于定时器之一。当定时器值与比较寄存器中的值匹配时,该比较寄存器可用于触发中断和/或切换输出引脚(例如定时器 1 的 OC1A)。这可以在溢出中断之外进行,从而支持脉冲宽度调制 (PWM) 的使用。

一些 AVR 还包括用于相位校正 PWM 或相位和频率校正 PWM 的选项。许多电机需要相位校正。

ATtiny26 独特之处在于它包含一个 64 MHz 高速 PWM 模式。64 MHz 时钟由 PLL 生成,与处理器时钟无关且异步。

一些 AVR 还包括适合控制某些电机的互补输出。死区时间发生器 (DTG) 在一个信号下降和另一个信号上升之间插入延迟,因此两个信号永远不会同时为高电平。高端 AT90PWM 系列允许将死区时间编程为系统时钟周期数,而其他具有此功能的 AVR 仅使用 1 个时钟周期作为死区时间。

输出比较调制器

[编辑 | 编辑源代码]

输出比较调制器 (OCM) 允许生成一个以载波频率调制的信号。OCM 需要两个定时器,一个用于载波频率,另一个用于要调制的信号。OCM 在某些 Mega 系列中可用。

串行通信

[编辑 | 编辑源代码]

AVR 微控制器通常能够支持大量串行通信协议和串行总线标准。确切的串行通信支持类型在 AVR 微控制器系列的不同成员之间有所不同。

除了硬件支持之外,通常还可以选择完全在软件中实现特定的串行通信机制。这通常用于 AVR 控制器在硬件上不支持某些串行通信机制、特定硬件已在使用(例如,当需要两个 RS-232 接口但硬件只支持一个时)、或芯片的硬件无法使用,因为它与其他芯片功能共享引脚,并且这种功能已被用于特定硬件。后者经常发生在使用 DIP 封装的低引脚数 AVR 上。

最后,还可以使用额外的逻辑来实现串行通信功能。例如,大多数 AVR 不支持 USB 总线(某些后来的 AVR 支持)。当使用不支持 USB 的 AVR 时,电路设计师可以使用固定功能芯片(例如 FTDI232 USB 到 RS-232 转换芯片)或通用 USB 接口(例如 PDIUSB11)添加 USB 功能。对于某些支持的通信协议,实际上需要添加额外的电子元件,例如符合标准的 RS-232 通信需要添加电压电平转换器,例如 MAX232。

特定 AVR 支持的串行通信可能性数量有时会令人困惑,尤其是在引脚与其他芯片功能共享的情况下。强烈建议深入研究特定 AVR 的数据手册。以下各节将讨论 AVR 上最常见的串行通信功能。

通用同步异步收发器 (USART)

[编辑 | 编辑源代码]

最近的 AVR 通常内置了通用同步异步收发器 (USART)。USART 是一块可编程硬件,能够生成和解码各种串行通信协议。USART 是以下单词的首字母缩写

通用
可在许多不同的串行通信场景中使用
同步
可用于同步串行通信(发送方和接收方通过特定时钟信号同步)
异步
可用于异步串行通信(发送方和接收方没有通过时钟信号明确同步,而是通过数据信号同步)。
接收器
AVR 中的硬件可以接收串行数据
发送器
硬件可以发送串行数据

早期 AVR 具有一个 UART,它不支持同步串行通信,因此缩写词中没有“S”。

USART 或 UART 使用逻辑电压电平,而例如 RS-232 协议需要比 AVR 电路中常见的 5V 或 3.3V 电源电压电平大得多。从这些电压电平到这些电压电平的转换是由一个额外的芯片执行的,该芯片通常被称为线路驱动器或线路接口。

使用正确的线路接口,AVR 的 USART 可以例如用于与 RS-232、RS-485、MIDI、LIN 总线或 CAN 总线设备通信,仅举几个流行协议的例子。

有关更多详细信息,请参见机器人学:计算机控制:接口:网络

RS-232 信号

[编辑 | 编辑源代码]

RS-232 规范要求使用负电压表示“1”位,使用正电压表示“0”位。该规范允许电平为 +3 到 +15V 以及 -3 到 -15V,但通常使用 +/-12V。AVR 无法在其任何 GPIO 引脚上驱动负输出电压,因此使用电平转换器(例如 MAX232)来与 PC 和严格的 RS-232 设备通信。有关 RS-232 布线的更多详细信息,请参见串行编程:RS-232 连接

RS-232 的最大电缆长度相对较短。对于更长的电缆距离,请考虑在 USART 上使用RS-485 信号。

双线接口

[编辑 | 编辑源代码]

TWI 是飞利浦 I²C 总线接口的变体。I²C 包含两根线,称为 SDA(串行数据)和 SCL(串行时钟),它们使用开漏驱动器,因此需要上拉至逻辑 1 状态。I²C 使用公共地,因此总线上的所有设备应处于相同的接地电位,以避免接地回路。TWI 使用 7 位寻址,允许多个设备连接到总线。

许多 TWI 设备至少将地址的最高四位硬编码,其余位可以通过某种方式配置,例如将专用地址引脚连接到电源或接地;这通常只允许总线上存在 2-8 个型号的 X 设备。AVR 的 TWI 硬件可以充当主设备或从设备,并且可以满足 400 kbit/s 的规格。

串行外设接口 (SPI)

[编辑 | 编辑源代码]

SPI,即串行外设接口总线,是一种主从同步串行协议。这意味着存在一条时钟线,它决定何时采样脉冲,并且其中一方始终负责启动通信。它至少使用三根线,分别称为

MISO
主设备输入从设备输出。
MOSI
主设备输出从设备输入。
SCK
串行时钟。

从概念上讲,SPI 是一个双向移位寄存器;当在 MISO 或 MOSI 上移出位时,在另一条线上移入位。主设备始终控制时钟。

SPI 从设备具有一个从设备选择 (SS) 信号,该信号通知从设备应响应来自主设备的消息。SS 通常为低电平有效。如果只有一个主设备和一个从设备,则从设备的 SS 线可以接地,并且主设备不需要驱动它。如果存在两个或多个从设备,则主设备必须对每个从设备使用单独的从设备选择信号。这种方法的缺点是,主设备只能寻址与其额外输出数一样多的从设备(不使用单独的译码器)。

硬件实现 大型 AVR 微控制器内置 SPI 收发器(从 ATmega8 开始)。串行时钟来自处理器时钟,提供多个分频器。数据长度始终为 8 位。可以配置时钟极性和相位,导致何时将数据移入和移出芯片的四种可能的组合。这种接口非常流行,并且广泛存在于各种其他处理器和外设上。

用于 SPI 总线的引脚也用作通过 ISP(在线编程)编程芯片的方式(Mega128 除外)。

通用串行接口 一些 AVR,尤其是在 Tiny 系列中,提供通用串行接口 (USI) 而不是 SPI。USI 能够作为 SPI 运行,但也可以作为 I2C 控制器运行,并且只要付出一些额外的努力,就可以作为 USART 运行。传输的位长可以配置,时钟驱动器也是如此。时钟可以由软件驱动,由定时器 0 溢出驱动,或由外部源驱动。

软件实现 SPI 可以使用I/O 线的位邦定 来实现。通过将 SCLK 连接到外部中断源,可以实现从设备的有效实现。

特定 AVR 的数据手册提供了该芯片上 SPI 或 USI 控制器的框图。

协议问题

[编辑 | 编辑源代码]

SPI、RS-232、I2C 和其他串行接口只定义了传输位和字节的方法;它们对应于 OSI 模型 中的第 1 层,即物理层。字节可以是任何东西:温度读数(以摄氏度或华氏度表示,具体取决于您的传感器)、来自压力传感器的读数、用于关闭泵的控制信号或 JPEG 图像的字节。一些这些含义可以通过使用串行通信协议来分配。

串行协议必须处理各种各样的使用条件,并提供从故障中恢复的方法。例如,如果两个传感器连接到一个单片机(例如室内和室外温度),则该协议为串行线路另一端的接收器提供一种方法来区分哪个读数属于哪个传感器。如果在传输过程中电缆被拔掉,或者由于线路噪声而丢失了一个字节,则该协议可以提供一种方法来重新同步发送器和接收器。

Serial Programming 维基教科书中包含了更多关于串行协议的讨论。

模拟接口

[编辑 | 编辑源代码]

模数转换

[编辑 | 编辑源代码]

模数转换使用数字来表示采样模拟信号的比例。例如,通过将 3 V 应用于满量程范围为 5 V 的 ADC 的输入,将导致数字输出为数字输出满量程的 60%。数字可以由 ADC 表示为 8 位或 10 位。8 位转换器将提供从 0 到 ,或 255 的输出。10 位将提供从 0 到 的输出。

10 位采样: 在 ADCH:ADCL 中,或

8 位采样: 在 ADCL 中

许多 AVR 包含一个 ADC,具体来说是一个 逐次逼近 ADC。ADC 参考电压(如上例中的 5 V)可以是外部电压,也可以是内部固定的 1.1 V 参考电压。

带有 ADC 的 AVR 具有多个模拟输入,这些输入通过模拟多路复用器连接到 ADC。在任何给定时间,只能转换一个模拟输入。ADC 控制器提供了一种顺序转换输入的方法,因此 AVR 可以轻松地在每秒数千次的情况下循环遍历多个源。AVR 可以连续地运行 ADC 转换,也可以使用特殊的“ADC 休眠”模式来在转换过程中停止处理器,以最大程度地减少来自 MCU 其余部分的电压干扰。

模拟比较器外设

[编辑 | 编辑源代码]

几乎所有 AVR 微控制器都具有一个模拟比较器,它可用于在那些没有 ADC 的 AVR 上实现 ADC,或者如果所有 ADC 输入都已在使用中。Atmel 提供了使用比较器作为低速 ADC 的示例代码和文档。要测量的信号连接到反相输入,参考信号连接到同相输入。当信号低于或高于参考值时,AVR 将生成中断。

模拟比较器的一个常见用途是检测电池电压,以提醒用户电池电量不足。

其他集成硬件

[编辑 | 编辑源代码]

除了可以认为是微控制器典型外设(UART、SPI、ADC)之外,一些 AVR 还包括用于特定应用的更专门的外设。

LCD 驱动器

[编辑 | 编辑源代码]

在像 ATmega169(如 AVR Butterfly 中所见)这样的大型型号中,集成了 LCD 驱动器。LCD 驱动器控制 AVR 的多个端口以驱动显示器的列/行连接。液晶体必须注意的一个特殊特性是,不能通过它施加直流偏压。直流偏压或在泵送交流电时更多电子单向通过,会化学分解液晶体。AVR 的 LCD 模块使用精确的定时来驱动像素向前和向后相等。

USB 接口

[编辑 | 编辑源代码]

AT90USB 系列包括一个片上 USB 控制器。一些型号是“功能”型,而另一些则具有 On-The-Go 功能,可以充当 USB 主机(用于与其他从设备连接)或 USB 从设备(用于与 USB 主机连接)。

没有内置 USB 的 AVR 可以使用外部芯片,如 PDIUSB12,或者对于低速和最小功能设备,可以使用仅固件的方法。

两种仅固件的 USB 驱动程序是

  • obdev,它在某些限制下可以在符合开源许可证下使用,以及
  • USBtiny,它在 GPL 许可证下使用。
  • 在 MIT 许可证下发布的 LUFA 库允许支持 USB 的 AVR 微控制器充当 USB 主机、从机或 OTG 设备。[1]

虽然这些软件实现提供了添加 USB 连接的非常便宜的方法,但它们仅限于低速传输,并占用相当多的 AVR 资源。其他将 USB 信号转换为 AVR 的 RS-232(串行)的硬件 IC 可从 FTDI 等供应商处获得。这些 IC 的优点是可以卸除管理 USB 连接的繁重任务,缺点是受限于 AVR 串行端口的速度。有关此类 USB 接口芯片的更多详细信息,请参见 Embedded Systems/Particular Microprocessors#USB 接口

温度传感器

[编辑 | 编辑源代码]

一些较新的型号内置了一个连接到 ADC 的温度传感器。

AVR 选择

[编辑 | 编辑源代码]

AVR 微控制器分为三组

  • tinyAVR
  • AVR(经典 AVR)
  • megaAVR

这些设备之间的差异主要在于可用功能。tinyAVR 微控制器通常是与 megaAVR 相比具有较低引脚数或功能集缩减的设备。所有 AVR 设备都具有相同的基本指令集和内存组织,因此从一种设备迁移到另一种 AVR 设备通常很简单。

经典 AVR 大部分已停产,因此新设计应使用 Mega 或 Tiny 系列。一些经典 AVR 在 mega 系列中具有替代部件,例如 AT90S8515 被 mega8515 替代。

Atmel 提供了一个 参数产品表,它比较了整个 AVR 产品线上的内存、外设和可用功能。

硬件设计注意事项

[编辑 | 编辑源代码]

Atmel 提供了 AVR 硬件设计注意事项 来帮助硬件设计师。 本文档还展示了标准的在线串行编程连接器。

AVR 开发/应用板

[编辑 | 编辑源代码]

Butterfly 演示板

[编辑 | 编辑源代码]

AVR Butterfly 是一款自成一体的、电池供电的演示板,运行着 ATMEL AVR ATmega169V 微控制器。 该板包括 LCD 屏幕、操纵杆、扬声器、串行端口、RTC、闪存芯片、温度、光线和电压传感器。 该板背面有一个衬衣别针,可以戴在身上作为名牌。

AVR Butterfly 预装了软件,用来演示微控制器的功能。 工厂固件可以滚动显示您的姓名、显示传感器读数,以及显示时间。 此外,AVR Butterfly 还配备了压电蜂鸣器,可以再现声音。

AVR Butterfly 通过运行一个 14 段、6 个字母数字字符显示来演示 LCD 驱动。 但是,LCD 接口消耗了大量的 I/O 引脚。

Butterfly 的 ATmega169 CPU 的速度最高可达 8 MHz,但是为了节省纽扣电池的续航时间,它在出厂时通过软件设置为 2 MHz。

Ecros Technology 生产了一款 Butterfly 的载板,它提供电源、方便的 I/O 端口连接、DB-9 串行端口(带电平转换器)和一个大型原型区域。

STK500 入门套件

[编辑 | 编辑源代码]

STK500 入门套件和开发系统具有 ISP 和高电压编程功能,适用于所有 AVR 器件,无论是直接连接还是通过扩展板连接。 该板配备了 DIP 插座,适用于所有以 DIP 封装提供的 AVR。

STK500 板有多种扩展模块可供选择。 它们包括

  • STK501 - 添加对 64 引脚 TQFP 封装的微控制器的支持。
  • STK502 - 添加对 64 引脚 TQFP 封装的 LCD AVR 的支持。
  • STK503 - 添加对 100 引脚 TQFP 封装的微控制器的支持。
  • STK504 - 添加对 100 引脚 TQFP 封装的 LCD AVR 的支持。
  • STK505 - 添加对 14 引脚和 20 引脚 AVR 的支持。
  • STK520 - 添加对 AT90PWM 系列的 14 引脚和 20 引脚微控制器的支持。

第三方板

[编辑 | 编辑源代码]

第三方有许多基于 AVR 的开发和/或应用板,这里不可能列出所有这些板。

  • Arduino 是围绕 ATmega328(在旧板中是 ATmega8 或 ATmega168)构建的,旨在与开源开发环境一起使用。
  • 斯坦福大学 Pascal Stang 先生的 基于 AVR 的支持和应用板
  • GPMPU40 支持许多不同的 Atmel AVR 芯片
  • Futurlec 2313 板(请注意,AT90S2313 已过时,并已被 ATtiny2313 取代。)
  • Olimex 生产许多基于 AVR 的开发和原型制作板,并提供了一份指向 示例项目 的链接列表。
  • Protostack 拥有 28 引脚 AVR 微控制器(atmega8 等)的开发板和套件,以及许多 AVR 教程

编程接口

[编辑 | 编辑源代码]

有很多方法可以将程序代码写入 AVR。

在线编程

[编辑 | 编辑源代码]

从功能上来说,ISP 是通过 SPI 完成的,在重置方面有一些调整。 只要 AVR 的 SPI 引脚没有连接到任何干扰性内容,AVR 芯片就可以在重新编程时焊接在板上。 需要的只是一个 6 针插头和一个经济实惠的 PC 适配器。 这是 AVR 开发中最常用的方法。

Atmel 的 AVR ISP mkII 连接到 PC 的 USB 端口,并使用 Atmel 的软件执行在线编程。

avrdude(AVR 下载上传器)在 Linux、FreeBSD、Windows 和 Mac OS X 上运行,并支持各种在线编程硬件,包括 Atmel AVR ISP mkII、Atmel JTAG ICE、旧的 Atmel 串行端口编程器以及各种第三方和“自己动手”编程器。

高电压串行编程

[编辑 | 编辑源代码]

HVSP 主要是在较小的 AVR 上的备份模式。 一个 8 针封装没有留出多少独特的信号组合来启动 AVR 进入编程模式。 HVSP 在处理 AVR 时至关重要,这些 AVR 的 RESET 引脚被禁用,以允许将其用作另一个通用 I/O 引脚。 由于 RESET 不再具有用于 SPI 编程的内置功能,因此 12 伏信号允许可靠地发出编程应进行的信号,因为它是在正常运行期间芯片不应该看到的信号。

高电压并行编程

[编辑 | 编辑源代码]

HVP 是较大 AVR 上的备份模式。 它可能是与具有疯狂振荡器熔丝设置的 AVR 通信的唯一方法。 并行编程也可能更快,如果您有一条适度的生产线,这很有用。

引导加载程序编程

[编辑 | 编辑源代码]

大多数 AVR 型号可以保留一个引导加载程序区域,大小为 256 B - 2 KB,重新编程代码可以驻留在该区域。 在通电时,引导加载程序首先运行,并进行一些用户编程的判断,以确定是否要重新编程,还是跳转到主应用程序。 代码可以通过任何可用的接口进行重新编程,它可以读取通过以太网适配器加密的二进制文件,如果它喜欢的话。 Atmel 有关于从 RS-232 及以后的任何接口的应用笔记和代码。

引导加载程序在第 引导加载程序和引导扇区 章中进行了详细介绍。

完全不编程

[编辑 | 编辑源代码]

AT90SC 系列 AVR 可提供带掩码 ROM 而不是闪存的程序存储器。 [2]

由于前期成本高且最低订购量大,掩码 ROM 仅在大规模生产运行中才具有成本效益。

调试接口

[编辑 | 编辑源代码]

AVR 为调试提供了多种选择,主要涉及芯片在目标系统中运行时的片上调试。

JTAG 在芯片在目标系统中运行时提供了对片上调试功能的访问。 JTAG 允许访问内部内存和寄存器,在代码上设置断点,以及单步执行以观察系统行为。

Atmel 为 AVR 提供了一系列 JTAG 适配器。

  1. JTAGICE 适配器 通过标准串行端口与 PC 连接。 它的价格对于业余爱好者来说有点贵,大约 300 美元,但比许多其他微控制器仿真系统便宜得多。 JTAGICE 已 停止生产,尽管它仍在 AVR Studio 和其他工具中得到支持。
  2. JTAGICE mkII 取代了 JTAGICE,价格也类似。 JTAGICE mkII 通过 USB 与 PC 连接,并支持 JTAG 和较新的 debugWIRE 接口。
  3. AVR Dragon 是 JTAGICE mkII 的低成本(约 50 美元)替代品,适用于某些目标器件。 AVR Dragon 提供在线串行编程、高电压串行编程和并行编程,以及 JTAG 或 debugWIRE 仿真,适用于程序存储器容量小于 32 KB 的器件。

还有几个第三方 JTAG 调试器/重新编程器,价格约为 40 美元,例如来自 Ecros 和 Olimex 的调试器,以及 DIY 项目,包括 EvertoolAquaticus。这些都是原始 JTAGICE 的克隆。

JTAG 也可用于执行 边界扫描 测试 [3],该测试检查 AVR 与系统中其他支持边界扫描的芯片之间的电气连接。边界扫描非常适合生产线;业余爱好者可能更适合使用万用表或示波器进行测试。

debugWIRE

[edit | edit source]

debugWIRETM 是 Atmel 用于通过单个微控制器引脚提供片上调试功能的解决方案。它对引脚数量较少的部件特别有用,因为这些部件无法提供 JTAG 所需的四个“备用”引脚。JTAGICE mkII 和 AVR Dragon 支持 debugWIRE。debugWIRE 是在原始 JTAGICE 发布后开发的,并且没有一个 JTAG 克隆支持它。

仿真

[edit | edit source]

仿真本身不是调试接口,但软件中的仿真可以作为在将设计提交到物理硬件之前有效的调试辅助工具。

Atmel Studio 在汇编语言级别模拟 AVR 核心,并允许查看和操作所有内部寄存器。 HAPsim 是一组虚拟设备,可以插入 AVR Studio。它提供 LCD、LED、按钮和哑终端。

还存在其他软件包,它们提供 AVR 核心和外设的软件仿真。

  • VMLab 提供全电路仿真以及虚拟示波器。调试器提供单步执行 C 代码以及编辑和重建 WinAVR 程序的功能。从 3.12 版开始,VMLab 是免费软件。
  • AVRora 是一个“AVR 仿真和分析框架”。
  • Proteus 提供原理图捕获、PCB 编辑和微控制器仿真,包括 AVR。模拟器将代码“下载”到模拟的 AVR 核心。模拟器还支持各种虚拟外设。
  • Simulavr 是一个免费(GPLv2)模拟器,它与 GDB 协同工作,通常与 AVR-GCC 一起使用。

固件编程

[edit | edit source]

没有 固件,微控制器就做不了什么;程序代码来告诉微控制器该做什么。AVR 的固件可以用多种语言编写。Atmel 发布了 AVR 开发初学者指南,是 Atmel 应用杂志 2001 年夏季 的一部分,它提供了使用 AVR Studio 进行汇编语言编程的简要教程。

AVR 汇编语言

[edit | edit source]

AVR 微处理器的某些功能只能通过汇编语言访问。

与其他编译语言相比,汇编语言几乎总是生成最小的代码,因此它是在必须适应非常小的代码空间的应用程序中的一种流行选择。

AVR Studio 免费提供,但该程序只能在 Windows 上运行,并且其源代码不可用。用于 AVR 的两个特别的免费/开源汇编器是 AVRAToms AVR Assembler

  • B# 是一种现代的面向对象语言,专为小型嵌入式系统设计。

BASIC

[edit | edit source]
  • BASCOM-AVR 开发环境 是用于 AVR 系列的 BASIC 编译器。IDE 包括编辑器、编译器、模拟器和许多库函数。演示版限于 4K 代码。bascomp.exe 命令行在 Wine 中工作。
  • BASIC to C 有一个免费的入门 ATMEL AVR BASIC,名为 RVK-BASIC,它在 Windows 上运行。下载的版本限于 100 行代码。
  • EEBasic 是在 AVR Mega644 上实现的 BASIC,它只需要终端或终端模拟器来进行编程;不使用基于 PC 的编译器(或其他 IDE)。语言扩展提供了对片上外设的使用。
  • AttoBASIC 是针对 AVR ATmega88、ATmega168、ATmega328、ATmega2560、ATmega32U4 和 AT90USB1286 微控制器的面向硬件的 Tiny BASIC 的免费实现。这包括使用支持的 AVR 的所有 ARDUINO 产品,以及 TEENSY++2.0。所有支持的 AVR(或 ATmega32U4 和 AT90USB1286 USB 接口)都通过 UART 进行通信。它包含对 ADC、PWM、SPI、TWI 和 1-Wire 接口的支持,以及输入捕获功能(可门控时间选择的脉冲计数器)、通过单个端口位切换进行的直接数字合成 (DDS) 方波、nRF24L01 射频收发器和 DHT 温度和湿度传感器。程序可以通过文件系统保存到 EEPROM 并从 EEPROM 加载到 EEPROM,并且自启动功能允许在启动时自动运行保存在 EEPROM 中的程序。LUFA(DFU 和 CDC 模式)和 OptiBoot 引导加载程序已集成到项目中。对于 ATmega88、ATmega168、ATmega328、ATmega2560、ATmega32U4 和 AT90USB1286,可在 4、8、16 和 20 MHz 时钟速度下获得预构建的 HEX 文件。提供带有和不带有 OptiBoot-loader(或 LUFA)的构建,以及用于 ATmega32U4 和 AT90USB1286 UART 或 USB 的构建,用于串行 I/O。提供了完整的源代码以及示例程序。旧版本还支持 ATMEGA163 和 ATMEGA8515/AT90S8515,以及 ATTINY2313/AT90S2313。
  • GCC 也支持 AVR 上的 C++。

由于实现某些 C++ 特性所需的内存量,它们不适合在像 AVR 这样的小型微处理器上使用;这些特性包括异常和模板。但是,当使用合适的 C++ 子集时,生成的代码大小与其 C 语言等效代码相当。AVR 上 C++ 的一个显著应用是 Arduino

  • ByteForth (wiki) (购买) – 包括一个(反)汇编器、模拟器、ISP 编程器,并支持迄今为止几乎所有 AVR 微控制器。许多库函数和示例程序。它附带一个完整的 (荷兰语) 语言手册。然而,有一个英文版本,其中包含免费但完整的 2 kB 演示版本 的速成课程。ByteForth 在 DOS 或任何支持工作 DOS 盒子的系统下运行,如 Linux、Windows 95、Windows 98SE 等。
  • amforth: ATmega forth 是一个用于 AVR ATmega 微控制器的紧凑型 Forth。它是在 GPL 2 下发布的,并以 ANS 94 为模型。
  • Avise (Atmel VIrtual Stack Engine) 是“Forth 编程语言的修改版本”。Avise 只能以 HEX 文件的形式获得,以编程到支持的 AVR 中;源代码不可用。作者的网站还包括一些与 Avise 一起使用的 PCB 布局。
  • PFAVRpForth 到 AVR 的移植版本(GNU GPL)。
  • avrforth 是一个用于 Atmel AVR 系列微控制器的 16 位子程序线程 Forth 内核。
  • FlashForth 是一个用于 Atmel Atmega 系列微控制器的 16 位子程序线程 Forth 系统。
  • MikroForth 针对 ATtiny(文档为德语)
  • asforth 一个类似子程序线程 Forth 的系统

请注意,一些 Forth 环境在 AVR 上以交互方式运行。例如,Avise 在 AVR 的 UART0 上提供一个控制台,可以接受新的单词定义并执行操作。PC 上不需要任何软件(除了终端模拟器)。

  • NanoVM - 用 C 编写的 Java 虚拟机,适用于具有至少 8k 闪存的 Atmel AVR 微控制器。
  • MCU Java 源代码 - Java 源代码到 C 源代码的转换器,允许用 Java 编写 MCU 程序。

JavaScript

[编辑 | 编辑源代码]
  • Espruino - 用于 STM32F1-F4 ARM Cortex 微控制器的 JavaScript 解释器。
  • uLisp - 用于 Arduino 的 Lisp 解释器。基于 Common Lisp 的子集,支持 ATmega328、ATmega2560 和 ATmega644/1284。
  • AVRco 开发环境 – IDE 还包括模拟器和带有 JTAG-ICE 的 HLL 调试器。包括大量库函数。
  • MikroPascal – 包括 AVR 特定库,以及帮助和示例。免费版本限于 4 kB。
  • 嵌入式 Pascal – 在 Windows 95、98 和 NT 下运行的 IDE。语言扩展提供在 Pascal 代码中混合 AVR 汇编代码。
  • Micro Python 是 Python 3 编程语言的精简快速实现,经过优化可在微控制器上运行。
  • PyMite 是 Python 的一个子集,可以在“任何具有至少 64 KiB 程序内存和 4 KiB RAM 的 AVR 系列设备”上运行。

Atmel 官方网站

[编辑 | 编辑源代码]

编程和教育网站

[编辑 | 编辑源代码]

邮件列表和论坛

[编辑 | 编辑源代码]
  • Muhammad Ali Mazidi - AVR 微控制器和嵌入式系统:使用汇编和 C,Pearson Education。
  • Dhananjay Gadre - 编程和定制 AVR 微控制器,McGraw-Hill,2000。
  • Richard H. Barnett、Sarah A. Cox、Larry D. O'Cull - 嵌入式 C 编程和 Atmel AVR,Thomson Delmar Learning,2002。
  • John Morton - AVR:入门课程,Newnes,2002。
  • Claus Kuhnel - AVR RISC 微控制器手册,Newnes,1998。
  • Joe Pardue - 微控制器的 C 编程,以 ATMEL 的 AVR Butterfly 和免费的 WinAVR 编译器为特色,Smiley Micros,2005。 Smiley Micros
  • Chuck Baird - 使用汇编语言编程微控制器,Lulu.com,2006。 cbaird.net
  • Richard H. Barnett - 嵌入式 C 编程和 Atmel AVR,Delmar Cengage Learning;第 2 版(2006 年 6 月 5 日)

大学课程

[编辑 | 编辑源代码]

以下课程已知将 Atmel AVR 作为课程的一部分。

大学课程

[编辑 | 编辑源代码]

以下课程已知将 Atmel AVR 作为课程的一部分。

AVR 项目

[编辑 | 编辑源代码]
华夏公益教科书