跳转到内容

嵌入式系统/Atmel AVR

来自维基教科书,开放世界的开放书籍

Atmel AVRTM 是由Atmel 生产的 8 位 RISC 微控制器 系列。 AVR 架构由挪威科技大学 (NTH) 的两名学生构思,并在由两位芯片架构师创立的Atmel Norway(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)(它将位存储在由电容器和晶体管组成的单元中)不同,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 寄存器中的位控制该引脚上是否启用了上拉。在较早的 AVR 上,PIN(端口输入)寄存器是只读的,用于读取端口引脚上的值,无论数据方向如何。较新的 AVR 允许写入 PIN 寄存器以切换相应的 PORT 位,这在对接口进行位邦定操作时可以节省一些处理器周期。

定时器/计数器

[编辑 | 编辑源代码]

所有 AVR 至少有一个 8 位定时器/计数器。为了简洁,定时器/计数器通常简称为定时器。

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

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

在正常模式下,定时器计数到顶部 FF8(或 FFFF16),翻转到零,并设置一个溢出位,如果启用了溢出位,则可能导致中断。在中断例程中,除了需要执行的任何其他处理之外,还可以将计数器加载所需的值。

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

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

脉冲宽度调制 (PWM)

[edit | edit source]

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

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

ATtiny26 的独特之处在于它包含 64 MHz 高速 PWM 模式。64 MHz 时钟是由 PLL 生成的,独立于处理器时钟,并且与处理器时钟异步。

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

输出比较调制器

[edit | edit source]

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

串行通信

[edit | edit source]

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

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

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

特定 AVR 支持的串行通信可能性数量有时会让人感到困惑,尤其是当引脚与其他芯片功能共享时。强烈建议深入研究特定 AVR 的数据手册。以下部分讨论了 AVR 上最常见的串行通信功能。

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

[edit | edit source]

最近的 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 信号

[edit | edit source]

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

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

双线接口

[edit | edit source]

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

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

串行外设接口 (SPI)

[edit | edit source]

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 控制器的框图。

协议问题

[edit | edit source]

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

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

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

模拟接口

[edit | edit source]

模数转换

[edit | edit source]

模数转换使用数字来表示采样模拟信号的比例。例如,通过将 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 其他的电压干扰。

模拟比较器外设

[edit | edit source]

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

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

其他集成硬件

[edit | edit source]

除了微控制器通常认为的典型外设(UART、SPI、ADC)之外,一些 AVR 还包括针对特定应用的更专业的外设。

LCD 驱动程序

[edit | edit source]

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

USB 接口

[edit | edit source]

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

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

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

  • obdev,它在一些限制下,可以根据与开源兼容的许可证获得,并且
  • USBtiny,它的许可证是 GPL。
  • LUFA 库在 MIT 许可证下发布,允许支持 USB 的 AVR 微控制器充当 USB 主机、从机或 OTG 设备。[1]

尽管这些软件实现提供了添加 USB 连接性的非常廉价的方式,但它们仅限于低速传输,并且占用相当多的 AVR 资源。其他将 USB 信号转换为 RS-232(串行)的硬件 IC 可从 FTDI 等供应商处获得。FTDI。这些 IC 的优点是将管理 USB 连接的繁重任务卸载,但缺点是受限于 AVR 串行端口的速度。有关此类 USB 接口芯片的更多详细信息,请参阅嵌入式系统/特定微处理器#USB 接口

温度传感器

[编辑 | 编辑源代码]

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

AVR 选择

[编辑 | 编辑源代码]

AVR 微控制器分为三组

  • tinyAVR
  • AVR(经典 AVR)
  • megaAVR

这些器件之间的差异主要在于可用的功能。与 megaAVR 相比,tinyAVR 微控制器通常是引脚数较少或功能集简化的器件。所有 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 以节省纽扣电池寿命。预装的引导加载程序程序允许使用标准 RS-232 串行插头重新编程电路板。

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

STK500 启动套件

[编辑 | 编辑源代码]

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

有多种扩展模块可用于 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)的基础上,旨在与开源开发环境一起使用。
  • 来自斯坦福大学帕斯卡尔·斯坦格先生的基于 AVR 的支持和应用板
  • GPMPU40 支持许多不同的 Atmel AVR 芯片
  • Futurlec 2313 板(请注意,AT90S2313 已过时,已被 ATtiny2313 替代。)
  • Olimex 生产许多基于 AVR 的开发板和原型制作板,并提供指向示例项目 的链接列表。
  • Protostack 提供 28 引脚 AVR 微控制器(atmega8 等)的开发板和套件,以及大量AVR 教程

编程接口

[编辑 | 编辑源代码]

有许多方法可以将程序代码上传到 AVR。

系统内编程

[编辑 | 编辑源代码]

在功能上,ISP 是通过SPI 完成的,并且对 Reset 进行了一些调整。只要 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 踢入编程模式。当使用 RESET 引脚被禁用的 AVR 时,HVSP 是必不可少的,以允许将其用作另一个通用 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 已 EOL'ed,但它仍在 AVR Studio 和其他工具中得到支持。
  2. JTAGICE mkII 取代了 JTAGICE,价格也相似。JTAGICE mkII 通过 USB 与 PC 交互,并支持 JTAG 和更新的 debugWIRE 接口。
  3. AVR Dragon 是 JTAGICE mkII 的低成本(约 50 美元)替代品,用于某些目标器件。AVR Dragon 提供系统内串行编程、高压串行编程和并行编程,以及对程序存储器为 32 KB 或更小的器件的 JTAG 或 debugWIRE 仿真。

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

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

debugWIRE

[编辑 | 编辑源代码]

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

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

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 一起使用。

固件编程

[编辑 | 编辑源代码]

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

AVR 汇编语言

[编辑 | 编辑源代码]

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

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

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

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

C++ 的某些功能不适合在像 AVR 这样的较小微型机上使用,因为实现它们需要大量的内存; 这些包括异常和模板。 然而,在使用适当的 C++ 子集时,生成的代码的大小与其 C 语言等效代码相当。 在 AVR 上使用 C++ 的一个著名例子是 Arduino

Forth

[edit | edit source]
  • 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

[edit | edit source]
  • Espruino - 一个适用于 STM32F1-F4 ARM Cortex 微控制器的 JavaScript 解释器。
  • uLisp - 一个适用于 Arduino 的 Lisp 解释器。 基于 Common Lisp 的子集,支持 ATmega328、ATmega2560 和 ATmega644/1284。

Pascal

[edit | edit source]
  • AVRco 开发环境 - IDE 还包括模拟器和带有 JTAG-ICE 的 HLL 调试器。 包含许多库函数。
  • MikroPascal - 包含 AVR 特定的库,以及帮助和示例。 免费版本代码限制为 4 KB。
  • 嵌入式 Pascal - 在 Windows 95、98 和 NT 下运行的 IDE。 语言扩展提供了在 Pascal 代码中混合 AVR 汇编的功能。

Python

[edit | edit source]
  • 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 项目

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