Clion & AVR

AVR CMake

Clion & AVRВот уже несколько лет пользуюсь CMake-ом, чтобы собирать проекты под AVR. Сподвиг на этом конечно же вышедший осенью 2014 Jetbrains CLion, который как оказалось идеально подходит для написания кода под Atmel AVR. Короче, рекомендую.
Возможно, для корректной работы нужно будет установить переменную среды AVR_FIND_ROOT_PATH — на папку с avr (содержащую lib и include), а так же папка с avr-gcc, avr-g++, avr-objcopy, avr-size должны находиться в PATH. Ну или доработать напильником generic-gcc-avr.cmake

В общем, шаблон тут: https://github.com/bevice/avr_cmake_template

Ну а для удобства простейший скрипт, который скачает, отвяжет от github и переименует проект:

#!/bin/bash
git clone git@github.com:bevice/avr_cmake_template.git $1
cd $1
git remote remove origin
sed -i '' -e   "s/avr_project_template/$1/g" CMakeLists.txt
bevice@host ~/tmp$ create_avr_project helloworld
Cloning into 'helloworld'...
remote: Counting objects: 43, done.
remote: Total 43 (delta 0), reused 0 (delta 0), pack-reused 43
Receiving objects: 100% (43/43), 8.30 KiB | 0 bytes/s, done.
Resolving deltas: 100% (22/22), done.
bevice@host ~/tmp$ tree helloworld/
helloworld/
├── CMakeLists.txt
├── generic-gcc-avr.cmake
├── readme.md
└── src
    ├── main.c
    └── main.h
 
1 directory, 5 files

Настройка проекта производится в файле CMakeLists.txt:

set(AVR_PROGRAMMER usbasp)   # прошиватор
set(AVR_UPLOADTOOL_PORT usb) # порт
set(AVR_MCU atmega328p)      # Чип
set(AVR_H_FUSE 0xDA)         # H-Fuse
set(AVR_L_FUSE 0xFF)         # L-Fuse
set(AVR_EX_FUSE 0×05)        # Ex-Fuse
set(MCU_SPEED "16000000UL")  # Частота кварца (F_CPU)

Поддерживается загрузка avrdude. Байты фьюзов ровно такие, какие видит avrdude и которые можно быстро прикинуть тут: engbedded.com.

Ну и сборка:

bevice@host ~/tmp/helloworld/build (master *)$ cmake ..
-- Current uploadtool is: avrdude
-- Current programmer is: usbasp
-- Current upload port is: usb
-- Current uploadtool options are: 
-- Current MCU is set to: atmega328p
-- Current H_FUSE is set to: 0xDA
-- Current L_FUSE is set to: 0xFF
-- Set CMAKE_FIND_ROOT_PATH to /usr/local/opt/avr-libc/avr
-- Set CMAKE_SYSTEM_INCLUDE_PATH to /usr/local/opt/avr-libc/avr/include
-- Set CMAKE_SYSTEM_LIBRARY_PATH to /usr/local/opt/avr-libc/avr/lib
-- The C compiler identification is GNU 6.2.0
-- The CXX compiler identification is GNU 6.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- avr-libc: /usr/local/opt/avr-libc/avr/lib/libc.a
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/bevice/tmp/helloworld/build
bevice@host ~/tmp/helloworld/build (master *)$ make
Scanning dependencies of target helloworld-atmega328p.elf
[ 20%] Building C object CMakeFiles/helloworld-atmega328p.elf.dir/src/main.c.obj
[ 40%] Linking C executable helloworld-atmega328p.elf
[ 40%] Built target helloworld-atmega328p.elf
Scanning dependencies of target helloworld
[ 60%] Generating helloworld-atmega328p.hex
   text    data     bss     dec     hex filename
    132       0       0     132      84 helloworld-atmega328p.elf
[ 80%] Generating helloworld-atmega328p-eeprom.hex
[100%] Generating helloworld-atmega328p.bin
   text    data     bss     dec     hex filename
    132       0       0     132      84 helloworld-atmega328p.elf
[100%] Built target helloworld
 
bevice@host ~/tmp/helloworld/build (master *)$ ls -1
CMakeCache.txt
CMakeFiles
Makefile
cmake_install.cmake
helloworld-atmega328p-eeprom.hex
helloworld-atmega328p.bin
helloworld-atmega328p.elf
helloworld-atmega328p.hex
helloworld-atmega328p.map

Все команды можно глянуть

make help

там их довольно много.