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

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


ob:o7:debug

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
ob:o7:debug [2018/05/24 13:02]
shiryaev.a.v [Сторожевой таймер] IWDG
ob:o7:debug [2018/05/24 14:14]
shiryaev.a.v [Сторожевой таймер]
Строка 209: Строка 209:
 ===== Сторожевой таймер ===== ===== Сторожевой таймер =====
  
-<code> +См. **MicroARMv7MSTM32F4WWDG**.
-MODULE MobxSTM32F4WWDG;+
  
- IMPORT SYSTEM, +Нужно выполнить **Init** и потом периодически вызывать процедуру **Update**.
- ARMv7M := MicroARMv7M, +
- Traps := MicroARMv7MTraps, +
- MCU := MicroSTM32F405;+
  
- CONST +При "зависании" микроконтроллера сработает аварийная остановка с кодом 20, и можно определить место в программе, где это произошло (**Traps.trap.pc**)
- 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; +"Независимый" сторожевой таймер (но без возможности определения места остановки): см. **MicroSTM32FxIWDG**.
- 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) +
- +
- +
-"Независимый" сторожевой таймер (но без возможности определения места остановки): см. MicroSTM32FxIWDG+
  
  
ob/o7/debug.txt · Последнее изменение: 2024/05/08 12:58 — iadenisov