| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- (*
- Пример для STM32L152C-DISCO
- Светодиоды мигают по прерыванию от системного таймера.
- *)
- MODULE SysTick;
- IMPORT SYSTEM;
- CONST
- 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;
- STK = 0E000E010H;
- STK_CTRL = STK;
- ENABLE = {0};
- TICKINT = {1};
- CLKSOURCE = {2};
- STK_LOAD = STK + 04H;
- STK_VAL = STK + 08H;
- STK_CALIB = STK + 0CH;
- SCB_SCR = 0E000ED00H + 10H;
- SLEEPONEXIT = {1};
- SLEEPDEEP = {2};
- SEVONPEND = {4};
- Blue = 6;
- Green = 7;
- VAR
- x: SET; state: BOOLEAN;
- (* обработчик прерываний от System tick timer *)
- PROCEDURE tick [15];
- BEGIN
- state := ~state;
- (* включить или выключить светодиоды *)
- SYSTEM.PUT(GPIOBBSRR, {Blue + 16 * ORD(state)});
- SYSTEM.PUT(GPIOBBSRR, {Green + 16 * ORD(state)})
- END tick;
- 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 := TRUE;
- (* подключить GPIOB *)
- SYSTEM.GET(RCC_AHBENR, x);
- SYSTEM.PUT(RCC_AHBENR, x + {1});
- (* настроить PB6 и PB7 на выход *)
- SYSTEM.GET(GPIOBMODER, x);
- SYSTEM.PUT(GPIOBMODER, x + {12, 14} - {13, 15});
- (* настроить и запустить SysTick *)
- SYSTEM.PUT(STK_LOAD, 1048576);
- SYSTEM.PUT(STK_CTRL, ENABLE + TICKINT + CLKSOURCE);
- sleep
- END SysTick.
|