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; }