Инструменты пользователя

Инструменты сайта


ob:o7:debug

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
ob:o7:debug [2018/05/24 10:41]
shiryaev.a.v IWDG
ob:o7:debug [2020/10/29 07:08] (текущий)
Строка 209: Строка 209:
 ===== Сторожевой таймер ===== ===== Сторожевой таймер =====
  
-<code> +Чтобы определить, когда микроконтроллер «завис» в бесконечном цикле, полезным инструментом является сторожевой таймер **MicroARMv7MSTM32F4WWDG** ([[https://github.com/aixp/O7/blob/master/Micro/Files/STM32F4IWDG.odc|github]]).
-MODULE MobxSTM32F4WWDG;+
  
- IMPORT SYSTEM, +Чтобы его использоватьсначала необходимо выполнить процедуру **Init**и затем периодически вызывать процедуру **Update**. Тогдапри «зависании» микроконтроллера сработает **аварийная остановка с кодом 20**, и возможно определить место в программе, где это произошло (**Traps.trap.pc**)
- ARMv7M := MicroARMv7M, +
- Traps := MicroARMv7MTraps, +
- MCU := MicroSTM32F405;+
  
- CONST +Более универсальный сторожевой таймер не имеет возможности определения места остановки: **MicroSTM32FxIWDG** ([[https://github.com/aixp/O7/blob/master/Micro/Files/STM32FxIWDG.odc|github]]). Но зато он работает на любых типах микроконтроллеров моделей STM32F.
- SP = 13; +
- SR0 = 0; SR1 = 1; SR2 = 2; SR3 = 3; SR12 = 4; SLR = 5; SPC = 6; +
- +
- Int = MCU.WWDGInt; +
- int = Int MOD 32; +
- ISER = ARMv7M.NVICISER0 + (Int DIV 32) * 4; +
- ICER = ARMv7M.NVICICER0 + (Int DIV 32) * 4; +
- IPR = ARMv7M.NVICIPR0 + Int; +
- +
- PROCEDURE* InterruptsHandler; +
- CONST nLVars = 1; +
- VAR pc: INTEGER; +
- BEGIN +
- (* compiler-dependent *) +
- SYSTEM.GET(SYSTEM.REG(SP) + (SPC + nLVars + 1 + 8) * 4, pc); +
- Traps.trapHandler(0EX (* 14 *), pc, 0) +
- END InterruptsHandler; +
- +
- PROCEDURE Update*; +
- BEGIN +
- SYSTEM.PUT(MCU.WWDGCR, {0..7}) +
- END Update; +
- +
- PROCEDURE Init*; +
- CONST +
- (* RCCAPB1ENR bits: *) +
- WWDGEN = 11; +
- (* WWDGCR bits: *) +
- WDGA = 7; +
- (* WWDGCFR bits: *) +
- EWI = 9; +
- (* WWDGSR bits: *) +
- EWIF = 0; +
- VAR x: SET; +
- i: INTEGER; +
- BEGIN +
- SYSTEM.PUT(ICER, {int}); ARMv7M.ISB; +
- +
- (* timeout = 4096 * 8 / PCLK1 * 64 = 52.4288 ms @ PCLK1 = 40 MHz *) +
- +
- SYSTEM.GET(MCU.RCCAPB1ENR, x); +
- SYSTEM.PUT(MCU.RCCAPB1ENR, x + {WWDGEN}); ARMv7M.DSB; +
- +
- SYSTEM.PUT(MCU.WWDGCFR, {0..8} + {EWI}); (* W := 127; WDGTB := 3; !EWI *) +
- +
- SYSTEM.PUT(Traps.vectorsOrg + (ARMv7M.ExternalInterrupt0 + Int) * 4, InterruptsHandler); +
- +
- (* decrease priority of all interrupts *) +
- i := 0; +
- WHILE i < 60 DO +
- SYSTEM.PUT(ARMv7M.NVICIPR0 + i, 80808080H); (* set priorities to 8 *) +
- INC(i) +
- END; +
- (* increase priority of WWDG interrupts *) +
- SYSTEM.PUT(IPR, 0X); (* set priority to 0 *) +
- +
- SYSTEM.GET(MCU.WWDGSR, x); +
- SYSTEM.PUT(MCU.WWDGSR, x - {EWIF}); +
- +
- SYSTEM.PUT(MCU.WWDGCR, {0..6} + {WDGA}); (* enable *) +
- +
- SYSTEM.PUT(ISER, {int}) +
- END Init; +
- +
-END MobxSTM32F4WWDG. +
-</code> +
- +
-Нужно периодически вызывать процедуру Update. +
- +
-При "зависании" микроконтроллера сработает аварийная остановка с кодом 14. И можно определить место в программе, где это произошло (Trap.pc) +
- +
- +
-"Независимыйсторожевой таймер (но без возможности определения места остановки): +
- +
-<code> +
-MODULE MobxSTM32F4IWDG; +
- +
- IMPORT SYSTEM, MCU := MicroSTM32F405; +
- +
- PROCEDURE Update*+
- BEGIN +
- SYSTEM.PUT(MCU.IWDGKR, 0AAAAH) +
- END Update; +
- +
- PROCEDURE Init*+
- CONST +
- (RCCCSR bits: *+
- LSION = 0; LSIRDY = 1; +
- (* IWDGSR bits*) +
- PVU = 0; RVU = 1; +
- VAR x: SET; +
- BEGIN +
- (* enable LSI *) +
- SYSTEM.GET(MCU.RCCCSR, x)+
- SYSTEM.PUT(MCU.RCCCSR, x + {LSION}); +
- REPEAT UNTIL SYSTEM.BIT(MCU.RCCCSR, LSIRDY); +
- +
- (* set IWDG timeout to 32768 ms *) +
- +
- (* enable write access *) +
- SYSTEM.PUT(MCU.IWDGKR, 5555H); +
- +
- (* setup PR *) +
- REPEAT UNTIL ~SYSTEM.BIT(MCU.IWDGSR, PVU); +
- SYSTEM.PUT(MCU.IWDGPR, 7); (* 0--7 *) +
- +
- (* setup RLR *) +
- REPEAT UNTIL ~SYSTEM.BIT(MCU.IWDGSR, RVU); +
- SYSTEM.PUT(MCU.IWDGRLR, 0FFFH); (* 0--4095 *) +
- +
- (* reload IWDG *) +
- SYSTEM.PUT(MCU.IWDGKR, 0AAAAH); +
- +
- (* start IWDG *) +
- SYSTEM.PUT(MCU.IWDGKR, 0CCCCH) +
- END Init; +
- +
-END MobxSTM32F4IWDG. +
-</code>+
  
  
ob/o7/debug.1527147691.txt.gz · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)