tinyAVR 0系列微控制器的低级编程





您是8位还是32位程序员?在OMZLO,我们致力于新的32位ARM Cortex芯片(STM32和SAMD),这些芯片通常提供更多的RAM,并且性能比旧的8位微控制器单元(MCU)更好。 ,支持更多外围设备。而所有这些-相同或更低的价格。但是8位MCU尚未失去其相关性。特别是,Microchip发布了新系列的芯片“ tinyAVR 0系列”,与之前发布的AVR芯片相比,它可以与更现代的外围设备一起使用。同时,新芯片的价格非常诱人。这些芯片似乎非常适合开发不需要功能的简单设备较新的32位MCU提供了什么。另外,8位微控制器更容易编程,这导致基于其创建的设备的软件部分的开发速度加快。



得益于Arduino UNO的成功,互联网上有许多教程介绍了8位ATmega328微控制器及其类似产品(如ATtiny85)的编程功能。我们正在谈论的是不使用Arduino所用的编程语言,也不使用由Atmel Studio等芯片制造商创建的IDE来直接访问寄存器。要查看此信息,只需在Google中搜索“ atmega328眨眼”即可。要对微控制器进行编程,您只需要一个用于AVR的C编译器,一个文本编辑器,avrdude和一个AVR编程器。在一些资源上甚至可以找到有关如何使用通用面包板启动和运行ATmega328的指南。但是,如果我们谈论较新的tinyAVR 0系列芯片,则很难在其上找到此类信息。



当然,Microchip提供了在专门为Windows设计的IDE中对新tinyAVR进行编程所需的所有工具。对于某些较新的芯片,有“ Arduino内核”。因此,可以使用Arduino IDE对此类芯片进行编程。但是话又说回来,如果人们更喜欢使用他们喜欢的文本编辑器Makefile和C编译器以“低级”风格编写微控制器代码,那么他们将发现很少有关于这种与tinyAVR一起工作的信息。



在本文中,我们将告诉您如何使用最简单的工具从头开始创建一个固件丰富的固件用于ATtiny406。对于其他tinyAVR MCU,将要讨论的大多数内容也适用。本教程适用于使用macOS和Linux的用户,但是我们的建议(进行了少量修改)也将对使用Windows环境的用户有用。



项目的硬件部分



AT研究ATtiny406



我们决定对ATtiny406进行试验,希望将来该微控制器将取代PiWatcher当前使用的ATtiny45-在我们的开发中,当有需要时,它可以完全关闭或重新启动Raspberry Pi。 ATtiny406具有4 KB的闪存,256字节的RAM,该芯片无需外部时钟源即可工作在20 MHz。



新的tinyAVR MCU与较旧的知名芯片(如ATtiny85)之间的主要区别之一是,新芯片使用UPDI编程协议。它只需要3个引脚即可工作,而旧芯片使用的ISP协议则需要6个引脚。



在简短地研究了这个问题之后,我们了解到您可以使用简单的USB到串行电缆和电阻器通过UPDI对tinyAVR进行编程。我们通过pyupdi Python工具发现了这一点,该工具建议使用以下接线图将固件上传到微控制器。





单片机连接图



ATATtiny406的电路板设计



我们为ATtiny406创建了一个简约的分线板。该板可通过USB 5V供电。另外,您可以使用专用的VCC / GND引脚对其施加3.3V的较低电压。板上有一个按钮和一个LED的地方。为了进行实验,我们决定在板上构建一个4.7 kOhm的电阻,这是使用UPDI协议所必需的(这是电阻R2)。结果,我们得到了以下电路板布局。





电路板布局



board成品板



成品分线板非常紧凑,非常适合放在小面包板上。板原理图可以在这里找到





安装在原型板上的底板



要对ATtiny406进行编程,需要使用板上的引脚将USB转串口电缆连接到板上。





电缆连接图



项目的软件部分



▍pyupdi



我们按照项目存储库中的指示安装了pyupdi



USB至串行电缆通过四个UPDI引脚连接至开发板。我们的USB转串口转换器在macOS中被视为/dev/tty.usbserial-FTF5HUAV



为了确保程序员可以识别ATtiny406,可以通过编辑文件路径来执行类似于以下内容的命令:



pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -i


如果一切都配置正确,那么执行这样的命令将导致以下输出:



Device info: {'family': 'tinyAVR', 'nvm': 'P:0', 'ocd': 'D:0', 'osc': '3', 'device_id': '1E9225', 'device_rev': '0.1'}


▍C编译器



事实证明,可以使用Homebrew在macOS上安装的常规avr-gcc编译器不允许将ATtiny406设置为编译目标。因此,我们决定安装Microchip提供的avr-gcc要下载编译器,您必须在Microchip网站上创建一个帐户,这有点烦人。





下载编译器



下载完存档形式的必要资料后,我们将该存档解压缩到一个单独的文件夹中。bin文件夹中目录的路径必须添加到中PATH这将使将来的工作更加轻松。假设编译器存储在一个文件夹中$HOME/Src/avr8-gnu-toolchain-darwin_x86_64,则PATH可以通过在文件中添加以下命令来对其进行编辑.bash_profile



export PATH=$PATH:$HOME/Src/avr8-gnu-toolchain-darwin_x86_64/bin/


如果没有其他配置,Microchip的avr-gcc编译器不支持最新的ATtiny MCU。下载ATtiny设备包以支持它们





下载ATtiny设备包



因此,我们下载了包Atmel.ATtiny_DFP.1.6.326.atpack(此文件的名称可能不同,名称可能包含不同的版本号)。虽然文件扩展名是。atpack,这实际上是一个常规.zip存档。我们将其扩展名更改为.zip,并将软件包的内容提取到一个文件夹中$HOME/Src/Atmel.ATtiny_DFP.1.6.326,也就是,将其内容提取到编译器文件所在的位置。



ing编写C程序



我们编写了以下程序,该程序以1 Hz的频率使连接到ATtiny板上B5引脚的LED闪烁。



#include <avr/io.h>
#include <util/delay.h>

int main() {
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0); //   20 (,   0x02   2)

    PORTB.DIRSET = (1<<5);
    for (;;) {
        PORTB.OUTSET = (1<<5);
        _delay_ms(500);
        PORTB.OUTCLR = (1<<5);
        _delay_ms(500);
    }
}


此代码与为熟悉的AVR微控制器编写的LED闪烁程序非常相似。第一个显着变化是使用用于访问MCU寄存器的结构。例如,不是参考对PORTB的引用PORTB.DIRSET



另一个变化由频率设置代码((_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0))表示。新的ATtiny406在重启后以3.33 MHz的频率运行,这对应于20 MHz的基本时钟,该时钟被6分频。为了使芯片以20 MHz的全速运行,我们清除寄存器CLKCTRL.MCLKCTRLB。由于必须保护该寄存器不被意外更改,因此在ATtiny406上,必须使用特殊的软件结构对其进行修改。幸运的是,宏使此操作变得更容易_PROTECTED_WRITE。您可以阅读有关此内容的更多信息。在这里



如果将此代码与为STM32或SAMD21编写的代码进行比较,那么事实证明它要简单得多。



▍Makefile



在这里,我们使用以下目录结构:



  • src/Atmel.ATtiny_DFP.1.6.326/ -Microchip设备包的路径。
  • src/attiny406-test/-main.c上面的代码存储在该文件中的文件夹


attiny406-test/可以使用以下命令来执行 目录中代码的编译



avr-gcc -mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/ -O3 -I ../Atmel.ATtiny_DFP.1.6.326/include/ -DF_CPU=20000000L -o attiny406-test.elf main.c


该标志-O使您可以执行必要的优化,以使函数调用成功工作_delay_ms()对于-DF_CPU其内容反映芯片预期频率的变量也是如此其余参数包含有关ATtiny406文件位置的信息,我们先前已从Device Pack档案中下载并提取了这些信息。



要将固件下载到MCU,您需要转换Intel HEX格式的内容。之后,您需要使用pyupdi。我们Makefile为这些任务创建了一个简单的自动化解决方案:



OBJS=main.o
ELF=$(notdir $(CURDIR)).elf  
HEX=$(notdir $(CURDIR)).hex
F_CPU=20000000L

CFLAGS=-mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/ -O3
CFLAGS+=-I ../Atmel.ATtiny_DFP.1.6.326/include/ -DF_CPU=$(F_CPU)
LDFLAGS=-mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/
CC=avr-gcc
LD=avr-gcc

all:    $(HEX)  

$(ELF): $(OBJS)
                $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

$(HEX): $(ELF)
                avr-objcopy -O ihex -R .eeprom $< $@

flash:  $(HEX)
                pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -f attiny406-test.hex

read-fuses:
                pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -fr

clean:
                rm -rf $(OBJS) $(ELF) $(HEX)


要编译代码,只需运行命令make通过命令将代码下载到微​​控制器make flash我们提交的内容Makefile可以根据需要进行修改。



结果



新的TinyAVR与上一代MCU一样易于编程。最主要的是找到合适的工具。如果您有关于AVRTiny编程的任何提示,请在Twitter或下面的评论中与我们分享



您是否打算在项目中使用新的TinyAVR?










All Articles