2. Linux 下的 AVR 微控制器 HOWTO

2.1. 许可协议

      Permission is granted to copy, distribute, and/or modify this
      document under the terms of the GNU Free Documentation License,
      Version 1.2, or any later version published by the Free Software
      Foundation; with no Invariant Sections, no Front-Cover Texts, and
      no Back-Cover Texts.  A copy of the license is included in the
      section entitled "GNU Free Documentation License".

GNU 自由文档许可证

2.2. 什么是微控制器?

微控制器是一种单芯片计算机。它具有内部 RAM、ROM、定时器、计数器、中断电路、I/O 端口、模拟比较器、串行 USART、模数转换器、看门狗定时器和 RISC 架构。当您使用微处理器时,您不能单独对其进行编程。您需要其他组件,如 RAM、ROM、定时器等。为了进行编程,您应该彻底了解其架构:您必须阅读您的微控制器的datasheet(数据手册)。

2.3. 所需软件

binutils: 诸如汇编器、链接器等的工具。

gcc-avr: GNU C 编译器(avr 的交叉编译器)。

avr-libc: AVR C 库的软件包,包含许多实用函数。

uisp: 用于 Atmel AVR MCU 的微型在线系统编程器(用于将代码烧录到 MCU 的内存中)。

以下 Atmel 微控制器在 Linux 中受 avr-gcc 支持

at90s 类型设备

at90s2313, at90s2323, at90s2333, at90s2343, at90s4414, at90s4433, at90s4434, at90s8515, at90s8515, at90s8515, at90s8535, at90s1200。

atmega 类型设备

atmega103, atmega603, atmega8, atmega48, atmega88, atmega8515, atmega8535, atmega16, atmega161, atmega162, atmega163, atmega165, atmega168, atmega169, atmega32, atmega323, atmega325, atmega3250, atmega64, atmega645, atmega6450, atmega128。

attiny 类型设备

attiny22, attiny26, attiny26, attiny13, attiny13, attiny13, attiny13, attiny2313, attiny11, attiny12, attiny15, attiny28。

其他 AVR 设备

avr2, at90c8534, at86rf401, avr3, at43usb320, at43usb355, at76c711, avr4, avr5, at90can128, at94k, avr1。

binutils: 用于操作可能为 Atmel AVR 架构创建的二进制文件和目标文件的程序。此软件包主要面向 AVR 开发人员和交叉编译器。

gcc-avr: GNU C 编译器,一种相当便携的优化编译器,支持多种语言。此软件包包含 C 语言支持。

avr-libc: 用于为 Atmel AVR 微控制器开发 C 程序的标准库。此软件包包含静态库以及所需的头文件。

uisp: 用于使用 gcc-avr 创建的目标代码对 AVR 芯片进行编程的实用程序。它支持在线系统编程。

您可以下载上述软件包,解压、配置并安装它们。如果您使用的是 Debian 或 Ubuntu,这些软件包在您的发行版中可用:使用 apt 或 synaptic 软件包管理器安装它们。

2.4. Hello World

我们正在为 atmega8 微控制器编写 hello world 程序,它具有 28 引脚、8 位 RISC 架构。

在继续之前,请查看关于 __avr-libc__ 的本手册,这将帮助您更好地编程和理解。此外,请参考各种 AVR 微控制器的 datasheet(数据手册)。

这是我们的第一个程序

/* ledblink.c, an LED blinking program */
#include<avr/io.h>
#include<util/delay.h>
void sleep(uint8_t millisec)
{
        while(millisec)

        {
                _delay_ms(1);/* 1 ms delay */
                millisec--;
        }
}
main()
{

        DDRC |=1<<PC2;  /* PC2 will now be the output pin */
        while(1)
        {
                PORTC &= ~(1<<PC2);/* PC2 LOW */
                sleep(100);/* 100 ms delay */

                PORTC |=(1<<PC2); /* PC2 HIGH */
                sleep(100);/* 100 ms delay */
        }
}

2.4.1. 代码解释

用于 Atmel 系列的 GNU C 编译器使用有意义的名称标识微控制器内的所有功能单元。因此,编写 `PORTC=0xff' 将导致编译器生成机器代码,该代码将 0xff 写入 I/O 端口 C,这将把所有端口 C 引脚设置为逻辑高电平。由于端口是双向的,我们必须决定每个引脚应充当输入还是输出。如果名为 DDRC(数据方向寄存器 C)的寄存器的第 i 位为 1,则 PORTC 的第 i 个引脚将是输出。否则,它将充当输入引脚。(请注意,引脚和位编号从零开始。)要使 LED 闪烁,您必须先使引脚为高电平,然后再为低电平。(在这里,我们使用 PORTC 的第 2 个端口。也就是说,PC2 将是第 25 个引脚。)两者之间应该有一个延迟。这就是代码的其余部分所做的。对于延迟,我们使用内置函数 _delay_ms(1),这会导致 1 毫秒的延迟。

2.4.2. 编译

avr-gcc -mmcu=atmega8 Os ledblink.c o ledblink.o

这将生成目标文件 ledblink.o。现在,我们将它转换为 hex 文件,适用于烧录到微控制器的内存中。

avr-objcopy -j .text -j .data -O ihex  ledblink.o  ledblink.hex

我们将其转换为 hex 文件是因为,为了将代码烧录到 atmega8,我们将使用 uisp,其输入文件必须是 .hex 文件。

请注意,您可以使用 less 命令查看 ledblink.hex 文件。

:1000000012C02BC02AC029C028C027C026C025C0C6
:1000100024C023C022C021C020C01FC01EC01DC0DC
:100020001CC01BC01AC011241FBECFE5D4E0DEBF28
:10003000CDBF10E0A0E6B0E0EAE8F0E002C0059035
:100040000D92A036B107D9F710E0A0E6B0E001C0EC
:100050001D92A036B107E1F70CC0D2CF282FE4ECF7
:10006000F9E004C0CF010197F1F721502223D1F725
:100070000895CFE5D4E0DEBFCDBFA29AAA9884E66A

:0A008000EDDFAA9A84E6EADFF9CF6B
:00000001FF

2.4.3. 烧录代码

2.4.3.1. 硬件

我们将使用并行端口进行烧录。首先,我们必须为其开发一个烧录电路。

这是 atmega8 微控制器的电路。引脚 9 和引脚 10 通过 4 MHz 晶体振荡器连接,这是外部时钟。右下角的连接器用于并行端口。

如果您使用上述任何其他微控制器,则应进行相应的更改。}}}

您应该注意 RESET,XTAL1,XTAL2,SCK,MISO,MOSI 引脚 并进行连接。

2.4.3.2. 软件

现在,我们将 ledblink.hex 烧录到微控制器。

uisp -dprog=dapa -dlpt=0x378

您应该收到消息 Atmega8 Found

dprog 是编程方法说明符,在本例中是 dapa,即 Direct AVR Parallel Access(直接 AVR 并行访问)。dlpt 用于并行设备设置,即 0x378,并行端口的设备地址。

uisp -dprog=dapa -dlpt=0x378 --erase

将擦除微控制器的代码。

uisp -dprog=dapa -dlpt=0x378 --upload if=ledblink.hex

upload 输入文件 Input File ledblink.hex

请注意,您可以看到引脚 25 上的 LED 闪烁。

2.5. 作者

评论请发送至:mailto:ranjeeth_gecmail[at]yahoo[dot]com

Ranjeeth 博客

Govt Engg College Sreekrishnapuram,

Palakkad,Kerala India.

2.6. 最新版本

您可以在 LDP wiki 上找到此 HOWTO 的最新版本。