Register zugriff bei Cortex-M4(SAM4s)

Gast #4082525
Lesenswert?

Hallo,
ich versuche mich derzeit auf einem Atmel SAMA4S Prozessor.
Leider hänge ich bereits ganz am Anfang: beim Register zugriff.
Bei der ATega8 Serie war das ja recht einfach und bei der AVR32 auch.
jedoch habe ich keinen schimmre wie ich ohne AFS auf die Pereferie 
Funktionen zugreifen kann.
ich habe bereits sogar die Adresse direkt versucht:
- 0x400E1200 = 1<<32; // PIOC Register

Würde mich freuen wenn mir einer die richtige Syntax anahnd eines 
einfachen Beispiels zeigen könnte.

grüße
Martin
Gast #4082572
Lesenswert?

A. K. schrieb:
> Üblicherweise verwendet mal allerdings die vordefinierten Namen aus den
> zuständigen Include-Files,

Die Dateien dazu gibt es im Atmel Toolchain Verzeichnis, heissen
allesamt pio*.h und stehen für jede Prozessorfamilie im eigenen
Unterverzeichnis, und die braucht man sich daher nicht explizit
herunterzuladen. (einfach mal die Windows-Suchfunktion anwerfen)
Moderator Persönliche Seite #4082582
Lesenswert?

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

Gast #4082589
Lesenswert?

Hallo,
vielen dank so weit mit
 *((uint32_t*)0x400E1200) = 1<<23; funktioniert es.
Nach Suchen hab ichs dann auch in PIOX.h gefunden.

ich habe zuerst in der PIO.h gesucht und dort werden nur über Strukturen 
die einzelnen Bit beschrieben.



Die Register werden über:
REG_PIOC_OER = PIO_PER_P23; // 1<<23

Beschrieben.
Alle anderen Register werden über REG_XXX angesprochen

vielen dank
grüße
Martin

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren