Created
August 6, 2019 02:17
-
-
Save davepeake/7f137fae666dc852accf400660a1730e to your computer and use it in GitHub Desktop.
Simple blinky C code to test writing to bare metal Arduino Uno
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <avr/io.h> | |
#include <util/delay.h> | |
int main(void){ | |
// LED on PB5 | |
DDRB |= (1 << 5); | |
while(1){ | |
PORTB |= (1 << 5); | |
_delay_ms(1000); | |
PORTB = 0; | |
_delay_ms(1000); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### Project name (also used for output file name) | |
PROJECT = blinky | |
### Source files and search directory | |
CSRC = blinky.c | |
ASRC = | |
VPATH = | |
### Target device | |
DEVICE = atmega328p | |
### Optimization level (0, 1, 2, 3, 4 or s) | |
OPTIMIZE = s | |
### C Standard level (c89, gnu89, c99 or gnu99) | |
CSTD = gnu89 | |
### Include dirs, library dirs and definitions | |
LIBS = | |
LIBDIRS = | |
INCDIRS = | |
DEFS = F_CPU=8000000 | |
ADEFS = $(DEFS) | |
### Warning contorls | |
WARNINGS = all extra | |
### Output directory | |
OBJDIR = obj | |
### Output file format (hex, bin or both) and debugger type | |
OUTPUT = hex | |
HEXFMT = ihex | |
DEBUG = dwarf-2 | |
### Programs to build porject | |
CC = avr-gcc | |
OBJCOPY = avr-objcopy | |
OBJDUMP = avr-objdump | |
SIZE = avr-size | |
NM = avr-nm | |
# Define all object files | |
COBJ = $(CSRC:.c=.o) | |
AOBJ = $(ASRC:.S=.o) | |
COBJ := $(addprefix $(OBJDIR)/,$(COBJ)) | |
AOBJ := $(addprefix $(OBJDIR)/,$(AOBJ)) | |
PROJECT := $(OBJDIR)/$(PROJECT) | |
# Flags for C files | |
CFLAGS += -std=$(CSTD) | |
CFLAGS += -g$(DEBUG) | |
CFLAGS += -mmcu=$(DEVICE) | |
CFLAGS += -O$(OPTIMIZE) -mcall-prologues | |
CFLAGS += $(addprefix -W,$(WARNINGS)) | |
CFLAGS += $(addprefix -I,$(INCDIRS)) | |
CFLAGS += $(addprefix -D,$(DEFS)) | |
CFLAGS += -Wp,-M,-MP,-MT,$(OBJDIR)/$(*F).o,-MF,$(OBJDIR)/$(*F).d | |
CFLAGS += -Wno-deprecated-declarations -D__PROG_TYPES_COMPAT__ | |
# Assembler flags | |
ASFLAGS += $(addprefix -D,$(ADEFS)) -Wa,-gstabs,-g$(DEBUG) | |
ALL_ASFLAGS = -mmcu=$(DEVICE) -I. -x assembler-with-cpp $(ASFLAGS) | |
# Linker flags | |
LDFLAGS += -Wl,-Map,$(PROJECT).map | |
# Default target. | |
all: version build size | |
ifeq ($(OUTPUT),hex) | |
build: elf hex lst sym | |
hex: $(PROJECT).hex | |
else | |
ifeq ($(OUTPUT),bin) | |
build: elf bin lst sym | |
bin: $(PROJECT).bin | |
else | |
ifeq ($(OUTPUT),both) | |
build: elf hex bin lst sym | |
hex: $(PROJECT).hex | |
bin: $(PROJECT).bin | |
else | |
$(error "Invalid format: $(OUTPUT)") | |
endif | |
endif | |
endif | |
elf: $(PROJECT).elf | |
lst: $(PROJECT).lst | |
sym: $(PROJECT).sym | |
# Display compiler version information. | |
version : | |
@$(CC) --version | |
# Create final output file from ELF output file. | |
%.hex: %.elf | |
@echo | |
$(OBJCOPY) -j .text -j .data -j .eeprom -j .fuse -O $(HEXFMT) $< $@ | |
%.bin: %.elf | |
@echo | |
$(OBJCOPY) -j .text -j .data -O binary $< $@ | |
# Create extended listing file from ELF output file. | |
%.lst: %.elf | |
@echo | |
$(OBJDUMP) -h -S -C $< > $@ | |
# Create a symbol table from ELF output file. | |
%.sym: %.elf | |
@echo | |
$(NM) -n $< > $@ | |
# Display size of file. | |
size: | |
@echo | |
$(SIZE) -C --mcu=$(DEVICE) $(PROJECT).elf | |
# Link: create ELF output file from object files. | |
%.elf: $(AOBJ) $(COBJ) | |
@echo | |
@echo Linking... | |
$(CC) $(CFLAGS) $(AOBJ) $(COBJ) --output $@ | |
# Compile: create object files from C source files. ARM or Thumb(-2) | |
$(COBJ) : $(OBJDIR)/%.o : %.c | |
@echo | |
@echo $< : | |
$(CC) -c $(CFLAGS) $< -o $@ | |
# Assemble: create object files from assembler source files. ARM or Thumb(-2) | |
$(AOBJ) : $(OBJDIR)/%.o : %.S | |
@echo | |
@echo $< : | |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ | |
# Target: clean project. | |
clean: | |
@echo | |
rm -f -r $(OBJDIR) | exit 0 | |
# Include the dependency files. | |
-include $(shell mkdir $(OBJDIR) 2>/dev/null) $(wildcard $(OBJDIR)/*.d) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment