mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
STM32 (примеры): wfi вместо пустого бесконечного цикла
This commit is contained in:
1 parent
4e8fe8136d
commit
8ad3c11869
4 files changed
+115
-5
No files matched your search
@@ -64,6 +64,12 @@ CONST
|
||||
EXTI_PR = EXTI + 14H;
|
||||
|
||||
|
||||
SCB_SCR = 0E000ED00H + 10H;
|
||||
SLEEPONEXIT = {1};
|
||||
SLEEPDEEP = {2};
|
||||
SEVONPEND = {4};
|
||||
|
||||
|
||||
LINE0 = {0};
|
||||
|
||||
Blue = 6;
|
||||
@@ -79,9 +85,9 @@ VAR
|
||||
PROCEDURE PushButton [22];
|
||||
BEGIN
|
||||
SYSTEM.PUT(EXTI_PR, LINE0); (* сбросить флаг прерывания *)
|
||||
state := (state + 1) MOD 4;
|
||||
INC(state);
|
||||
(* изменить состояние светодиодов *)
|
||||
CASE state OF
|
||||
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})
|
||||
@@ -90,6 +96,26 @@ BEGIN
|
||||
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;
|
||||
|
||||
@@ -111,4 +137,6 @@ BEGIN
|
||||
(* разрешить прерывания от LINE0 по нарастающему краю импульса *)
|
||||
SYSTEM.PUT(EXTI_IMR, LINE0);
|
||||
SYSTEM.PUT(EXTI_RTSR, LINE0);
|
||||
|
||||
sleep
|
||||
END Button.
|
||||
@@ -64,6 +64,12 @@ CONST
|
||||
RCC_CSR = RCC + 34H;
|
||||
|
||||
|
||||
SCB_SCR = 0E000ED00H + 10H;
|
||||
SLEEPONEXIT = {1};
|
||||
SLEEPDEEP = {2};
|
||||
SEVONPEND = {4};
|
||||
|
||||
|
||||
PWR = 40007000H;
|
||||
PWR_CR = PWR;
|
||||
|
||||
@@ -361,6 +367,27 @@ BEGIN
|
||||
END main;
|
||||
|
||||
|
||||
PROCEDURE [code] wfi
|
||||
0BF30H; (* wfi *)
|
||||
|
||||
|
||||
PROCEDURE sleep;
|
||||
VAR
|
||||
x: SET;
|
||||
|
||||
BEGIN
|
||||
main
|
||||
REPEAT
|
||||
(* настроить режим сна *)
|
||||
SYSTEM.GET(SCB_SCR, x);
|
||||
SYSTEM.PUT(SCB_SCR, x - SLEEPDEEP);
|
||||
|
||||
(* ждать прерывание *)
|
||||
wfi
|
||||
UNTIL FALSE
|
||||
END sleep;
|
||||
|
||||
|
||||
BEGIN
|
||||
main;
|
||||
sleep
|
||||
END LCD.
|
||||
@@ -43,6 +43,12 @@ CONST
|
||||
STK_CALIB = STK + 0CH;
|
||||
|
||||
|
||||
SCB_SCR = 0E000ED00H + 10H;
|
||||
SLEEPONEXIT = {1};
|
||||
SLEEPDEEP = {2};
|
||||
SEVONPEND = {4};
|
||||
|
||||
|
||||
Blue = 6;
|
||||
Green = 7;
|
||||
|
||||
@@ -62,8 +68,28 @@ BEGIN
|
||||
END tick;
|
||||
|
||||
|
||||
PROCEDURE [code] wfi
|
||||
0BF30H; (* wfi *)
|
||||
|
||||
|
||||
PROCEDURE sleep;
|
||||
VAR
|
||||
x: SET;
|
||||
|
||||
BEGIN
|
||||
state := FALSE;
|
||||
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);
|
||||
@@ -76,4 +102,6 @@ BEGIN
|
||||
(* настроить и запустить SysTick *)
|
||||
SYSTEM.PUT(STK_LOAD, 1048576);
|
||||
SYSTEM.PUT(STK_CTRL, ENABLE + TICKINT + CLKSOURCE);
|
||||
|
||||
sleep
|
||||
END SysTick.
|
||||
@@ -78,6 +78,12 @@ CONST
|
||||
NVIC_ICER2 = NVIC + 88H;
|
||||
|
||||
|
||||
SCB_SCR = 0E000ED00H + 10H;
|
||||
SLEEPONEXIT = {1};
|
||||
SLEEPDEEP = {2};
|
||||
SEVONPEND = {4};
|
||||
|
||||
|
||||
BLUELED = 6;
|
||||
GREENLED = 7;
|
||||
|
||||
@@ -94,7 +100,6 @@ BEGIN
|
||||
state1 := ~state1;
|
||||
(* включить или выключить синий светодиод *)
|
||||
SYSTEM.PUT(GPIOBBSRR, {BLUELED + 16 * ORD(state1)})
|
||||
|
||||
END tim6;
|
||||
|
||||
|
||||
@@ -108,6 +113,26 @@ BEGIN
|
||||
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;
|
||||
@@ -140,4 +165,6 @@ BEGIN
|
||||
SYSTEM.PUT(TIM7_DIER, UIE);
|
||||
SYSTEM.GET(TIM7_CR1, x);
|
||||
SYSTEM.PUT(TIM7_CR1, x + CEN - (UDIS + URS + OPM + ARPE));
|
||||
|
||||
sleep
|
||||
END TIM67.
|
||||
Reference in new issue
Block a user