Naja, normalerweise macht man da ein #include <sam.h> drüber.
Allerdings ist die Toolchain nicht so schön bequem wie beim AVR,
man muss die passenden Include-Pfade mehr oder minder mit der Hand
setzen, und auch das MCU-#define, also bspw. -D__SAM4E16E__ mit
übergeben. Hier ein Beispiel-Makefile:
1 | CC=arm-none-eabi-gcc
|
2 |
|
3 | CMSIS=../CMSIS_Atmel
|
4 |
|
5 | CDEFS=-D__SAM4E16E__
|
6 | COPTS=-g -O -mthumb -DARM_MATH_CM4=true -mcpu=cortex-m4 -std=gnu99 -Wall -Wextra
|
7 | CINCS=-I$(CMSIS)/Device/ATMEL -I$(CMSIS)/Device/ATMEL/sam4e/include -I$(CMSIS)/CMSIS/Include
|
8 |
|
9 | CFLAGS=$(CDEFS) $(COPTS) $(CINCS)
|
10 | LDFLAGS=-mthumb -mcpu=cortex-m4 -nostartfiles -Wl,-Map=test.map -L$(CMSIS)/Device/ATMEL/sam4e/source/as_gcc -T$(CMSIS)/Device/ATMEL/sam4e/source/as_gcc/sam4e16e_flash.ld
|
11 |
|
12 | all: test.elf
|
13 |
|
14 | test.elf: test.c
|
15 | $(CC) -o test.elf $(CFLAGS) $(LDFLAGS) $(CMSIS)/Device/ATMEL/sam4e/source/as_gcc/startup_sam4e.c $(CMSIS)/Device/ATMEL/sam4e/source/system_sam4e.c test.c
|
16 |
|
17 | .PHONY: clean
|
18 | clean:
|
19 | rm -f test.elf test.map *.o
|
Das entsprechende test.c fängt etwa so an:
1 | #include "sam.h"
|
2 |
|
3 | void _init(void)
|
4 | {
|
5 | }
|
6 |
|
7 | int
|
8 | main(void)
|
9 | {
|
10 | system_init_flash(120000000);
|
11 | SystemInit();
|
12 | SUPC->SUPC_CR = SUPC_CR_KEY_PASSWD | SUPC_CR_XTALSEL | SUPC_CR_VROFF_NO_EFFECT;
|
13 | int i;
|
14 | for (i = 0; i < 10000; i++)
|
15 | if (SUPC->SUPC_SR & SUPC_SR_OSCSEL)
|
16 | break;
|
17 |
|
18 | PIOD->PIO_PER = 1 << 22;
|
19 | PIOD->PIO_OER = 1 << 22;
|
20 | PIOD->PIO_SODR = 1 << 22;
|
21 | …
|