Как программировать avr в IDE Lazarus, чтоб компилировался hex-файл? У меня ушло много времени на понимание поэтому пишу здесь, чтоб другие не мучались, а сразу пользовались.
Использование кросс-компиляции было основано на этой статье, в дальнейшем выкинуто всё лишнее (с моей точки зрения). Показываю как это заработало у меня.
Итак, для программирования микроконтроллеров (avr, arm и др.) на Lazarus необходимо скачать дополнительные ppu-файлы и другие вспомогательные модули. Это можно сделать несколькими способами:
-
fpcupdeluxe - скачивает все необходимые файлы и самостоятельно собирает кросс-компилятор: ppcrossavr.exe. Моя статья по настройке fpcupdeluxe: "Как получить компилятор для микроконтроллеров AVR с помощью Fpcupdeluxe";
-
Самостоятельно скачать из репозитория и собрать кросс-компилятор (для меня этот путь показался сложным);
-
по шагам wiki.freepascal.org.
Настройка целевой платформы в IDE Lazarus
1. Для настройки целевой платформы, для которого будет генериться hex-файл, необходимо указать ОС на которой будет выполняться код - embedded; семейство процессоров - avr и целевой процессор (субархитектура) - avr5, совместимы с теми, которые используются GCC (например, ATmega328p относится к avr5):
2. А так же выбрать конкретный процессор для программирования в "Параметры пользователя":

3. Для компиляции проекта нужно указать путь к компилятору. Открываем Параметры проекта --> Команды компилятора--> Команда --> C:\fpcupdeluxe\fpc\bin\i386-win32\ppcrossavr.exe:
5. Для того, чтобы Lazarus мог найти компилятор и дополнительные файлы необходимо один раз указать пути. Это можно сделать поправив в блокноте файл Lazarus "c:\lazarus\fpc\3.2.2\bin\i386-win32\fpc.cfg" (в конце файла):
#IFDEF EMBEDDED
#IFDEF CPUAVR
-FDC:\fpcupdeluxe\cross\bin\avr-embedded\
-XPavr-embedded-
-FlC:\fpcupdeluxe\cross\lib\avr-embedded\$fpcsubarch\
-Fuc:\fpcupdeluxe\fpc\bin\i386-win32\
-FuC:\fpcupdeluxe\fpc\units\avr-embedded\$fpcsubarch\
-FuC:\fpcupdeluxe\fpc\units\avr-embedded\$fpcsubarch\*
-FuC:\fpcupdeluxe\fpc\units\avr-embedded\$fpcsubarch\rtl
-FuC:\fpcupdeluxe\fpcsrc\rtl\units\avr-embedded
-Fic:\fpcupdeluxe\fpcsrc\rtl\inc\
#ENDIF CPUAVR
#ENDIF EMBEDDED
Тестирование
program Timers;
{$mode objfpc}{$H-}
{$goto on}
uses
uInterrupts, me_avr;
//=== Entry point =============================================================
begin
DDRC := $FF; // настраиваем все линии порта C на вывод
//PORTC := $00; // выводим лог. 0 на все линии порта C
//=== Main loop =========================================
while True do
begin
PORTC := $FF; // выводим лог. 1 на все линии порта C
Delay(255); // задержка 1000 мс = 1 с
delay(255);
PORTC := $00; // выводим лог. 0 на все линии порта C
delay(255); // задержка 1000 мс = 1 с
end;//Main loop
end.
Процедура задержки "me_avr" (надо нормально написать):
unit me_avr;
{$mode objfpc}{$H-}
{$goto on}
interface
procedure Delay(MS: Byte); assembler;
implementation
procedure Delay(MS: Byte); assembler;
label __delay0;
asm
PUSH r31
mov r31, MS
__delay0:
DEC r31
BRNE __delay0
pop r31
end;
end.
Компиляция Ctrl+F9 (F9 не работает) заняла 0,1 сек в результате чего появились 3 файла: hex, bin и elf. Загружаем hex-файл в модель и видим, что прошивка работает:
(не равномерность мигания из-за подтормаживания компа)
Спасибо за внимание.