我已经使用Arduino Uno板有一段时间了,包括作为我许多文章的示例。我一直想知道要让ATmega328P芯片(旧版Uno板上使用的原始芯片)完全独立工作需要做些什么。通过Arduino的引导程序、友好的GUI软件和C++抽象层,使其变得如此易于访问,你可能会想,为什么我甚至想尝试这样做。有时候,为了欣赏别人的成就,亲自尝试一下是很重要的。这个项目真正展示了Arduino团队投入了多少工作,并且用那个友好的小产品改变了世界。
在这篇文章中,我们将通过仅使用外部电源和Atmel-ICE编程器来完全独立地启动芯片。我们将演示如何通过板载串行接口与芯片通信,以及如何让一个或两个LED闪烁。
有几种配置ATmega328P的方法。正如标题所暗示的,一种方法,我们故意没有涉及,就是将你的ATmega328P芯片放入Arduino Uno中进行编程,然后将其移至面包板上。根据论坛上的反馈,有些人想跳过Arduino过程,使用如Microchip的Atmel-ICE这样的更传统的编程器。开始使用Microchip(前身为Atmel)微处理器最直接的方法是安装Microchip Studio。在撰写本文时,完整的Microchip Studio套件仅在Windows上得到支持。由于我喜欢让所有的构建环境在CI(持续集成)中运行,我选择了另一种方法。
GNU编译器集合(GCC)是目前最流行的C语言编译器之一。它可以编译特定的平台和架构,但不适用于AVR(ATmega)系列芯片。然而,他们的网站上有一套针对AVR和其他Microchip系列的编译器。幸运的是,一些好心人甚至将这些编译器打包成了Debian包,可以很容易地在Debian或Ubuntu上安装,如下所示:
$ apt-get install gcc-avr binutils-avr avr-libc avrdude
有了这些工具,我们现在可以仅使用Atmel-ICE编程器和外部电源(设置为5V)来编译和编程ATmega328P。我们将使用AVR版本的GCC来编译代码,使用AVRDUDE来烧录ATmega328P芯片。
对于这个项目,我的目标是展示ATmega328P的一些基本但功能性的能力。一个简单的外部闪烁LED和一些来回的串行命令就足以证明这个芯片可以独立站立。在项目的仓库中,我创建了一些文件夹除了源代码(命名为“src”)以外,这些文件夹有助于本项目的开发。
软件开发的一个重要组成部分(即使是安装在硬件上的软件)是单元测试。单元测试验证了更大系统的函数或部件是否按预期工作。如果有人修改了那些功能的一部分,单元测试将防止回归发生(即,你在引入新功能时无意中破坏了其他东西)。在这个例子中,我编写了一个基本的单元测试,该测试模拟了硬件并运行了串行通信库(USART)的初始化方案。
除了单元测试(位于“tests”文件夹中)之外,还有一个名为“hil”的文件夹,代表硬件在环(Hardware in the Loop)。这个文件夹包含了运行实际硬件测试所需的脚本(如我之前的许多文章所讨论的)。这确保了我的代码不仅在虚拟世界中(使用模拟)是功能性的,而且通过在真实硬件上运行测试,在现实世界中也是有效的。
查阅README.md将为你提供一个引脚图,以连接Atmel-ICE程序器到ATmega328P芯片:
图 1: Atmel ICE 引脚图
添加几个LED,将串行通信端口连接到树莓派,并从树莓派的+5V线上取电,你现在就有了一个完整的装配体:
图 2: 使用扩展板的ATmega328P与树莓派和Atmel-ICE程序器
当你开发新功能时,使用Makefile来运行单元测试和编译代码。在验证了你想要的代码按预期工作(通过单元测试验证)之后,构建二进制文件,通过Makefile将其烧录到设备上,并使用树莓派的串行通信端口运行硬件在环(HIL)测试。
最重要的一部分是正确烧录保险丝位,以启用内部8 MHz时钟。这在README中有文档记录,也添加到了Makefile中的烧录命令中:
avrdude -c atmelice_isp -p m328p -B 32 -U lfuse:w:0xe2:m
之后,你应该能够使用芯片的串行接口,假设板载时钟以8 MHz运行(如main.c顶部所定义)。从这里开始,你应该能够添加更多功能,如对额外串行命令的支持、与外部组件和传感器的接口,以及你能想到的与这个有趣的小微控制器相关的任何事情。
在本文中,您学习了如何在没有任何外部电路的情况下开始使用 ATmega328P 芯片,这通常可以在原始的 Arduino Unos 和 Microchip 评估板上看到。您现在了解了单元测试、二进制构建、烧录芯片以及运行硬件在环测试的概念。此外,还有一个经常被忽视的重要细节,关于编程熔丝位以将内部时钟设置为 8 MHz。此时,您应该能够通过额外的单元和 HIL 测试添加更多功能,并且只需使用 Atmel-ICE 编程器和外部 5V 供电即可运行所有内容。为了简化,使用树莓派作为其电源和串行通信能力将是控制端到端过程的最简单方式。
项目的源代码可以在这里找到:https://gitlab.com/embedded-designs/atmega328p-serial-led-control。