Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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