Здравствуйте! Встала острая необходимость записать прошивку в МК atmega16. Программатор я буду использовать вот этот, программатор “Громова”.
А вообще программа avrdude может работать с очень многими программаторами. Список программаторов и контроллеров которые поддерживает программа avrdude, а так же инструкция по использованию программы можно скачать тут. Так как мои постоянные читатели знают что я перешёл на ос linux то и решение мне нужно искать именно для linux. Ну как вы уже поняли об этом решении я и напишу. В этой статье я расскажу о всех шагах которые необходимо вам сделать для достижения результата. И так начинаем без лишних отступлений.
Для начала установите следующие дистрибутивы:
1 |
sudo apt-get install avrdude |
Ниже привожу все опции программы по порядку:
- -p <partno> – является обязательной опцией, здесь мы в качестве <partno> указываем краткий псевдоним AVR микроконтроллера;
- -b <baudrate> – позволяет переопределить указанную для программатора в конфигурации программы скорость подключения по интерфейсу RS-232;
- -B <bitclock> – указываем Bit Clock Period для интерфейса отладки JTAG или ISP Clock (только для JTAG ICE). Значение <bitclock> указывается в микросекундах, для JTAG ICE по умолчанию оно установлено в 1 микросекунду и подходит для МК работающих на частотах 4МГц и выше;
- -C <config-file> – в качестве <config-file> указываем полный путь к файлу конфигурации с необходимыми нам настройками программы. По умолчанию используется файл /etc/avrdude.conf (Linux);
- -c <programmer> – в качестве <programmer> указываем псевдоним используемого программатора, например “usbasp”.
- -D – опция запрещает автоматическое стирание Flash-памяти. Автоматическое стирание не используется в микроконтроллерах семейства ATxmega;
- -i <delay> – установка паузы перед каждой отправкой каждого бита для bitbang-программаторов. В качестве <delay> указывается значение в микросекундах. Это бывает необходимо если для программирования используется компьютер с очень быстрым процессором или же микроконтроллер с низкой тактовой частотой (32КГц, 128КГц), позволяет соблюдать условие: частота ISP < 1/4 частоты процессора;
- -P <port> – в качестве значения <port> указываем используемый программатором порт. По умолчанию используются /dev/ppi0 (параллельный порт) и /dev/cuaa0 (последовательный порт) в зависимости от программатора;
- -F – опция для отключения проверки сигнатуры микроконтроллера. По умолчанию перед программированием avrdude проверяет сигнатуру микроконтроллера, которая в некоторых случаях может быть повреждена, при этом микроконтроллер может продолжать нормально функционировать;
- -e – стирает содержимое FLASH и EEPROM памяти (заполнение значениями 0xFF), очищаются fuse-bits (биты защиты). Исключением являются микроконтроллеры семейства ATxmega в которых используется постраничная запись;
- -O – опция для калибровки RC-генератора в соответствии с примечанием AVR053 от Atmel. Поддерживается только на программаторах STK500v2, AVRISP mkII, и JTAG ICE mkII. Результат будет сохранен в EEPROM памяти в ячейке с адресом 0;
- -U <memtype>:r|w|v:<filename>[:format] – комплексная опция для указания производимой с памятью операции (чтение. запись, проверка);
- -n – запрет на запись в микроконтроллер, используется для отладки avrdude;
- -V – отключение автоматической проверки записанной информации;
- -u – отключить режим безопасной (safe mode) проверки и сопоставления ячеек конфигурации (fuse bits) до и по завершению программирования. Данная опция необходима если нужно изменить значения фьюзов (fuse bits), в противном случае avrdude в качестве меры безопасности изменит их значения на те которые были прочитаны перед программированием;
- -s – запрет вывода запросов в безопасном режиме при работе с фьюзами;
- -t – переводит avrdude в режим терминала (terminal mode);
- -E <exitspec>[,<exitspec>] – изменение состояния линий параллельного порта после программирования на указанные в аргументах опции. По умолчанию устанавливаются те состояния линий что были до начала работы;
- -x <extended_param> – позволяет указать дополнительный специальный параметр для используемого программатора;
- -y – опция что включает сохранение количества стираний МК в последних 4-х байтах памяти EEPROM;
- -Y <number> – указанное значение <number> будет сохранено в качестве числа циклов-стираний микроконтроллера в памяти EEPROM;
- -v – расширенный вывод информации о работе программы (verbose);
- -q – отключает отображение полоски прогресса при операциях с микроконтроллером. Для еще большого уменьшения отображаемой информации опцию следует указать дважды;
- -l <logfile> – перенаправление всего вывода для отладки в указанный файл, где <logfile> – полный путь к файлу для сохранения данных;
- ? – отображение справки.
Настройка программатора Громова (COM-порт) в Linux
Первым делом нужно добавить программатор Громова с его идентификатором и настройками в конфигурацию программы avrdude. Для этого я немного подправил конфигурационный файл “avrdude.conf” который находится по этому пути /etc/avrdude.conf Скорее всего вы не сможете сохранить файл из-за отсутствующих прав доступа. Для добавления вашего пользователя в группу root необходимо выполнить вот такую команду:
1 |
sudo usermod -a -G root user |
вместо “user” впишите своего пользователя. А вообще тему групп и пользователей я описал вот по этой ссылке. Продолжаем настройку программы. Нам необходимо открыть файл avrdude.conf:
1 |
sudo nano /etc/avrdude.conf |
Вносим в этот файл вот этот код:
1 2 3 4 5 6 7 8 9 10 |
programmer id = "gromov"; baudrate = 9600; desc = "serial port banging, reset=dtr sck=rts mosi=txd miso=cts"; type = "serbb"; reset = 4; sck = 7; mosi = 3; miso = 8; ; |
примерно в это место:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# Note that the pin numbers for the main ISP signals (reset, sck, # mosi, miso) are fixed and cannot be changed, since they must match # the way the Multi-Protocol Synchronous Serial Engine (MPSSE) of # these FTDI ICs has been designed. programmer id = "gromov"; baudrate = 9600; desc = "serial port banging, reset=dtr sck=rts mosi=txd miso=cts"; type = "serbb"; reset = 4; sck = 7; mosi = 3; miso = 8; ; programmer id = "avrftdi"; desc = "FT2232D based generic programmer"; type = "avrftdi"; connection_type = usb; usbvid = 0x0403; usbpid = 0x6010; usbvendor = ""; usbproduct = ""; usbdev = "A"; usbsn = ""; #ISP-signals - lower ADBUS-Nibble (default) reset = 3; sck = 0; mosi = 1; miso = 2; |
Выходим из редактора и сохраняем файл (CTL+X и Y).
Для корректной работы программатора Громова в ОС Linux нужно предварительно сконфигурировать последовательный порт (Serial Port, RS-232 Port), поскольку на данный момент при запуске программа avrdude сама не производит конфигурации порта. Если при записи прошивки в МК avrdude выводит сообщение о проблеме с верификацией то очень вероятно что нужно произвести реконфигурацию COM-порта: Для выполнения конфигурации воспользуемся программой stty. Gодробные параметры работы которой хорошо расписаны в MAN-страничке.
1 |
man stty |
Для вывода на экран текущих настроек порта /dev/ttyS0 (первый COM-порт) выполним команду:
1 |
stty </dev/ttyS0 |
А теперь выполним конфигурацию порта командой:
1 |
stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflsh </dev/ttyS0 |
Примечание: примите к вниманию что если у вас в компьютере несколько COM-портов то путь к файлу порта /dev/ttyS0 нужно изменить в соответствии с номером используемого порта, например /dev/ttyS2 – это третий COM-порт.
После выполнения команды конфигурации полезно посмотреть изменилась ли конфигурация порта и как, для этого нужно выполнить предыдущую команду.
Содержимое вывода команды должно быть примерно вот в таком виде:
1 2 3 4 5 6 7 |
root@ham:/home/dima# stty </dev/ttyS0 speed 9600 baud; line = 0; min = 1; time = 0; ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflsh root@ham:/home/dima# |
Настройки, которые мы задали командой, действуют до перезагрузки ОС. Команду для конфигурации порта можно добавить в автозагрузку вашей операционной системы Linux или же запускать один раз перед работой с программой avrdude.
Тестирование и работа с программаторами
После выполнения приведенных выше подготовок все готово к работе, приступим к тестированию нашей связки программатор + микроконтроллер.
Первым делом давайте проверим все ли правильно связано и сможет ли программа avrdude “увидеть” микроконтроллер, никакой записи и изменений вносить в AVR чип мы не будем, только тест.
1 |
avrdude -p m16 -c gromov -P /dev/ttyS0 -n |
Если все подключено и настроено как нужно то то вывод программы будет выглядеть вот таким образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@ham:/home/dima# avrdude -p m16 -c gromov -P /dev/ttyS0 -n avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9403 (probably m16) avrdude: safemode: Fuses OK (E:FF, H:DF, L:BF) avrdude done. Thank you. root@ham:/home/dima# |
Для получения более подробной информации о подключенном микроконтроллере можно добавить к команде ключ “-v”.
А теперь давайте считаем прошивку и фьюзы микроконтроллера что хранится во Flash-памяти и сохраним ее в файл.
1 |
avrdude -p m16 -c gromov -P /dev/ttyS0 -U flash:r:/tmp/m16chip_flash_dump.hex:i -U hfuse:r:/tmp/hfuse.hex:i -U lfuse:r:/tmp/lfuse.hex:i |
После выполнения команды во временной директории /tmp должен появиться файл m16chip_flash_dump.hex что будет содержать данные из флешь-памяти микроконтроллера. там же будут лежать два файла с фьзами.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
root@ham:/home/dima# avrdude -p m16 -c gromov -P /dev/ttyS0 -U flash:r:/tmp/m16chip_flash_dump.hex:i -U hfuse:r:/tmp/hfuse.hex:i -U lfuse:r:/tmp/lfuse.hex:i avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9403 (probably m16) avrdude: reading flash memory: Reading | ################################################## | 100% 6.22s avrdude: writing output file "/tmp/m16chip_flash_dump.hex" avrdude: reading hfuse memory: Reading | ################################################## | 100% 0.00s avrdude: writing output file "/tmp/hfuse.hex" avrdude: reading lfuse memory: Reading | ################################################## | 100% 0.00s avrdude: writing output file "/tmp/lfuse.hex" avrdude: safemode: Fuses OK (E:FF, H:DF, L:BF) avrdude done. Thank you. |
Ниже представлены команды для записи:
1 |
avrdude -p m16 -c gromov -P /dev/ttyS0 -U flash:w:/tmp/m16chip_flash_dump.hex:i -U hfuse:w:/tmp/hfuse.hex:i -U lfuse:w:/tmp/lfuse.hex:i |
результат выполнения комманды будет примерно таким:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9403 (probably m16) avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "/tmp/m16chip_flash_dump.hex" avrdude: writing flash (14798 bytes): Writing | ################################################## | 100% 6.32s avrdude: 14798 bytes of flash written avrdude: verifying flash memory against /tmp/m16chip_flash_dump.hex: avrdude: load data flash data from input file /tmp/m16chip_flash_dump.hex: avrdude: input file /tmp/m16chip_flash_dump.hex contains 14798 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 5.64s avrdude: verifying ... avrdude: 14798 bytes of flash verified avrdude: reading input file "/tmp/hfuse.hex" avrdude: writing hfuse (1 bytes): Writing | ################################################## | 100% 0.01s avrdude: 1 bytes of hfuse written avrdude: verifying hfuse memory against /tmp/hfuse.hex: avrdude: load data hfuse data from input file /tmp/hfuse.hex: avrdude: input file /tmp/hfuse.hex contains 1 bytes avrdude: reading on-chip hfuse data: Reading | ################################################## | 100% 0.00s avrdude: verifying ... avrdude: 1 bytes of hfuse verified avrdude: reading input file "/tmp/lfuse.hex" avrdude: writing lfuse (1 bytes): Writing | ################################################## | 100% 0.01s avrdude: 1 bytes of lfuse written avrdude: verifying lfuse memory against /tmp/lfuse.hex: avrdude: load data lfuse data from input file /tmp/lfuse.hex: avrdude: input file /tmp/lfuse.hex contains 1 bytes avrdude: reading on-chip lfuse data: Reading | ################################################## | 100% 0.00s avrdude: verifying ... avrdude: 1 bytes of lfuse verified avrdude: safemode: Fuses OK (E:FF, H:DF, L:BF) avrdude done. Thank you. |
На этом всё. В написании данной статьи были использованы данные вот с этих сайтов. За что им огромная благодарность!
1) ссылка 1
2) ссылка 2
3) ссылка 3