Basic boilerplate for programming AVR (arduino) in C.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Ondřej Hruška cfdc18d3c4 ADC new APIs and bugfix for 10bit 5 years ago
lib ADC new APIs and bugfix for 10bit 5 years ago
.gitignore Added dummy CMakeLists.txt for CLion support (still build with "make"!) 5 years ago
CMakeLists.txt added cleaned up and tested ADC support library 5 years ago
LICENSE Initial commit 7 years ago
Makefile added cleaned up and tested ADC support library 5 years ago some cleanup and formatting 7 years ago some cleanup and formatting 7 years ago
main.c some cleanup and formatting 7 years ago
style.astylerc added astylerc 7 years ago

AVR C Boilerplate

This is a basic boilerplate for programming AVRs in C.

The project aims to make programming Arduinos in C fun by providing support for basic functionality like GPIO and USART, so you can start developing without having the datasheet open all the time.

It is intended for ATmega328P (the chip in Arduinos), but can be easily adapted to other parts.


Before you can start coding, you need to install a few software packages:

  • avrdude - the flash tool
  • avr-gcc - compiler
  • avr-libc - libc implementation for AVR
  • avr-binutils - utils for manipulating AVR binaries
  • make - to run the Makefile

There's a good chance you already have make, the rest should be in your distribution's repos.

If you're on Arch:

# pacman -S base-devel avr-gcc avr-binutils avr-libc avrdude

If you're on Mac, you should be able to pull the stuff with brew.

Getting started

The provided main.c is a good starting point - it contains some simple demo code.

You can compile it with make and flash with make flash.

Before you can flash

First, check that the avrdude options in the file are correct for your system - especially the device and speed.

# AVRDUDE settings
PROG_BAUD = 57600
PROG_DEV  = /dev/ttyUSB0
PROG_TYPE = arduino

# Build the final AVRDUDE arguments
  • Adjust PROG_DEV to the device your board is connected to. On Linux it's usually /dev/ttyUSB0, but it can also be /dev/ttyACM0 or something else. On Mac, it'll be /dev/ On Windows it's some COMx.
    Linux and Mac users can use ls /dev to see their devices. Windows users will find this in their Device Manager.
  • You may also adjust the baudrate (PROG_BAUD). Some boards need 115200.

TIP: You can look what the Arduino IDE is using - it's running avrdude too.

Adding new files

  • If you add a new C file to the project, add an entry for it's .o (object file, created by the compiler before linking) to the OBJS list in the Makefile.
  • Similarly, if you add a new folder with header files, add it to INCL_DIRS.
  • In case you need printf (or printf with floats), enable the appropriate LD_FLAGS in the Makefile (it's well commented). Code size will - obviously - grow quite a bit.


  • The Arduino UNO bootloader has a quirk where Double Speed Asynchronous Mode for USART is enabled by default, so if you set your baud rate to 9600, you'd really get 19200.
    We correct this in the usart_init() function to keep things consistent and to avoid confusion.
    If you wish to turn this on however, you can do so by using usart_set_2x(true).