Subversion Repositories Kolibri OS

Rev

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

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