Arduino Zero mit ArduinoStart Konfigurieren

Gast #4482600
Lesenswert?

Atmel hat zur Konfiguration seiner ARM-Prozessoren das Online-Tool 
AtmelSTART enwickelt:

http://start.atmel.com/

Damit kann man kann man die Peripherie der ARM-Prozessoren konfigurieren 
und ein paar vorgefertigte Bibliotheksfunktionen einbinden.

Wenn man statt der Arduino Library lieber die Atmel-Funktionen benutzen 
will, kann man das am besten mit AtmelStart machen.

Ich stelle hier mal die Konfiguration des LED-Pins und der 
Delay-Funktionen für den Arduino-Zero zur Verfügung. Diese Konfiguration 
lässt sich wieder in die AtmelSTART Weboberfläche importieren und 
erweitern.

Der Code für das Blink-Programm würde dann so aussehen:
1
#include "atmel_start.h"
2
#include "atmel_start_pins.h"
3

4
int main(void)
5
{
6
  system_init();
7

8
  while(1) 
9
  {
10
    gpio_set_pin_level(LED,  false);
11
    delay_ms(1000);
12
    gpio_set_pin_level(LED,  true);
13
    delay_ms(1000);
14
  }
15
}
Angehängte Dateien:
Gast #4482899
Lesenswert?

Hier habe ich mal den passenden Code dazu geschrieben.
Im Vergleich zu den Orginal Arduino kann der optisch aber keinen Preis 
gewinnen. Ich finde die Arduino funktionen im Vergleich dazu gar nicht 
so schlecht.
1
#include "atmel_start.h"
2
#include "atmel_start_pins.h"
3
#include <stdlib.h>
4

5
struct io_descriptor *Io;
6

7
void init()
8
{
9
  adc_sync_enable(&ADC_0);
10
  usart_sync_get_io_descriptor(&USART_0, &Io);
11
  usart_sync_enable(&USART_0);
12
}
13
void toggleLed()
14
{
15
  static uint8_t flag=0;
16
  flag^=1;
17
  gpio_set_pin_level(LED,  flag);
18
}
19
#define NUMBEROFDIGITS 4
20
#define NUMBERBASE 10
21

22
int main(void)
23
{
24
  uint8_t   asciiBuffer[NUMBEROFDIGITS+1]={0};
25
  uint8_t    adcByteBuffer[2];
26
  uint16_t  wert;
27
  
28
  system_init();
29
  init();
30
  io_write(Io, (uint8_t *)"serial ADC example", 18);
31
  io_write(Io, (uint8_t *)"\n\r", 2);
32

33
  while(1) 
34
  {
35
    delay_ms(100);    
36
    adc_sync_read(&ADC_0, adcByteBuffer, 2);
37
    wert = adcByteBuffer[0]+((uint16_t)adcByteBuffer[1]<<8);
38
    itoa( wert, (char*)asciiBuffer, NUMBERBASE );
39
    io_write(Io, asciiBuffer, NUMBEROFDIGITS);  
40
    io_write(Io, (uint8_t *)"\n\r", 2);
41
    toggleLed();
42
  }
43
}
Gast #4487412
Lesenswert?

Bei AtmelSTART gibt es sogennante "Middleware" Module.
Mit einem davon lässt sich printf auf die UART umleiten. Damit wird der 
Code etwas übersichtlicher.
1
#include "atmel_start.h"
2
#include "atmel_start_pins.h"
3
#include "stdio_start.h"
4

5
void init()
6
{
7
  STDIO_REDIRECT_0_init();
8
  adc_sync_enable(&ADC_0);
9
}
10

11
uint16_t readAdc()
12
{
13
  uint8_t   adcByteBuffer[2];
14
  uint16_t  wert;
15
  adc_sync_read(&ADC_0, adcByteBuffer, 2);
16
  wert = adcByteBuffer[0]+((uint16_t)adcByteBuffer[1]<<8);
17
  return wert;
18
}
19

20
int main(void)
21
{
22
  system_init();
23
  init();
24
  
25
  printf("Arduino Zero Read ADC Example \n\r");
26

27
  while(1) 
28
  {
29

30
    printf("%d\n\r",readAdc());
31
    delay_ms(100);
32
  }
33
}
Angehängte Dateien:
Gast #4501387
Lesenswert?

Bei den vorigen Konfigurationen war der CPU-Takt auf nur 8Mhz 
eingestellt.
Hier die Konfiguration für einen schnelleren Takt.

Der folgende Pin-Toggle Code ergibt damit
1
#include "atmel_start.h"
2
#include "atmel_start_pins.h"
3
#include "stdio_start.h"
4

5
int main(void)
6
{
7
  system_init();
8

9
  while(1)
10
  {
11
    gpio_set_pin_level(LED,  0);
12
    gpio_set_pin_level(LED,  1);
13
  }
14
}

ergibt

Tlow: 628us
Thigh: 832us
Angehängte Dateien:
Gast #5108847
Lesenswert?

Hallo Max!

Attaches an Atmel studio project that I set up for the Adafruit Feather 
M0 that uses the same AtSamD21 chip as in the Arduino Zero. With this I 
have managed to get the USB port running as a virtual com port. For the 
USB you have to set the speed to 48MHz

Plenty comments in the main.c file

Hope it helps

Gert van Biljon
Angehängte Dateien:

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