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

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


ob:o7:debug

Различия

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

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

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