Atmega328p — переход на низкое энергопотребление 1,8 В с использованием генератора 4 МГц — прошивка загрузчика

Я хотел бы использовать микроконтроллер Atmega328p с генератором 4 МГц, чтобы добиться низкого энергопотребления. Я использую плату Arduino для прошивки загрузчика в Atmega.

ИЗМЕНИТЬ

Чтобы скомпилировать загрузчик optiboot, мне пришлось установить пакет avr-libc и клонировать репозиторий

sudo apt-get install avr-libc
git clone https://github.com/Optiboot/optiboot.git

и отредактировал Makefile в /optiboot/bootloaders/optiboot/Makefile, добавив новую запись с именем atmega328_4

HELPTEXT += "target atmega328     - ATmega328p 4Mhz\n"
atmega328_4: TARGET = atmega328
atmega328_4: MCU_TARGET = atmega328p
atmega328_4: CFLAGS += $(COMMON_OPTIONS)
atmega328_4: AVR_FREQ ?= 4000000L
ifndef BIGBOOT
atmega328_4: LDSECTIONS  = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
else
# bigboot version is 1k long; starts earlier
atmega328_4: LDSECTIONS  = -Wl,--section-start=.text=0x7c00 -Wl,--section-start=.version=0x7ffe
endif
atmega328_4: $(PROGRAM)_atmega328_4.hex
atmega328_4: $(PROGRAM)_atmega328_4.lst

atmega328_4_isp: atmega328
atmega328_4_isp: TARGET = atmega328
atmega328_4_isp: MCU_TARGET = atmega328p
ifndef BIGBOOT
# 512 byte boot, SPIEN
atmega328_4_isp: HFUSE ?= D9
else
# 1k byte boot, SPIEN
atmega328_4_isp: HFUSE ?= D9
endif
# Low power xtal 46MHz) 16KCK/14CK+65ms
atmega328_4_isp: LFUSE ?= 7D
# 2.7V brownout
atmega328_4_isp: EFUSE ?= FE
atmega328_4_isp: isp

Я сохранил файл, запустил команду make и получил следующую ошибку:

userk@norepinephrine:~/development/git/optiboot/optiboot/bootloaders/optiboot$ make atmega328_4
avr-gcc (GCC) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

BAUD RATE CHECK: Desired: 115200, Real: 125000, UBRRL = 3, Difference=8.5%
avr-gcc -g -Wall -Os -fno-split-wide-types -mrelax -mmcu=atmega328p -DF_CPU=4000000L  -DBAUD_RATE=115200 -DLED_START_FLASHES=3           -c -o optiboot.o optiboot.c
optiboot.c:348:6: error: #error BAUD_RATE off by greater than 5%
     #error BAUD_RATE off by greater than 5%
      ^
optiboot.c:359:2: error: #error Unachievable baud rate (too fast) BAUD_RATE
 #error Unachievable baud rate (too fast) BAUD_RATE 
  ^
<builtin>: recipe for target 'optiboot.o' failed
make: *** [optiboot.o] Error 1

Поэтому я изменил параметр -DBAUD_RATE на 19200 и повторно запустил команду make

BAUD_RATE_CMD = -DBAUD_RATE=19200

Затем были созданы 2 новых файла: optiboot_atmega328_4.elf и optiboot_atmega328_4.hex

Затем я скопировал эти файлы в папку конфигурации Arduino, расположенную по адресу: /home/userk/.arduino15/packages/arduino/hardware/avr/1.6.21/bootloaders/optiboot

ТИД

Я использую пользовательский файл конфигурации платы board.txt

##############################################################

nz.name=Arduino Noize

nz.vid.0=0x2341
nz.pid.0=0x0043
nz.vid.1=0x2341
nz.pid.1=0x0001
nz.vid.2=0x2A03
nz.pid.2=0x0043
nz.vid.3=0x2341
nz.pid.3=0x0243

nz.upload.tool=avrdude
nz.upload.protocol=arduino
nz.upload.maximum_size=32256
nz.upload.maximum_data_size=2048
nz.upload.speed=19200

nz.bootloader.tool=avrdude
nz.bootloader.low_fuses=0x7D
nz.bootloader.high_fuses=0xD9
nz.bootloader.extended_fuses=0xFE
nz.bootloader.unlock_bits=0x3F
nz.bootloader.lock_bits=0x0F
nz.bootloader.file=optiboot/optiboot_atmega328_4.hex

nz.build.mcu=atmega328p
nz.build.f_cpu=4000000L
nz.build.board=AVR_UNO
nz.build.core=arduino
nz.build.variant=standard

Прошивка загрузчика Я выполнил следующие действия:

  • Загрузил скетч ArduinoISP на плату Arduino UNO.

  • Подключили плату Arduino и микроконтроллер, как показано на схеме ниже.

  • Выберите «Arduino Noize» в меню «Инструменты» > «Доска».

  • Выберите «Arduino как ISP» в меню «Инструменты» > «Программист». Запустите «Инструменты» > «Записать загрузчик»

На этом этапе я получил сообщение об успехе от IDE. Значит загрузчик правильно прошит в Atmega328p

Проблема

Когда я пытаюсь загрузить образец скетча (мигает), используя приведенную ниже схему, я получаю таймаут от IDE.

Я дважды проверил соединения, но скетч не загружается. У вас есть какие-нибудь советы?

, 👍3

Обсуждение

Как вы скомпилировали загрузчик optiboot? Вам нужно указать загрузчику, на какой скорости он работает., @Gerben

Спасибо, я обновлю пост с помощью Makefile от optiboot, @UserK

Итак, вы скомпилировали optiboot со скоростью передачи данных 19200, но указали 9600 в файле boards.txt., @Gerben

Извините, я не обновил вопрос после добавления конфигурации optiboot. Теперь он обновлен. У меня все еще та же проблема с тайм-аутом., @UserK


3 ответа


2

Как отмечает Гербен в комментариях, загрузчик должен знать, насколько быстро работает плата. Он использует это для определения настроек скорости передачи данных для последовательной связи.

Если вы сами не скомпилировали загрузчик с правильными настройками тактовой частоты, вы, вероятно, обнаружите, что он работает на четверти той скорости, на которой вы ожидаете. Разделение скорости передачи данных на четыре в настройках вашей платы может помочь, но вам действительно следует скомпилировать загрузчик так, чтобы он правильно соответствовал плате.

,

Спасибо, я отредактировал вопрос, добавив информацию, касающуюся компиляции загрузчика optiboot., @UserK


2

Как упоминалось ранее, вам необходимо скомпилировать загрузчик Optiboot с правильной тактовой частотой. Вот руководство, в котором показано, как это сделать, а также добавлена опция в меню Arduino IDE для выбора правильной тактовой частоты без необходимости добавления собственного определения платы.

Optiboot — ATmega328P на произвольной частоте

,

Хороший урок, я пытаюсь следовать предоставленным шагам, но пример для 12Mhz clock. Пожалуйста, посмотрите мои правки, @UserK

Принцип тот же самый для тактовых частот, отличных от 12 МГц. Я думаю, что вы выбрали неправильную скорость передачи данных для загрузки. Либо измените nc.upload.speed в файле платы на 115200 бод, либо перекомпилируйте загрузчик со скоростью 19200 бод., @tttapa


1
nz.bootloader.low_fuses=0x7D
nz.bootloader.high_fuses=0xD9
nz.bootloader.extended_fuses=0xFE

Расширенный байт предохранителя. биты 2,1,0 определяют уровень затемнения (биты 7-3 не используются) 110 = от 1,7 до 2,0 В, типично 1,8

Младшие байты предохранителя 3,2,1 определяют источник синхронизации 110 = кварцевый генератор малой мощности в диапазоне 3–8 МГц.

Значит, с этими настройками все в порядке.

,