Button.ob07 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. (*
  2. Пример для STM32L152C-DISCO
  3. При нажатии на кнопку USER (PA0), меняется
  4. состояние светодиодов.
  5. *)
  6. MODULE Button;
  7. IMPORT SYSTEM;
  8. CONST
  9. GPIOA = 40020000H;
  10. GPIOAMODER = GPIOA;
  11. GPIOAOTYPER = GPIOA + 04H;
  12. GPIOAOSPEEDR = GPIOA + 08H;
  13. GPIOAPUPDR = GPIOA + 0CH;
  14. GPIOAIDR = GPIOA + 10H;
  15. GPIOAODR = GPIOA + 14H;
  16. GPIOABSRR = GPIOA + 18H;
  17. GPIOALCKR = GPIOA + 1CH;
  18. GPIOAAFRL = GPIOA + 20H;
  19. GPIOAAFRH = GPIOA + 24H;
  20. GPIOABRR = GPIOA + 28H;
  21. GPIOB = 40020400H;
  22. GPIOBMODER = GPIOB;
  23. GPIOBOTYPER = GPIOB + 04H;
  24. GPIOBOSPEEDR = GPIOB + 08H;
  25. GPIOBPUPDR = GPIOB + 0CH;
  26. GPIOBIDR = GPIOB + 10H;
  27. GPIOBODR = GPIOB + 14H;
  28. GPIOBBSRR = GPIOB + 18H;
  29. GPIOBLCKR = GPIOB + 1CH;
  30. GPIOBAFRL = GPIOB + 20H;
  31. GPIOBAFRH = GPIOB + 24H;
  32. GPIOBBRR = GPIOB + 28H;
  33. RCC = 40023800H;
  34. RCC_CR = RCC;
  35. RCC_AHBENR = RCC + 1CH;
  36. RCC_APB2ENR = RCC + 20H;
  37. RCC_APB1ENR = RCC + 24H;
  38. NVIC = 0E000E100H;
  39. NVIC_ISER0 = NVIC;
  40. NVIC_ISER1 = NVIC + 04H;
  41. NVIC_ISER2 = NVIC + 08H;
  42. NVIC_ICER0 = NVIC + 80H;
  43. NVIC_ICER1 = NVIC + 84H;
  44. NVIC_ICER2 = NVIC + 88H;
  45. EXTI = 040010400H;
  46. EXTI_IMR = EXTI;
  47. EXTI_RTSR = EXTI + 08H;
  48. EXTI_FTSR = EXTI + 0CH;
  49. EXTI_PR = EXTI + 14H;
  50. SCB_SCR = 0E000ED00H + 10H;
  51. SLEEPONEXIT = {1};
  52. SLEEPDEEP = {2};
  53. SEVONPEND = {4};
  54. LINE0 = {0};
  55. Blue = 6;
  56. Green = 7;
  57. VAR
  58. x: SET;
  59. state: INTEGER;
  60. (* обработчик прерываний от EXTI0 *)
  61. PROCEDURE PushButton [22];
  62. BEGIN
  63. SYSTEM.PUT(EXTI_PR, LINE0); (* сбросить флаг прерывания *)
  64. INC(state);
  65. (* изменить состояние светодиодов *)
  66. CASE state MOD 4 OF
  67. |0: SYSTEM.PUT(GPIOBBSRR, {Blue + 16, Green + 16})
  68. |1: SYSTEM.PUT(GPIOBBSRR, {Blue, Green + 16})
  69. |2: SYSTEM.PUT(GPIOBBSRR, {Blue + 16, Green})
  70. |3: SYSTEM.PUT(GPIOBBSRR, {Blue, Green})
  71. END
  72. END PushButton;
  73. PROCEDURE [code] wfi
  74. 0BF30H; (* wfi *)
  75. PROCEDURE sleep;
  76. VAR
  77. x: SET;
  78. BEGIN
  79. REPEAT
  80. (* настроить режим сна *)
  81. SYSTEM.GET(SCB_SCR, x);
  82. SYSTEM.PUT(SCB_SCR, x - SLEEPDEEP);
  83. (* ждать прерывание *)
  84. wfi
  85. UNTIL FALSE
  86. END sleep;
  87. BEGIN
  88. state := 0;
  89. (* подключить GPIOA и GPIOB *)
  90. SYSTEM.GET(RCC_AHBENR, x);
  91. SYSTEM.PUT(RCC_AHBENR, x + {0, 1});
  92. (* настроить PB6 и PB7 на выход *)
  93. SYSTEM.GET(GPIOBMODER, x);
  94. SYSTEM.PUT(GPIOBMODER, x + {12, 14} - {13, 15});
  95. (* настроить PA0 на вход *)
  96. SYSTEM.GET(GPIOAMODER, x);
  97. SYSTEM.PUT(GPIOAMODER, x - {0, 1});
  98. (* разрешить прерывания от EXTI0 (позиция 6) *)
  99. SYSTEM.PUT(NVIC_ISER0, {6});
  100. (* разрешить прерывания от LINE0 по нарастающему краю импульса *)
  101. SYSTEM.PUT(EXTI_IMR, LINE0);
  102. SYSTEM.PUT(EXTI_RTSR, LINE0);
  103. sleep
  104. END Button.