0,0 → 1,114 |
(* |
Пример для 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; |
|
|
LINE0 = {0}; |
|
Blue = 6; |
Green = 7; |
|
|
VAR |
x: SET; |
state: INTEGER; |
|
|
(* обработчик прерываний от EXTI0 *) |
PROCEDURE PushButton [22]; |
BEGIN |
SYSTEM.PUT(EXTI_PR, LINE0); (* сбросить флаг прерывания *) |
state := (state + 1) MOD 4; |
(* изменить состояние светодиодов *) |
CASE state 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; |
|
|
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); |
END Button. |