SysTick.ob07 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. (*
  2. Пример для STM32L152C-DISCO
  3. Светодиоды мигают по прерыванию от системного таймера.
  4. *)
  5. MODULE SysTick;
  6. IMPORT SYSTEM;
  7. CONST
  8. GPIOB = 40020400H;
  9. GPIOBMODER = GPIOB;
  10. GPIOBOTYPER = GPIOB + 04H;
  11. GPIOBOSPEEDR = GPIOB + 08H;
  12. GPIOBPUPDR = GPIOB + 0CH;
  13. GPIOBIDR = GPIOB + 10H;
  14. GPIOBODR = GPIOB + 14H;
  15. GPIOBBSRR = GPIOB + 18H;
  16. GPIOBLCKR = GPIOB + 1CH;
  17. GPIOBAFRL = GPIOB + 20H;
  18. GPIOBAFRH = GPIOB + 24H;
  19. GPIOBBRR = GPIOB + 28H;
  20. RCC = 40023800H;
  21. RCC_CR = RCC;
  22. RCC_AHBENR = RCC + 1CH;
  23. RCC_APB2ENR = RCC + 20H;
  24. RCC_APB1ENR = RCC + 24H;
  25. STK = 0E000E010H;
  26. STK_CTRL = STK;
  27. ENABLE = {0};
  28. TICKINT = {1};
  29. CLKSOURCE = {2};
  30. STK_LOAD = STK + 04H;
  31. STK_VAL = STK + 08H;
  32. STK_CALIB = STK + 0CH;
  33. SCB_SCR = 0E000ED00H + 10H;
  34. SLEEPONEXIT = {1};
  35. SLEEPDEEP = {2};
  36. SEVONPEND = {4};
  37. Blue = 6;
  38. Green = 7;
  39. VAR
  40. x: SET; state: BOOLEAN;
  41. (* обработчик прерываний от System tick timer *)
  42. PROCEDURE tick [15];
  43. BEGIN
  44. state := ~state;
  45. (* включить или выключить светодиоды *)
  46. SYSTEM.PUT(GPIOBBSRR, {Blue + 16 * ORD(state)});
  47. SYSTEM.PUT(GPIOBBSRR, {Green + 16 * ORD(state)})
  48. END tick;
  49. PROCEDURE [code] wfi
  50. 0BF30H; (* wfi *)
  51. PROCEDURE sleep;
  52. VAR
  53. x: SET;
  54. BEGIN
  55. REPEAT
  56. (* настроить режим сна *)
  57. SYSTEM.GET(SCB_SCR, x);
  58. SYSTEM.PUT(SCB_SCR, x - SLEEPDEEP);
  59. (* ждать прерывание *)
  60. wfi
  61. UNTIL FALSE
  62. END sleep;
  63. BEGIN
  64. state := TRUE;
  65. (* подключить GPIOB *)
  66. SYSTEM.GET(RCC_AHBENR, x);
  67. SYSTEM.PUT(RCC_AHBENR, x + {1});
  68. (* настроить PB6 и PB7 на выход *)
  69. SYSTEM.GET(GPIOBMODER, x);
  70. SYSTEM.PUT(GPIOBMODER, x + {12, 14} - {13, 15});
  71. (* настроить и запустить SysTick *)
  72. SYSTEM.PUT(STK_LOAD, 1048576);
  73. SYSTEM.PUT(STK_CTRL, ENABLE + TICKINT + CLKSOURCE);
  74. sleep
  75. END SysTick.