/** * @brief This function handles Memory Manage exception. * @param None * @retval None */ void MemManage_Handler(void) { timer_disable_all(); /* Go to infinite loop when Memory Manage exception occurs */ while (1) { LED_YLW = 1; LED_GRN = 1; } }
/** * @brief This function handles Usage Fault exception. * @param None * @retval None */ void UsageFault_Handler(void) { timer_disable_all(); /* Go to infinite loop when Usage Fault exception occurs */ while (1) { LED_YLW = 1; } }
/** * @brief This function handles Bus Fault exception. * @param None * @retval None */ void BusFault_Handler(void) { timer_disable_all(); /* Go to infinite loop when Bus Fault exception occurs */ while (1) { LED_YLW = 1; LED_GRN = 1; LED_RED = 1; } }
/* (Called from exc.S with global interrupts disabled.) */ void __error(void) { /* Turn off peripheral interrupts */ nvic_irq_disable_all(); /* Turn off timers */ timer_disable_all(); /* Turn off ADC */ adc_disable_all(); /* Turn off all USARTs */ usart_disable_all(); /* Turn the USB interrupt back on so the bootloader keeps on functioning */ nvic_irq_enable(NVIC_USB_HP_CAN_TX); nvic_irq_enable(NVIC_USB_LP_CAN_RX0); /* Reenable global interrupts */ nvic_globalirq_enable(); throb(); }
// new common exception code // TODO: we have task switching so if fault occures in task we can just remove task from queue // void __attribute__((noreturn)) __error(uint32_t num, uint32_t pc, uint32_t lr) { #ifdef DEBUG_BUILD static const char * const faults[] = { "", // 0 "", // 1 "HardFault", // 2 "MemManage fault", // 3 "BusFault", // 4 "UsageFault", // 5 "illegal Flash Write", // 6 "", // 7 "", // 8 "", // 9 "", // 10 "PureVirtual function call", // 11 "failed to setup clock", // 12 "exit from main()", // 13 "", // 14 }; #endif /* Turn off peripheral interrupts */ __disable_irq(); timer_disable_all(); // turn off all PWM if(is_bare_metal()) // bare metal build without bootloader should reboot to DFU after any fault board_set_rtc_register(DFU_RTC_SIGNATURE, RTC_SIGNATURE_REG); /* Turn the USB interrupt back on so "the reboot to bootloader" keeps on functioning */ NVIC_EnableIRQ(OTG_HS_EP1_OUT_IRQn); NVIC_EnableIRQ(OTG_HS_EP1_IN_IRQn); NVIC_EnableIRQ(OTG_HS_EP1_IN_IRQn); NVIC_EnableIRQ(OTG_HS_IRQn); NVIC_EnableIRQ(OTG_FS_IRQn); __enable_irq(); if(boardEmergencyHandler) boardEmergencyHandler(); // call emergency handler #if 0 #ifdef ERROR_USART usart_putstr(ERROR_USART, "\r\n!!! Exception: "); #ifdef DEBUG_BUILD usart_putstr(ERROR_USART, faults[num]); #else usart_putudec(ERROR_USART, num); #endif usart_putstr(ERROR_USART, " at "); usart_putudec(ERROR_USART, pc); usart_putstr(ERROR_USART, " lr "); usart_putudec(ERROR_USART, lr); usart_putc(ERROR_USART, '\n'); usart_putc(ERROR_USART, '\r'); #endif #else #ifdef DEBUG_BUILD printf("\r\n!!! Exception: %s at %x LR=%x\n",faults[num], pc, lr); #else printf("\r\n!!! Exception: %d at %x LR=%x\n",num, pc, lr); #endif #endif error_throb(num); }
void TASK_Micropython (void *pvParameters) { // initialize the garbage collector with the top of our stack uint32_t sp = gc_helper_get_sp(); gc_collect_init (sp); bool safeboot = false; mptask_pre_init(); #ifndef DEBUG safeboot = PRCMGetSpecialBit(PRCM_SAFE_BOOT_BIT); #endif soft_reset: // GC init gc_init(&_boot, &_eheap); // MicroPython init mp_init(); mp_obj_list_init(mp_sys_path, 0); mp_obj_list_init(mp_sys_argv, 0); mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR_)); // current dir (or base dir of the script) // execute all basic initializations mpexception_init0(); mpcallback_init0(); pybsleep_init0(); mperror_init0(); uart_init0(); pin_init0(); timer_init0(); readline_init0(); mod_network_init0(); #if MICROPY_HW_ENABLE_RNG rng_init0(); #endif #ifdef LAUNCHXL // configure the stdio uart pins with the correct alternate functions // param 3 ("mode") is DON'T CARE" for AFs others than GPIO pin_config ((pin_obj_t *)&MICROPY_STDIO_UART_TX_PIN, MICROPY_STDIO_UART_TX_PIN_AF, 0, PIN_TYPE_STD_PU, PIN_STRENGTH_2MA); pin_config ((pin_obj_t *)&MICROPY_STDIO_UART_RX_PIN, MICROPY_STDIO_UART_RX_PIN_AF, 0, PIN_TYPE_STD_PU, PIN_STRENGTH_2MA); // instantiate the stdio uart mp_obj_t args[2] = { mp_obj_new_int(MICROPY_STDIO_UART), mp_obj_new_int(MICROPY_STDIO_UART_BAUD), }; pyb_stdio_uart = pyb_uart_type.make_new((mp_obj_t)&pyb_uart_type, MP_ARRAY_SIZE(args), 0, args); // create a callback for the uart, in order to enable the rx interrupts uart_callback_new (pyb_stdio_uart, mp_const_none, MICROPY_STDIO_UART_RX_BUF_SIZE, INT_PRIORITY_LVL_3); #else pyb_stdio_uart = MP_OBJ_NULL; #endif pybsleep_reset_cause_t rstcause = pybsleep_get_reset_cause(); if (rstcause < PYB_SLP_SOFT_RESET) { if (rstcause == PYB_SLP_HIB_RESET) { // when waking up from hibernate we just want // to enable simplelink and leave it as is wlan_first_start(); } else { // only if not comming out of hibernate or a soft reset mptask_enter_ap_mode(); } // enable telnet and ftp servers_start(); } // initialize the serial flash file system mptask_init_sflash_filesystem(); // append the flash paths to the system path mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_flash)); mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_flash_slash_lib)); // reset config variables; they should be set by boot.py MP_STATE_PORT(pyb_config_main) = MP_OBJ_NULL; if (!safeboot) { // run boot.py int ret = pyexec_file("boot.py"); if (ret & PYEXEC_FORCED_EXIT) { goto soft_reset_exit; } if (!ret) { // flash the system led mperror_signal_error(); } } // now we initialise sub-systems that need configuration from boot.py, // or whose initialisation can be safely deferred until after running // boot.py. // at this point everything is fully configured and initialised. if (!safeboot) { // run the main script from the current directory. if (pyexec_mode_kind == PYEXEC_MODE_FRIENDLY_REPL) { const char *main_py; if (MP_STATE_PORT(pyb_config_main) == MP_OBJ_NULL) { main_py = "main.py"; } else { main_py = mp_obj_str_get_str(MP_STATE_PORT(pyb_config_main)); } int ret = pyexec_file(main_py); if (ret & PYEXEC_FORCED_EXIT) { goto soft_reset_exit; } if (!ret) { // flash the system led mperror_signal_error(); } } } // main script is finished, so now go into REPL mode. // the REPL mode can change, or it can request a soft reset. for ( ; ; ) { if (pyexec_mode_kind == PYEXEC_MODE_RAW_REPL) { if (pyexec_raw_repl() != 0) { break; } } else { if (pyexec_friendly_repl() != 0) { break; } } } soft_reset_exit: // soft reset pybsleep_signal_soft_reset(); mp_printf(&mp_plat_print, "PYB: soft reboot\n"); // disable all peripherals that could trigger a callback pyb_rtc_callback_disable(NULL); timer_disable_all(); uart_disable_all(); // flush the serial flash buffer sflash_disk_flush(); // clean-up the user socket space modusocket_close_all_user_sockets(); #if MICROPY_HW_HAS_SDCARD pybsd_disable(); #endif // wait for pending transactions to complete HAL_Delay(20); goto soft_reset; }