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

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


ob:o7:debug

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
ob:o7:debug [2018/05/24 13:01]
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) +
- +
- +
-"Независимыйсторожевой таймер (но без возможности определения места остановки): см. MicroSTM32xIWDG+
  
  
ob/o7/debug.1527156102.txt.gz · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)