STM32 (примеры): wfi вместо пустого бесконечного цикла

This commit is contained in:
AntKrotov committed 2021-01-11 23:04:04 +03:00
1 parent 4e8fe8136d
commit 8ad3c11869
4 files changed
+115 -5

No files matched your search

+30 -2
View File
@@ -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.
+28 -1
View File
@@ -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.
+29 -1
View File
@@ -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.
+28 -1
View File
@@ -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.