Advertisement
Guest User

ARE YOU KNOT ENTERTAINED!

a guest
Feb 22nd, 2018
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.60 KB | None | 0 0
  1. /*
  2. * startup.c
  3. *
  4. */
  5. void startup(void) __attribute__((naked)) __attribute__((section (".start_section")) );
  6.  
  7. //get ready for some defines!
  8. #define SYSCFG_BASE ((volatile unsigned int *) 0x40013800)
  9. #define SYSCFG_EXTICR1 ((volatile unsigned int *) 0x40013808)
  10. #define EXTI_IMR ((volatile unsigned int *) 0x40013C00)
  11. #define EXTI_FTSR ((volatile unsigned int *) 0x40013C0C)
  12. #define EXTI_RTSR ((volatile unsigned int *) 0x40013C08)
  13. #define EXTI_PR ((volatile unsigned int *) 0x40013C14)
  14. #define EXTI3_IRQVEC ((void (**) (void)) 0x2001C064)
  15. #define EXTI2_IRQVEC ((void (**) (void)) 0x2001C060)
  16. #define EXTI1_IRQVEC ((void (**) (void)) 0x2001C05C)
  17. #define EXTI0_IRQVEC ((void (**) (void)) 0x2001C058)
  18. #define NVIC_ISER0 ((volatile unsigned int *) 0xE000E100)
  19. #define NVIC_EXTI3_IRQ_BPOS (1<<9)
  20. #define NVIC_EXTI2_IRQ_BPOS (1<<8)
  21. #define NVIC_EXTI1_IRQ_BPOS (1<<7)
  22. #define NVIC_EXTI0_IRQ_BPOS (1<<6)
  23. #define EXTI3_IRQ_BPOS (1<<3)
  24. #define EXTI2_IRQ_BPOS (1<<2)
  25. #define EXTI1_IRQ_BPOS (1<<1)
  26. #define EXTI0_IRQ_BPOS (1<<0)
  27.  
  28. void startup ( void )
  29. {
  30. __asm volatile(
  31. " LDR R0,=0x2001C000\n" /* set stack */
  32. " MOV SP,R0\n"
  33. " BL main\n" /* call main */
  34. "_exit: B .\n" /* never return */
  35. ) ;
  36. }
  37.  
  38. typedef struct {
  39. union {
  40. struct {
  41. unsigned short MODER_LOW, MODER_HIGH;
  42. };
  43. unsigned int MODER;
  44. };
  45. unsigned short OTYPER;
  46. unsigned short reserved1;
  47. unsigned int OSPEEDR, PUPDR;
  48. union {
  49. unsigned short WHOLE;
  50. struct {
  51. unsigned char LOW, HIGH;
  52. };
  53. unsigned int reserved2;
  54. } IDR, ODR;
  55. } *PGPIO;
  56. te
  57. #define GPIO_D ((volatile PGPIO) 0x40020C00)
  58. #define GPIO_E ((volatile PGPIO) 0x40021000)
  59.  
  60.  
  61. int count = 0;
  62.  
  63. void irq0_handler()
  64. {
  65. GPIO_E->ODR.LOW |= 1<<4;
  66. GPIO_E->ODR.LOW &= ~(1<<4);
  67. count++;
  68.  
  69. //Kvittera avbrott från EXTI0
  70. *EXTI_PR |= EXTI0_IRQ_BPOS;
  71. }
  72.  
  73. void irq1_handler()
  74. {
  75. GPIO_E->ODR.LOW |= 1<<5;
  76. GPIO_E->ODR.LOW &= ~(1<<5);
  77. count++;
  78. //Kvittera avbrott från EXTI1
  79. *EXTI_PR |= EXTI1_IRQ_BPOS;
  80. }
  81.  
  82. void irq2_handler()
  83. {
  84. GPIO_E->ODR.LOW |= 1<<6;
  85. GPIO_E->ODR.LOW &= ~(1<<6);
  86. if(GPIO_D->ODR.HIGH){
  87. GPIO_D->ODR.HIGH = 0x00;
  88. } else {
  89. GPIO_D->ODR.HIGH = 0xFF;
  90. }
  91.  
  92. //Kvittera avbrott från EXTI2
  93. *EXTI_PR |= EXTI2_IRQ_BPOS;
  94. }
  95.  
  96.  
  97. void init_app()
  98. {
  99. //Sätt upp PD0-7 som visningsenhet
  100. GPIO_D->MODER_LOW = 0x5555;
  101.  
  102. //Sätt upp PD8-15 som diodramp
  103. GPIO_D->MODER = 0x55555555;
  104.  
  105. GPIO_E->MODER_LOW = 0x5500;
  106.  
  107. //Koppla PE3 till avbrottslina EXTI3
  108. *SYSCFG_EXTICR1 &= ~0x0FFF;
  109. *SYSCFG_EXTICR1 |= 0x0444;
  110.  
  111. //Konfigurera EXTI2-0 för att generera avbrott
  112. *EXTI_IMR |= EXTI2_IRQ_BPOS;
  113. *EXTI_IMR |= EXTI1_IRQ_BPOS;
  114. *EXTI_IMR |= EXTI0_IRQ_BPOS;
  115.  
  116. //Konfigurera för avbrott på negativ flank
  117. *EXTI_FTSR |= EXTI2_IRQ_BPOS;
  118. *EXTI_FTSR |= EXTI1_IRQ_BPOS;
  119. *EXTI_FTSR |= EXTI0_IRQ_BPOS;
  120.  
  121. //inget avbrott på positiv flank;
  122. *EXTI_RTSR &= ~EXTI2_IRQ_BPOS;
  123. *EXTI_RTSR &= ~EXTI1_IRQ_BPOS;
  124. *EXTI_RTSR &= ~EXTI0_IRQ_BPOS;
  125.  
  126. //Sätt upp avbrottsvektorer
  127. *EXTI2_IRQVEC = irq2_handler;
  128. *EXTI1_IRQVEC = irq1_handler;
  129. *EXTI0_IRQVEC = irq0_handler;
  130.  
  131. //Konfigurera de bitar i NVIC som kontrollerar den avbrottslina som EXTI2-0 kopplats till.
  132. *NVIC_ISER0 |= NVIC_EXTI2_IRQ_BPOS;
  133. *NVIC_ISER0 |= NVIC_EXTI1_IRQ_BPOS;
  134. *NVIC_ISER0 |= NVIC_EXTI0_IRQ_BPOS;
  135. }
  136.  
  137. void main(void)
  138. {
  139. init_app();
  140. while(1){
  141. GPIO_D->ODR.LOW = count;
  142. }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement