diff --git a/sysmgr/sys_mgr.cpp b/sysmgr/sys_mgr.cpp index 0ae2fdf..889c6b9 100644 --- a/sysmgr/sys_mgr.cpp +++ b/sysmgr/sys_mgr.cpp @@ -2,7 +2,6 @@ #include - using namespace iflytop; #define TAG "SysMgr" @@ -42,11 +41,62 @@ static size_t get_free_heap_size() { /*********************************************************************************************************************** * STM32_ERROR_IRQ * ***********************************************************************************************************************/ -void SysMgr_on_NMI_Handler(void) { ZLOGI(TAG, "on NMI_Handler"); } -void SysMgr_on_HardFault_Handler(void) { ZLOGI(TAG, "on HardFault_Handler"); } -void SysMgr_on_MemManage_Handler(void) { ZLOGI(TAG, "on MemManage_Handler"); } -void SysMgr_on_BusFault_Handler(void) { ZLOGI(TAG, "on BusFault_Handler"); } -void SysMgr_on_UsageFault_Handler(void) { ZLOGI(TAG, "on UsageFault_Handler"); } +// void SysMgr_on_NMI_Handler(void) { ZLOGI(TAG, "on NMI_Handler"); } +// void SysMgr_on_HardFault_Handler(void) { ZLOGI(TAG, "on HardFault_Handler"); } +// void SysMgr_on_MemManage_Handler(void) { ZLOGI(TAG, "on MemManage_Handler"); } +// void SysMgr_on_BusFault_Handler(void) { ZLOGI(TAG, "on BusFault_Handler"); } +// void SysMgr_on_UsageFault_Handler(void) { ZLOGI(TAG, "on UsageFault_Handler"); } + +void NMI_Handler(void) { + printf("E:%s\n", __FUNCTION__); + NVIC_SystemReset(); +} +void HardFault_Handler(void) { + printf("E:%s\n", __FUNCTION__); + NVIC_SystemReset(); +} + +void MemManage_Handler(void) { + printf("E:%s\n", __FUNCTION__); + NVIC_SystemReset(); +} + +void BusFault_Handler(void) { + printf("E:%s\n", __FUNCTION__); + NVIC_SystemReset(); +} +void UsageFault_Handler(void) { + printf("E:%s\n", __FUNCTION__); + NVIC_SystemReset(); +} +void DebugMon_Handler(void) {} + +static void PVD_Init(void) { + PWR_PVDTypeDef PvdStruct; + + HAL_PWR_EnablePVD(); + + PvdStruct.PVDLevel = PWR_PVDLEVEL_6; /* set PVD thr to 3.1v */ + PvdStruct.Mode = PWR_PVD_MODE_IT_RISING; + HAL_PWR_ConfigPVD(&PvdStruct); + + /* enable lost power irq */ + HAL_NVIC_SetPriority(PVD_IRQn, 0, 0); /* */ + HAL_NVIC_EnableIRQ(PVD_IRQn); /* */ +} + +void PVD_IRQHandler(void) { + if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO)) /* 1为VDD小于PVD阈值,掉电情况 */ + { + /* 掉电前的紧急处理 */ + printf("low power detect......\n"); + for (size_t i = 0; i < 1000; i++) { + // wait for lost power + printf("low power detect......\n"); + } + NVIC_SystemReset(); + } +} /*********************************************************************************************************************** * FREERTOS_ERROR * @@ -85,6 +135,8 @@ void SysMgr::initedFinished() { // m_task[i].Id = pxTaskStatusArray[i].xHandle; } ZASSERT_INFO(m_ntask < SDK_MAX_TASK, "task num is too large, please increase SDK_MAX_TASK"); + + PVD_Init(); } size_t SysMgr::osGetMinimumEverFreeHeapSize() { return ::xPortGetMinimumEverFreeHeapSize(); } @@ -95,8 +147,6 @@ size_t SysMgr::osGetFreeSysHeapSize() { return get_free_heap_size(); } int32_t SysMgr::getTaskNum() { return m_ntask; } void SysMgr::dumpSysInfo() { - - zlog("---------------Heap Info--------------\n"); zlog("MinimumEverFreeHeapSize : %d\n", osGetMinimumEverFreeHeapSize()); zlog("RTOS FreeHeapSize : %d\n", osGetFreeHeapSize());