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++) {}
}
}