hardfault + iwdg

This commit is contained in:
crinq
2018-04-17 02:56:02 +02:00
parent 2cabf2b95a
commit 5d82bc3705
5 changed files with 100 additions and 9 deletions
+19 -1
View File
@@ -289,7 +289,25 @@ int main(void) {
MX_RTC_Init();
if(app_ok() && RTC->BKP0R == 0x00000000) {
if(app_ok() && RTC->BKP0R == 0x00000000 && (RCC->CSR & (RCC_CSR_IWDGRSTF | RCC_CSR_WWDGRSTF)) == 0x00000000) {
// reset rcc reset flag
RCC->CSR |= RCC_CSR_RMVF;
// enable access
IWDG->KR = 0x5555;
// set prescalser 4
IWDG->PR = 0;
// set reaload 0.2s
IWDG->RLR = 0.2 * 40000 / 4;
// start
IWDG->KR = 0xCCCC;
// reset
IWDG->KR = 0xAAAA;
// SCB->VTOR = APP_START;
/* Jump to user application */
void (*JumpToApplication)(void);
+31 -3
View File
@@ -910,12 +910,40 @@ void hal_error(uint32_t error_handler) {
hal.error_info.error_handler = error_handler;
hal_stop();
hal.hal_state = MISC_ERROR;
switch(error_handler){
case HardFault:
printf("<font color=\"FireBrick\">HardFault</font>\n");
break;
case NMI:
printf("<font color=\"FireBrick\">NMI</font>\n");
break;
case MemManage:
printf("<font color=\"FireBrick\">MemManage</font>\n");
break;
case BusFault:
printf("<font color=\"FireBrick\">BusFault</font>\n");
break;
case UsageFault:
printf("<font color=\"FireBrick\">UsageFault</font>\n");
break;
}
}
void fault(char *ptr) {
printf("trigger fault handler\n");
volatile uint32_t *p = (uint32_t *)0x08010000;
p[0] = 1;
// unaligned multiple load/store
//
__asm volatile (
"movs r0, #1 \t\n"
"ldm r0, {r1-r2} \t\n"
"bx lr \t\n"
);
//volatile uint32_t *p = (uint32_t *)0x08010000;
//p[0] = 1;
}
COMMAND("fault", fault, "trigger fault");
+23
View File
@@ -24,6 +24,8 @@
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_it.h"
#include "hal.h"
#include "hw/hw.h"
/** @addtogroup STM32F4_Discovery_Peripheral_Examples
* @{
@@ -44,6 +46,7 @@
/* Cortex-M4 Processor Exceptions Handlers */
/******************************************************************************/
extern void Wait(uint32_t ms);
/**
* @brief This function handles NMI exception.
* @param None
@@ -51,6 +54,10 @@
*/
void NMI_Handler(void) {
hal_error(NMI);
NVIC_DisableIRQ(TIM_SLAVE_IRQ);
NVIC_DisableIRQ(DMA2_Stream0_IRQn);
NVIC_DisableIRQ(SysTick_IRQn);
while(1){}
}
/**
@@ -61,6 +68,10 @@ void NMI_Handler(void) {
void HardFault_Handler(void) {
/* Go to infinite loop when Hard Fault exception occurs */
hal_error(HardFault);
NVIC_DisableIRQ(TIM_SLAVE_IRQ);
NVIC_DisableIRQ(DMA2_Stream0_IRQn);
NVIC_DisableIRQ(SysTick_IRQn);
while(1){}
}
/**
@@ -71,6 +82,10 @@ void HardFault_Handler(void) {
void MemManage_Handler(void) {
/* Go to infinite loop when Memory Manage exception occurs */
hal_error(MemManage);
NVIC_DisableIRQ(TIM_SLAVE_IRQ);
NVIC_DisableIRQ(DMA2_Stream0_IRQn);
NVIC_DisableIRQ(SysTick_IRQn);
while(1){}
}
/**
@@ -81,6 +96,10 @@ void MemManage_Handler(void) {
void BusFault_Handler(void) {
/* Go to infinite loop when Bus Fault exception occurs */
hal_error(BusFault);
NVIC_DisableIRQ(TIM_SLAVE_IRQ);
NVIC_DisableIRQ(DMA2_Stream0_IRQn);
NVIC_DisableIRQ(SysTick_IRQn);
while(1){}
}
/**
@@ -91,6 +110,10 @@ void BusFault_Handler(void) {
void UsageFault_Handler(void) {
/* Go to infinite loop when Usage Fault exception occurs */
hal_error(UsageFault);
NVIC_DisableIRQ(TIM_SLAVE_IRQ);
NVIC_DisableIRQ(DMA2_Stream0_IRQn);
NVIC_DisableIRQ(SysTick_IRQn);
while(1){}
}
/**
+17 -5
View File
@@ -72,14 +72,14 @@ void SystemClock_Config(void);
void Error_Handler(void);
void TIM8_UP_IRQHandler() {
GPIOA->BSRR |= GPIO_PIN_9;
__HAL_TIM_CLEAR_IT(&htim8, TIM_IT_UPDATE);
hal_run_rt();
if(__HAL_TIM_GET_FLAG(&htim8, TIM_IT_UPDATE) == SET) {
hal_stop();
hal.hal_state = RT_TOO_LONG;
}
GPIOA->BSRR |= GPIO_PIN_9 << 16;
// reset
IWDG->KR = 0xAAAA;
}
void about(char *ptr) {
@@ -130,6 +130,9 @@ int main(void) {
extern void *g_pfnVectors;
SCB->VTOR = (uint32_t)&g_pfnVectors;
// reset
IWDG->KR = 0xAAAA;
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
@@ -355,11 +358,20 @@ int main(void) {
hal_parse("io0.ignore_fault_pin = ls0.ignore_fault_pin");
hal_parse("debug_level 0");
// hal parse config
// hal_init_nrt();
// error foo
// reset
IWDG->KR = 0xAAAA;
hal_start();
// reset
IWDG->KR = 0xAAAA;
// enable access
IWDG->KR = 0x5555;
// set reaload 0.0005s
IWDG->RLR = 0.0005 * 40000 / 4;
while(1) {
hal_run_nrt();
cdc_poll();
+10
View File
@@ -54,6 +54,8 @@ extern PCD_HandleTypeDef hpcd_USB_FS;
void NMI_Handler(void) {
/* USER CODE BEGIN NonMaskableInt_IRQn 0 */
hal_error(NMI);
HAL_NVIC_DisableIRQ(TIM8_UP_IRQn);
while(1){}
/* USER CODE END NonMaskableInt_IRQn 0 */
/* USER CODE BEGIN NonMaskableInt_IRQn 1 */
@@ -68,6 +70,8 @@ void HardFault_Handler(void) {
/* USER CODE END HardFault_IRQn 0 */
hal_error(HardFault);
HAL_NVIC_DisableIRQ(TIM8_UP_IRQn);
while(1){}
/* USER CODE BEGIN HardFault_IRQn 1 */
/* USER CODE END HardFault_IRQn 1 */
@@ -81,6 +85,8 @@ void MemManage_Handler(void) {
/* USER CODE END MemoryManagement_IRQn 0 */
hal_error(MemManage);
HAL_NVIC_DisableIRQ(TIM8_UP_IRQn);
while(1){}
/* USER CODE BEGIN MemoryManagement_IRQn 1 */
/* USER CODE END MemoryManagement_IRQn 1 */
@@ -94,6 +100,8 @@ void BusFault_Handler(void) {
/* USER CODE END BusFault_IRQn 0 */
hal_error(BusFault);
HAL_NVIC_DisableIRQ(TIM8_UP_IRQn);
while(1){}
/* USER CODE BEGIN BusFault_IRQn 1 */
/* USER CODE END BusFault_IRQn 1 */
@@ -107,6 +115,8 @@ void UsageFault_Handler(void) {
/* USER CODE END UsageFault_IRQn 0 */
hal_error(UsageFault);
HAL_NVIC_DisableIRQ(TIM8_UP_IRQn);
while(1){}
/* USER CODE BEGIN UsageFault_IRQn 1 */
/* USER CODE END UsageFault_IRQn 1 */