Настройка среды и работа с программаторами для AVR микроконтроллеров в Linux
Приведены особенности настройки и использования USBAsp, COM и LPT программаторов при работе с программой avrdude в операционной системе Linux. Попробуем считать и записать прошивку микроконтроллера (МК) используя программатор USBAsp.
Для работы и экспериментов нам понадобится уже подключенный к AVR микроконтроллеру программатор, как это сделать мы уже подробно рассматривали в одной из статей.
Перейдем к настройке портов и программы avrdude для работы с различными программаторами под Linux.
Настройка прав доступа для программатора USBAsp
Что делать если программа avrdude в ОС Linux не видит программатор что подключен к USB порту? — подобные вопросы в сети возникают довольно часто. Программа avrdude сообщает о том что не может найти программатор:
avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc
Поэтому первое что нам нужно сделать так это дать права обычным пользователям в Linux на использование устройства USBAsp, что подключен к USB порту. По умолчанию к данным устройствам имеет доступ только суперпользователь (root).
Зная код производителя и код устройства для программатора USBAsp нужно написать правило в специальном скрипте для подсистемы «usb» в Linux в котором разрешить использование устройства с такими идентификаторами любым пользователем или же ограничить права только указанной группой пользователей.
Для начала сверим идентификаторы устройства и убедимся что у нас действительно программатор USBAsp. Подключаем программатор к USB порту ноутбука и смотрим лог последних событий системы за текущий день:
Или же используем команду в Debian Linux 8 и выше (где используется systemd):
К примеру, в конце вывода последней команды увидим вот что:
Oct 11 13:11:52 alpha5 kernel: usb 1-2: new low-speed USB device number 9 using xhci_hcd Oct 11 13:11:52 alpha5 kernel: usb 1-2: New USB device found, idVendor=16c0, idProduct=05dc Oct 11 13:11:52 alpha5 kernel: usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 Oct 11 13:11:52 alpha5 kernel: usb 1-2: Product: USBasp Oct 11 13:11:52 alpha5 kernel: usb 1-2: Manufacturer: www.fischl.de
Здесь код производителя нашего программатора — 16c0, а код продукта — 05dc, все Ок.
Отключаем программатор от компьютера и создадим файл с правилом что разрешает доступ к программатору USBAsp всем пользователям на компьютере, выполним команду:
sudo nano /etc/udev/rules.d/60-objdev.rules
После запуска откроется текстовый редактор, вставьте в него вот этот код:
SUBSYSTEM=="usb", ENV=="usb_device", ATTRS=="16c0", ATTRS=="05dc", MODE="0666", SYMLINK+="USBasp"
Выходим из редактора и сохраняем файл (CTL+X и Y).
Для того чтобы в Linux наш скрипт заработал можно перезагрузить ОС или выполнить перезапуск подсистемы «usb» командой:
sudo /etc/init.d/udev restart
Теперь можно работать с программатором USBAsp в программе avrdude из под обычного пользователя(не суперпользователя).
Настройка программатора Громова (COM-порт) в Linux
Первым делом нужно добавить программатор Громова с его идентификатором и настройками в конфигурацию программы avrdude. Чтобы не править основной конфигурационный файл мы создадим дополнительный пользовательский конфигурационный файл в домашней директории, выполним команду:
где USER — єто имя вашего пользователя под которым вы работаете.
Вставим в редактор следующие данные:
programmer ; baudrate = 9600; desc = "serial port banging, reset=dtr sck=rts mosi=txd miso=cts"; type = "serbb"; reset = 4; sck = 7; mosi = 3; miso = 8; ;
Выходим из редактора и сохраняем файл (CTL+X и Y).
Для корректной работы программатора Громова в ОС Linux нужно предварительно сконфигурировать последовательный порт (Serial Port, RS-232 Port), поскольку на данный момент при запуске программа avrdude сама не производит конфигурации порта.
Если при записи прошивки в МК avrdude выводит сообщение о проблеме с верификацией то очень вероятно что нужно произвести переконфигурацию COM-порта:
avrdude: verification error, first mismatch at byte 0x0000 0x0e != 0x00 avrdude: verification error; content mismatch
Для выполнения конфигурации воспользуемся программой stty, подробные параметры работы которой хорошо расписаны в MAN-страничке.
Для вывода на экран текущих настроек порта /dev/ttyS0 (первый COM-порт) выполним команду:
А теперь выполним конфигурацию порта командой:
stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflsh
Примечание: примите к вниманию что если у вас в компьютере несколько COM-портов то путь к файлу порта /dev/ttyS0 нужно изменить в соответствии с номером используемого порта, например /dev/ttyS2 - это третий COM-порт.
После выполнения команды конфигурации полезно посмотреть изменилась ли конфигурация порта и как, для этого нужно выполнить предыдущую команду.
Содержимое вывода команды должно быть примерно вот в таком виде:
speed 9600 baud; line = 0; eof = ; start = ; stop = ; min = 0; time = 0; ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflsh
Настройки, которые мы задали командой, действуют до перезагрузки ОС. Команду для конфигурации порта можно добавить в автозагрузку вашей операционной системы Linux или же запускать один раз перед работой с программой avrdude.
Настройка программатора используя LPT-порт в Linux
В настройках программы avrdude по умолчанию прописан программатор "dapa", его описание "Direct Parallel AVR Access Cable".
Программатор на основе LPT-порта никаких дополнительных настроек в Linux не потребует, можно приступать к работе, Plug and Play in Linux! 🙂
Тестирование и работа с программаторами
После выполнения приведенных выше подготовок все готово к работе, приступим к тестированию нашей связки программатор + микроконтроллер.
Ниже будут приведены команды отдельно для каждого типа программаторов:
Все примеры буду приводить для микроконтроллера ATmega8 (m8). Для программатора Громова в командах будет использован 1-й COM-порт /dev/ttyS0, а для программатора DAPA - первый LPT-порт /dev/parport0.
Подробно узнать о всех ключах запуска программы avrdude вы вы всегда можете вот ТУТ.
Первым делом давайте проверим все ли правильно связано и сможет ли программа avrdude "увидеть" микроконтроллер, никакой записи и изменений вносить в AVR чип мы не будем, только тест.
Проверка для программатора USBAsp:
avrdude -p m8 -c usbasp -P usb -n
Проверка для программатора Громова:
avrdude -p m8 -c gromov -P /dev/ttyS0 -n
Проверка для программатора DAPA:
avrdude -p m8 -c dapa -P /dev/parport0 -n
Если все подключено и настроено как нужно то то вывод программы будет выглядеть вот таким образом:
Рис. 1. Успешная проверка, у программы avrdude получилось связаться с AVR микроконтроллером.
Для получения более подробной информации о подключенном микроконтроллере можно добавить к команде ключ "-v", вот пример вывода для USBAsp:
Рис. 2. Проверка, вывод программы avrdude с опцией -v (verbose).
А теперь давайте считаем прошивку микроконтроллера что хранится во Flash-памяти и сохраним ее в файл.
Считывание Flash для программатора USBAsp:
avrdude -p m8 -c usbasp -P usb -U flash:r:/tmp/m8chip_flash_dump.hex:i
Считывание Flash для программатора Громова:
avrdude -p m8 -c gromov -P /dev/ttyS0 -U flash:r:/tmp/m8chip_flash_dump.hex:i
Считывание Flash для программатора DAPA:
avrdude -p m8 -c dapa -P /dev/parport0 -U flash:r:/tmp/m8chip_flash_dump.hex:i
После выполнения команды во временной директории /tmp должен появиться файл m8chip_flash_dump.hex что будет содержать данные из флешь-памяти микроконтроллера.
Рис. 3. Считываем flash памяти микроконтроллера в файл при помощи avrdude.
В следующих примерах мы выполним запись прошивки во Flash-память AVR микроконтроллера, используя данные из файла в формате Intel HEX. Для этого создадим файл test_program.hex во временной папке /tmp и наполним его тестовыми данными. Создадим файл и откроем его для редактирования командой:
Скопируйте в редактор предоставленный ниже код и сохраните файл (CTRL+X и Y). Данная прошивка заставит мигать светодиод что подключен к 2-й ножке (PD0) микроконтроллера ATmeag8 (пример кода именно для этой модели):
:1000000012C019C018C017C016C015C014C013C044 :1000100012C011C010C00FC00EC00DC00CC00BC06C :100020000AC009C008C011241FBECFE5D4E0DEBF5E :10003000CDBF02D017C0E4CF889A909A2FE789EA03 :1000400093E0215080409040E1F700C0000090987C :100050002FE789EA93E0215080409040E1F700C00B :080060000000EBCFF894FFCF84 :00000001FF
Ниже представлены команды для записи прошивки с использованием разных программаторов.
Запись прошивки во Flash для программатора USBAsp:
avrdude -p m8 -c usbasp -P usb -U flash:w:/tmp/test_program.hex
Запись прошивки во Flash для программатора Громова:
avrdude -p m8 -c gromov -P /dev/ttyS0 -U flash:w:/tmp/test_program.hex
Запись прошивки во Flash для программатора DAPA:
avrdude -p m8 -c dapa -P /dev/parport0 -U flash:w:/tmp/test_program.hex
Сразу после выполнения команды по записи прошивки в микроконтроллер ATmega8 должен замигать светодиод. Вывод команды avrdude в процессе работы выглядит следующим образом:
Рис. 4. Процесс записи прошивки во Flash-память микроконтроллера.
Программа avrdude говорит что все ОК, записано во флешь-память и проверено 104 байта данных.
Рис. 5. На 2й ножке (PD0) микроконтроллера ATmega8 высокий уровень - 5В.
Заключение
В данной статье мы разобрались с настройкой AVR программаторов в операционной системе GNU Linux, привели простейшие команды для проверки, чтения и записи прошивки в микроконтроллер используя мощную программу avrdude.
В следующей статье мы напишем простую программу для микроконтроллера на языке программирования Ассемблер (Assembler), которая заставит поочередно мигать два разноцветных светодиода - олучится такая себе имитация полицейской мигалки.