SYSTICK programmering av enkel räknarkrets

4.2.1 Klockfrekvensen i ett MD407-system är 168 MHz. Hur många klockcykler motsvaras då av 100 mikrosekunder?

Eftersom 1 mikrosekund tar 168 klockcykler 
motsvarar 100 mikrosekunder 16800 klockcykler. 


4.2.2 Visa med en funktion:void delay100micro( void ), hur SysTick kan användas för att skapa en blockerande fördröjning om 100 mikrosekunder .

#define		STK_CTRL 	((volatile unsigned int *)(0xE000E010))  
#define		STK_LOAD 	((volatile unsigned int *)(0xE000E014))  
#define		STK_VAL		((volatile unsigned int *)(0xE000E018))  
void delay100micro( void )
{
 /* SystemCoreClock = 168000000 */
 *STK_CTRL = 0;
 *STK_LOAD = ( (16800) -1 );
 *STK_VAL = 0;
 *STK_CTRL = 5;
 while( (*SysTickCtrl & 0x10000 )== 0 )
	 ;
 *STK_CTRL = 0;
}


4.2.3 Visa med en funktion: void delay10sec( void ) hur SysTick kan användas för att skapa en blockerande fördröjning om 10 sekunder. Kretsen kan dock inte programmeras för så långa fördröjningar, basera därför i stället din lösning på realtidsfördröjningar om 10ms.

#define		STK_CTRL 	((volatile unsigned int *)(0xE000E010))  
#define		STK_LOAD 	((volatile unsigned int *)(0xE000E014))  
#define		STK_VAL		((volatile unsigned int *)(0xE000E018))  
void delay10sec( void )
{
  for( int i = 0; i < 1000; i++)
  {
    /* SystemCoreClock = 168000000 */
    *STK_CTRL = 0;
    *STK_LOAD = ( (1680000) -1 );
    *STK_VAL = 0;
    *STK_CTRL = 5;
    while( (*SysTickCtrl & 0x10000 )== 0 );
    *STK_CTRL = 0;
  }
}


4.2.4 Visa hur man kan implementera icke-blockerande fördröjning via två funktioner:
void delay100micro( void ) som initierar en fördröjning och
int delay_is_active( void ) som kontrollerar om fördröjningen är slutförd och i så fall återställer SysTick och returnerar 0, annars returneras 1.

#define		STK_CTRL 	((volatile unsigned int *)(0xE000E010))  
#define		STK_LOAD 	((volatile unsigned int *)(0xE000E014))  
#define		STK_VAL		((volatile unsigned int *)(0xE000E018))  
void delay100micro( void )
{
 /* SystemCoreClock = 168000000 */
 *STK_CTRL = 0;
 *STK_LOAD = ( (16800) -1 );
 *STK_VAL = 0;
 *STK_CTRL = 5;
}

int delay_is_active( void )
{
  if(*SysTickCtrl & 0x10000 )
  {
    *STK_CTRL = 0;
    return 0;
  }
  return 1;
}