Advertisement
Guest User

Untitled

a guest
May 20th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.77 KB | None | 0 0
  1. /*
  2.  *  startup.c
  3.  *
  4.  */
  5. void startup(void) __attribute__((naked)) __attribute__((section (".start_section")) );
  6.  
  7. #ifdef SIMULATOR
  8. #define DELAY_COUNT 100
  9. #else
  10. #define DELAY_COUNT 1000000
  11. #endif
  12. #define GPIO_D_MODER (volatile unsigned int *) 0X40020C00
  13. #define GPIO_D_ODR_LOW (volatile unsigned int *) (0X40020C00 + 0x14)
  14. #define SCB_VTOR (volatile unsigned int *) 0xE000ED08
  15.  
  16. #define STK_LOAD (volatile unsigned int *) (0xE000E014)
  17. #define STK_CTRL (volatile unsigned int *) (0xE000E010)
  18. #define STK_VAL (volatile unsigned int *) (0xE000E018)
  19.  
  20. static volatile int systick_flag;
  21. static volatile int delay_count;
  22.  
  23. void startup ( void )
  24. {
  25. __asm volatile(
  26.     " LDR R0,=0x2001C000\n"     /* set stack */
  27.     " MOV SP,R0\n"
  28.     " BL main\n"                /* call main */
  29.     "_exit: B .\n"              /* never return */
  30.     ) ;
  31. }
  32.  
  33. void handler_X ( void )
  34. {
  35.     *GPIO_D_ODR_LOW = ~*GPIO_D_ODR_LOW;
  36. }
  37.  
  38. void init_handler_X(void)
  39. {
  40.     * ( (void (**) (void) ) 0x2001C03C) = handler_X;
  41.     systick_flag = 0;
  42. }
  43.  
  44. void init_app (void)
  45. {
  46.     /* Initiera port D och undantagsvektor */
  47.     *GPIO_D_MODER = 0x00005555;
  48.     *SCB_VTOR = 0x2001C000;
  49.     delay_count = DELAY_COUNT;
  50.    
  51.     init_handler_X();
  52.    
  53. }
  54.  
  55.  
  56. void delay_1mikro(void)
  57. {
  58.     systick_flag = 0;
  59.     *STK_CTRL = 0;
  60.     *STK_LOAD = ( 168- 1);
  61.     *STK_VAL = 0;
  62.     *STK_CTRL = 7;
  63.    
  64. }
  65.  
  66. void delay (unsigned int count)
  67. {
  68.     if ( count == 0 )
  69.     {
  70.         return;
  71.     }
  72.    
  73.     delay_count = count;
  74.     systick_flag = 0;
  75.     delay_1mikro();
  76. }
  77.  
  78. void systick_irq_handler (void)
  79. {
  80.     *STK_CTRL = 0;
  81.     delay_count--;
  82.     if (delay_count > 0)
  83.     {
  84.         delay_1mikro();
  85.     }
  86.     else
  87.     {
  88.         systick_flag = 1;
  89.     }
  90. }
  91.  
  92. void main(void)
  93. {
  94.     init_app();
  95.     *GPIO_D_ODR_LOW = 0;
  96.     delay (DELAY_COUNT);
  97.     *GPIO_D_ODR_LOW = 0xFF;
  98.     while (1)
  99.     {
  100.         if (systick_flag)
  101.             break;
  102.     }
  103.    
  104.     *GPIO_D_ODR_LOW = 0;
  105.    
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement