|
@@ -47,6 +47,32 @@ void NMI_Handler(void)
|
|
|
*/
|
|
|
void HardFault_Handler(void)
|
|
|
{
|
|
|
+ // tube power off
|
|
|
+ GPIOA->BSRR = 0x10;
|
|
|
+ // red led
|
|
|
+ TIM1->CCR2 = 0xff; TIM1->CCR3 = 0; TIM1->CCR4 = 0;
|
|
|
+
|
|
|
+ /* https://habr.com/ru/post/511924/ */
|
|
|
+ struct
|
|
|
+ {
|
|
|
+ uint32_t r0;
|
|
|
+ uint32_t r1;
|
|
|
+ uint32_t r2;
|
|
|
+ uint32_t r3;
|
|
|
+ uint32_t r12;
|
|
|
+ uint32_t lr;
|
|
|
+ uint32_t pc;
|
|
|
+ uint32_t psr;
|
|
|
+ } * stack_ptr; //Указатель на текущее значение стека(SP)
|
|
|
+
|
|
|
+ asm (
|
|
|
+ "TST lr, #4 \n" //Тестируем 3-й бит указателя стека (побитовое И)
|
|
|
+ "ITE EQ \n" //Значение указателя стека имеет бит 3?
|
|
|
+ "MRSEQ %[ptr], MSP \n" //Да, сохраняем основной указатель стека
|
|
|
+ "MRSNE %[ptr], PSP \n" //Нет, сохраняем указатель стека процесса
|
|
|
+ : [ptr] "=r" (stack_ptr)
|
|
|
+ );
|
|
|
+ // there plase break-point...
|
|
|
while (1)
|
|
|
{
|
|
|
}
|