(* Пример для 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; 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; 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)); END TIM67.