TIM67.ob07 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. (*
  2. Пример для STM32L152C-DISCO
  3. Синий светодиод мигает по прерыванию от таймера TIM6,
  4. зеленый - от TIM7.
  5. *)
  6. MODULE TIM67;
  7. IMPORT SYSTEM;
  8. CONST
  9. GPIOB = 40020400H;
  10. GPIOBMODER = GPIOB;
  11. GPIOBOTYPER = GPIOB + 04H;
  12. GPIOBOSPEEDR = GPIOB + 08H;
  13. GPIOBPUPDR = GPIOB + 0CH;
  14. GPIOBIDR = GPIOB + 10H;
  15. GPIOBODR = GPIOB + 14H;
  16. GPIOBBSRR = GPIOB + 18H;
  17. GPIOBLCKR = GPIOB + 1CH;
  18. GPIOBAFRL = GPIOB + 20H;
  19. GPIOBAFRH = GPIOB + 24H;
  20. GPIOBBRR = GPIOB + 28H;
  21. RCC = 40023800H;
  22. RCC_CR = RCC;
  23. RCC_AHBENR = RCC + 1CH;
  24. RCC_APB2ENR = RCC + 20H;
  25. RCC_APB1ENR = RCC + 24H;
  26. TIM6 = 40001000H;
  27. TIM6_CR1 = TIM6;
  28. CEN = {0};
  29. UDIS = {1};
  30. URS = {2};
  31. OPM = {3};
  32. ARPE = {7};
  33. TIM6_CR2 = TIM6 + 04H;
  34. TIM6_DIER = TIM6 + 0CH;
  35. UIE = {0};
  36. TIM6_SR = TIM6 + 10H;
  37. UIF = {0};
  38. TIM6_EGR = TIM6 + 14H;
  39. UG = {0};
  40. TIM6_CNT = TIM6 + 24H;
  41. TIM6_PSC = TIM6 + 28H;
  42. TIM6_ARR = TIM6 + 2CH;
  43. TIM7 = 40001400H;
  44. TIM7_CR1 = TIM7;
  45. TIM7_CR2 = TIM7 + 04H;
  46. TIM7_DIER = TIM7 + 0CH;
  47. TIM7_SR = TIM7 + 10H;
  48. TIM7_EGR = TIM7 + 14H;
  49. TIM7_CNT = TIM7 + 24H;
  50. TIM7_PSC = TIM7 + 28H;
  51. TIM7_ARR = TIM7 + 2CH;
  52. NVIC = 0E000E100H;
  53. NVIC_ISER0 = NVIC;
  54. NVIC_ISER1 = NVIC + 04H;
  55. NVIC_ISER2 = NVIC + 08H;
  56. NVIC_ICER0 = NVIC + 80H;
  57. NVIC_ICER1 = NVIC + 84H;
  58. NVIC_ICER2 = NVIC + 88H;
  59. SCB_SCR = 0E000ED00H + 10H;
  60. SLEEPONEXIT = {1};
  61. SLEEPDEEP = {2};
  62. SEVONPEND = {4};
  63. BLUELED = 6;
  64. GREENLED = 7;
  65. VAR
  66. x: SET;
  67. state1, state2: BOOLEAN;
  68. (* обработчик прерываний от TIM6 *)
  69. PROCEDURE tim6 [59];
  70. BEGIN
  71. SYSTEM.PUT(TIM6_SR, 0); (* сбросить флаг прерывания *)
  72. state1 := ~state1;
  73. (* включить или выключить синий светодиод *)
  74. SYSTEM.PUT(GPIOBBSRR, {BLUELED + 16 * ORD(state1)})
  75. END tim6;
  76. (* обработчик прерываний от TIM7 *)
  77. PROCEDURE tim7 [60];
  78. BEGIN
  79. SYSTEM.PUT(TIM7_SR, 0); (* сбросить флаг прерывания *)
  80. state2 := ~state2;
  81. (* включить или выключить зеленый светодиод *)
  82. SYSTEM.PUT(GPIOBBSRR, {GREENLED + 16 * ORD(state2)})
  83. END tim7;
  84. PROCEDURE [code] wfi
  85. 0BF30H; (* wfi *)
  86. PROCEDURE sleep;
  87. VAR
  88. x: SET;
  89. BEGIN
  90. REPEAT
  91. (* настроить режим сна *)
  92. SYSTEM.GET(SCB_SCR, x);
  93. SYSTEM.PUT(SCB_SCR, x - SLEEPDEEP);
  94. (* ждать прерывание *)
  95. wfi
  96. UNTIL FALSE
  97. END sleep;
  98. BEGIN
  99. state1 := FALSE;
  100. state2 := FALSE;
  101. (* подключить GPIOB *)
  102. SYSTEM.GET(RCC_AHBENR, x);
  103. SYSTEM.PUT(RCC_AHBENR, x + {1});
  104. (* подключить TIM6 и TIM7 *)
  105. SYSTEM.GET(RCC_APB1ENR, x);
  106. SYSTEM.PUT(RCC_APB1ENR, x + {4, 5});
  107. (* настроить PB6 и PB7 на выход *)
  108. SYSTEM.GET(GPIOBMODER, x);
  109. SYSTEM.PUT(GPIOBMODER, x + {12, 14} - {13, 15});
  110. (* разрешить прерывания от таймеров TIM6 (позиция 43) и TIM7 (позиция 44) *)
  111. SYSTEM.PUT(NVIC_ISER1, {11, 12});
  112. (* настроить и запустить TIM6 *)
  113. SYSTEM.PUT(TIM6_ARR, 31);
  114. SYSTEM.PUT(TIM6_PSC, 65535);
  115. SYSTEM.PUT(TIM6_DIER, UIE);
  116. SYSTEM.GET(TIM6_CR1, x);
  117. SYSTEM.PUT(TIM6_CR1, x + CEN - (UDIS + URS + OPM + ARPE));
  118. (* настроить и запустить TIM7 *)
  119. SYSTEM.PUT(TIM7_ARR, 8000);
  120. SYSTEM.PUT(TIM7_PSC, 80);
  121. SYSTEM.PUT(TIM7_DIER, UIE);
  122. SYSTEM.GET(TIM7_CR1, x);
  123. SYSTEM.PUT(TIM7_CR1, x + CEN - (UDIS + URS + OPM + ARPE));
  124. sleep
  125. END TIM67.