| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- (*
- Пример для STM32L152C-DISCO
- Синий светодиод мигает по прерыванию от таймера TIM6,
- зеленый - от TIM7.
- *)
- MODULE TIM67;
- 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;
- TIM6 = 40001000H;
- TIM6_CR1 = TIM6;
- CEN = {0};
- UDIS = {1};
- URS = {2};
- OPM = {3};
- ARPE = {7};
- TIM6_CR2 = TIM6 + 04H;
- TIM6_DIER = TIM6 + 0CH;
- UIE = {0};
- TIM6_SR = TIM6 + 10H;
- UIF = {0};
- TIM6_EGR = TIM6 + 14H;
- UG = {0};
- TIM6_CNT = TIM6 + 24H;
- TIM6_PSC = TIM6 + 28H;
- TIM6_ARR = TIM6 + 2CH;
- TIM7 = 40001400H;
- TIM7_CR1 = TIM7;
- TIM7_CR2 = TIM7 + 04H;
- TIM7_DIER = TIM7 + 0CH;
- TIM7_SR = TIM7 + 10H;
- TIM7_EGR = TIM7 + 14H;
- TIM7_CNT = TIM7 + 24H;
- TIM7_PSC = TIM7 + 28H;
- TIM7_ARR = TIM7 + 2CH;
- 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;
- SCB_SCR = 0E000ED00H + 10H;
- SLEEPONEXIT = {1};
- SLEEPDEEP = {2};
- SEVONPEND = {4};
- BLUELED = 6;
- GREENLED = 7;
- VAR
- x: SET;
- state1, state2: BOOLEAN;
- (* обработчик прерываний от TIM6 *)
- PROCEDURE tim6 [59];
- BEGIN
- SYSTEM.PUT(TIM6_SR, 0); (* сбросить флаг прерывания *)
- state1 := ~state1;
- (* включить или выключить синий светодиод *)
- SYSTEM.PUT(GPIOBBSRR, {BLUELED + 16 * ORD(state1)})
- END tim6;
- (* обработчик прерываний от TIM7 *)
- PROCEDURE tim7 [60];
- BEGIN
- SYSTEM.PUT(TIM7_SR, 0); (* сбросить флаг прерывания *)
- state2 := ~state2;
- (* включить или выключить зеленый светодиод *)
- SYSTEM.PUT(GPIOBBSRR, {GREENLED + 16 * ORD(state2)})
- END tim7;
- 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
- state1 := FALSE;
- state2 := FALSE;
- (* подключить GPIOB *)
- SYSTEM.GET(RCC_AHBENR, x);
- SYSTEM.PUT(RCC_AHBENR, x + {1});
- (* подключить TIM6 и TIM7 *)
- SYSTEM.GET(RCC_APB1ENR, x);
- SYSTEM.PUT(RCC_APB1ENR, x + {4, 5});
- (* настроить PB6 и PB7 на выход *)
- SYSTEM.GET(GPIOBMODER, x);
- SYSTEM.PUT(GPIOBMODER, x + {12, 14} - {13, 15});
- (* разрешить прерывания от таймеров TIM6 (позиция 43) и TIM7 (позиция 44) *)
- SYSTEM.PUT(NVIC_ISER1, {11, 12});
- (* настроить и запустить TIM6 *)
- SYSTEM.PUT(TIM6_ARR, 31);
- SYSTEM.PUT(TIM6_PSC, 65535);
- SYSTEM.PUT(TIM6_DIER, UIE);
- SYSTEM.GET(TIM6_CR1, x);
- SYSTEM.PUT(TIM6_CR1, x + CEN - (UDIS + URS + OPM + ARPE));
- (* настроить и запустить TIM7 *)
- SYSTEM.PUT(TIM7_ARR, 8000);
- SYSTEM.PUT(TIM7_PSC, 80);
- SYSTEM.PUT(TIM7_DIER, UIE);
- SYSTEM.GET(TIM7_CR1, x);
- SYSTEM.PUT(TIM7_CR1, x + CEN - (UDIS + URS + OPM + ARPE));
- sleep
- END TIM67.
|