| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- (*
- Пример для STM32L152C-DISCO
- При нажатии на кнопку USER (PA0), меняется
- состояние светодиодов.
- *)
- MODULE Button;
- IMPORT SYSTEM;
- CONST
- GPIOA = 40020000H;
- GPIOAMODER = GPIOA;
- GPIOAOTYPER = GPIOA + 04H;
- GPIOAOSPEEDR = GPIOA + 08H;
- GPIOAPUPDR = GPIOA + 0CH;
- GPIOAIDR = GPIOA + 10H;
- GPIOAODR = GPIOA + 14H;
- GPIOABSRR = GPIOA + 18H;
- GPIOALCKR = GPIOA + 1CH;
- GPIOAAFRL = GPIOA + 20H;
- GPIOAAFRH = GPIOA + 24H;
- GPIOABRR = GPIOA + 28H;
- GPIOB = 40020400H;
- GPIOBMODER = GPIOB;
- GPIOBOTYPER = GPIOB + 04H;
- GPIOBOSPEEDR = GPIOB + 08H;
- GPIOBPUPDR = GPIOB + 0CH;
- GPIOBIDR = GPIOB + 10H;
- GPIOBODR = GPIOB + 14H;
- GPIOBBSRR = GPIOB + 18H;
- GPIOBLCKR = GPIOB + 1CH;
- GPIOBAFRL = GPIOB + 20H;
- GPIOBAFRH = GPIOB + 24H;
- GPIOBBRR = GPIOB + 28H;
- RCC = 40023800H;
- RCC_CR = RCC;
- RCC_AHBENR = RCC + 1CH;
- RCC_APB2ENR = RCC + 20H;
- RCC_APB1ENR = RCC + 24H;
- NVIC = 0E000E100H;
- NVIC_ISER0 = NVIC;
- NVIC_ISER1 = NVIC + 04H;
- NVIC_ISER2 = NVIC + 08H;
- NVIC_ICER0 = NVIC + 80H;
- NVIC_ICER1 = NVIC + 84H;
- NVIC_ICER2 = NVIC + 88H;
- EXTI = 040010400H;
- EXTI_IMR = EXTI;
- EXTI_RTSR = EXTI + 08H;
- EXTI_FTSR = EXTI + 0CH;
- EXTI_PR = EXTI + 14H;
- SCB_SCR = 0E000ED00H + 10H;
- SLEEPONEXIT = {1};
- SLEEPDEEP = {2};
- SEVONPEND = {4};
- LINE0 = {0};
- Blue = 6;
- Green = 7;
- VAR
- x: SET;
- state: INTEGER;
- (* обработчик прерываний от EXTI0 *)
- PROCEDURE PushButton [22];
- BEGIN
- SYSTEM.PUT(EXTI_PR, LINE0); (* сбросить флаг прерывания *)
- INC(state);
- (* изменить состояние светодиодов *)
- CASE state MOD 4 OF
- |0: SYSTEM.PUT(GPIOBBSRR, {Blue + 16, Green + 16})
- |1: SYSTEM.PUT(GPIOBBSRR, {Blue, Green + 16})
- |2: SYSTEM.PUT(GPIOBBSRR, {Blue + 16, Green})
- |3: SYSTEM.PUT(GPIOBBSRR, {Blue, Green})
- END
- END PushButton;
- PROCEDURE [code] wfi
- 0BF30H; (* wfi *)
- PROCEDURE sleep;
- VAR
- x: SET;
- BEGIN
- REPEAT
- (* настроить режим сна *)
- SYSTEM.GET(SCB_SCR, x);
- SYSTEM.PUT(SCB_SCR, x - SLEEPDEEP);
- (* ждать прерывание *)
- wfi
- UNTIL FALSE
- END sleep;
- BEGIN
- state := 0;
- (* подключить GPIOA и GPIOB *)
- SYSTEM.GET(RCC_AHBENR, x);
- SYSTEM.PUT(RCC_AHBENR, x + {0, 1});
- (* настроить PB6 и PB7 на выход *)
- SYSTEM.GET(GPIOBMODER, x);
- SYSTEM.PUT(GPIOBMODER, x + {12, 14} - {13, 15});
- (* настроить PA0 на вход *)
- SYSTEM.GET(GPIOAMODER, x);
- SYSTEM.PUT(GPIOAMODER, x - {0, 1});
- (* разрешить прерывания от EXTI0 (позиция 6) *)
- SYSTEM.PUT(NVIC_ISER0, {6});
- (* разрешить прерывания от LINE0 по нарастающему краю импульса *)
- SYSTEM.PUT(EXTI_IMR, LINE0);
- SYSTEM.PUT(EXTI_RTSR, LINE0);
- sleep
- END Button.
|