04 ARM SAM4 – automatyczny reset

Podczas pierwszych testów układów SAM4S16C z rdzeniem ARM, możemy spotkać się ze zjawiskiem automatycznego resetu procesora, które następuję po około 14-16 sekundach od startu układu. Podczas pierwszego programu, który tylko zapala i gasi diodę nie widać takiego zjawiska, jeśli jednak na początku programu dodamy na chwilę stałe zapalanie diody jak w kodzie poniżej to zobaczymy zjawisko automatycznego resetu.

#include "sam.h"
#define LEDA (1<<10)
#define LEDB (1<<17)
int main(void)
{
/* Initialize the SAM system */
SystemInit();

PIOC->PIO_PER = (LEDA | LEDB); // Uruchomienie rejestru PIOC
PIOC->PIO_OER = (LEDA | LEDB); // Ustawia rejestr C jako wyjście
PIOC->PIO_PUDR = (LEDA | LEDB); // Wyłącza rezystroy podciągające

PIOC->PIO_SODR = LEDA;
PIOC->PIO_CODR = LEDB;
for(uint32_t i=0; i<200000;i++) { }  //Zapalenie diody na stałe na początku programu

/* Replace with your application code */
while (1)
{

PIOC->PIO_SODR = LEDA;
PIOC->PIO_CODR = LEDB;
for(uint32_t i=0; i<200000;i++) { }

PIOC->PIO_SODR = LEDB;
PIOC->PIO_CODR = LEDA;
for(uint32_t i=0; i<200000;i++) {}

}
}

Niekorzystne zjawisko jest związane z działaniem Watchdog, który to jest domyślnie włączony przy starcie procesora, aby wyłączyć funkcję, należy wpisać poniższą formułę, przed główną pętlą programu:

WDT->WDT_MR = WDT_MR_WDDIS;

Poniżej kod programu z zastosowaniem funkcji.

 

#include "sam.h"
#define LEDA (1<<10)
#define LEDB (1<<17)

int main(void)
{
/* Initialize the SAM system */
SystemInit();

WDT->WDT_MR = WDT_MR_WDDIS;

PIOC->PIO_PER = (LEDA | LEDB); // Uruchomienie rejestru PIOC
PIOC->PIO_OER = (LEDA | LEDB); // Ustawia rejestr C jako wyjście
PIOC->PIO_PUDR = (LEDA | LEDB); // Wyłącza rezystroy podciągające

PIOC->PIO_SODR = LEDA;
PIOC->PIO_CODR = LEDB;
for(uint32_t i=0; i<2000000;i++) { }

/* Replace with your application code */
while (1)
{

PIOC->PIO_SODR = LEDA;
PIOC->PIO_CODR = LEDB;
for(uint32_t i=0; i<200000;i++) { }

PIOC->PIO_SODR = LEDB;
PIOC->PIO_CODR = LEDA;
for(uint32_t i=0; i<200000;i++) {}

}
}