From c3297878099d6ab606c91c0cd29c37ebadcd035a Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 10 Sep 2024 16:48:29 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtmc51x0=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E5=81=9C=E6=AD=A2=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tmcdriver/tmc51x0/tmc51x0.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tmcdriver/tmc51x0/tmc51x0.cpp b/tmcdriver/tmc51x0/tmc51x0.cpp index 1e81a9d..b230387 100644 --- a/tmcdriver/tmc51x0/tmc51x0.cpp +++ b/tmcdriver/tmc51x0/tmc51x0.cpp @@ -30,7 +30,7 @@ static const uint8_t tmc5130_defaultRegisterAccess[TMC5130_REGISTER_COUNT] = { #endif /*********************************************************************************************************************** - * 工具? * + * 工具�? * ***********************************************************************************************************************/ #define FIELD_SET(data, mask, shift, value) (data = (((data) & (~(mask))) | (((value) << (shift)) & (mask)))) @@ -107,7 +107,7 @@ void TMC51X0::writeField(uint8_t add, uint32_t mask, uint32_t shift, uint32_t va int32_t TMC51X0::readInt(uint8_t address) { /** * @WARNING: - * 这里没有判断寄存器是否可读,有些寄存器是不可读所以,所以可能?回来的数值和写入数值是不相等的 + * 这里没有判断寄存器是否可读,有些寄存器是不可读所以,所以可能�?�回来的数值和写入数值是不相等的 */ address = TMC51x0_ADDRESS(address); @@ -176,8 +176,16 @@ int32_t TMC51X0::to_user_vel(int32_t vel) { // ***********************************************************************************************************************/ void TMC51X0::stop() { zlock_guard lkg(m_mutex); + int mode = readInt(TMC5130_RAMPMODE); + if (mode == TMC5130_MODE_POSITION) { + // writeInt(TMC5130_RAMPMODE, TMC5130_MODE_POSITION); + writeInt(TMC5130_VMAX, to_motor_vel(300)); + writeInt(TMC5130_XTARGET, readInt(TMC5130_XACTUAL)); + } else { + rotate(0); + } - rotate(0); + // rotate(0); } void TMC51X0::rotate(int32_t velocity) { zlock_guard lkg(m_mutex); From 09a2e4d56041cc988ddb766185f323ede4d713b4 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 10 Sep 2024 19:08:18 +0800 Subject: [PATCH 2/6] tmc51x0 add refreshcfg --- tmcdriver/tmc/tmc_reg_cache.hpp | 83 +++++++++++++++++++++++++++++++++++++++++ tmcdriver/tmc51x0/tmc51x0.cpp | 46 +++++++++++++++++++---- tmcdriver/tmc51x0/tmc51x0.hpp | 6 ++- 3 files changed, 126 insertions(+), 9 deletions(-) create mode 100644 tmcdriver/tmc/tmc_reg_cache.hpp diff --git a/tmcdriver/tmc/tmc_reg_cache.hpp b/tmcdriver/tmc/tmc_reg_cache.hpp new file mode 100644 index 0000000..8517808 --- /dev/null +++ b/tmcdriver/tmc/tmc_reg_cache.hpp @@ -0,0 +1,83 @@ +#pragma once +#include +#include +#include +#include +#include + +#include + +// +namespace iflytop { +using namespace std; +class TMCReg { + private: + /* data */ + public: + uint8_t flag = 0; + uint8_t reg = 0; + uint8_t val = 0; + + void setActiveFlag() { flag = flag | 0x01; } + bool isActive() { return flag & 0x01; } + + void setUpdateFlag() { flag = flag | 0x02; } + bool isUpdate() { return flag & 0x02; } +}; + +class TMCRegCache { + public: + TMCReg cache[50]; + + public: + void foreach (function fn) { + for (size_t i = 0; i < sizeof(cache) / sizeof(cache[0]); i++) { + if (cache[i].isActive() && cache[i].isUpdate()) { + fn(&cache[i]); + } + } + } + + bool activeReg(uint8_t reg) { + TMCReg* item = findReg(reg); + if (item) return true; + + item = findPassive(); + if (item) { + item->reg = reg; + item->setActiveFlag(); + return true; + } + + return false; + } + + void setReg(uint8_t reg, uint8_t val) { + TMCReg* item = findReg(reg); + if (item) { + item->val = val; + item->setUpdateFlag(); + } + } + + private: + TMCReg* findPassive() { + for (size_t i = 0; i < sizeof(cache) / sizeof(cache[0]); i++) { + if (!cache[i].isActive()) { + return &cache[i]; + } + } + return nullptr; + } + + TMCReg* findReg(uint8_t reg) { + for (size_t i = 0; i < sizeof(cache) / sizeof(cache[0]); i++) { + if (cache[i].isActive() && cache[i].reg == reg) { + return &cache[i]; + } + } + return nullptr; + } +}; + +} // namespace iflytop \ No newline at end of file diff --git a/tmcdriver/tmc51x0/tmc51x0.cpp b/tmcdriver/tmc51x0/tmc51x0.cpp index b230387..6041775 100644 --- a/tmcdriver/tmc51x0/tmc51x0.cpp +++ b/tmcdriver/tmc51x0/tmc51x0.cpp @@ -28,7 +28,9 @@ static const uint8_t tmc5130_defaultRegisterAccess[TMC5130_REGISTER_COUNT] = { 0x42, 0x01, 0x02, 0x01, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ // 0x70 - 0x7F }; #endif - +#define TMC5160_GLOBAL_SCALER 0x0B +#define TMC5160_GLOBAL_SCALER_MASK 0xFF +#define TMC5160_GLOBAL_SCALER_SHIFT 0 /*********************************************************************************************************************** * 工具�? * ***********************************************************************************************************************/ @@ -57,6 +59,25 @@ void TMC51X0::initialize(int mid, TMC51X0Cfg cfg) { stop(); + ZASSERT(m_cache.activeReg(TMC5130_CHOPCONF)); + ZASSERT(m_cache.activeReg(TMC5130_PWMCONF)); + ZASSERT(m_cache.activeReg(TMC5130_GCONF)); + ZASSERT(m_cache.activeReg(TMC5130_IHOLD_IRUN)); + ZASSERT(m_cache.activeReg(TMC5160_GLOBAL_SCALER)); + + ZASSERT(m_cache.activeReg(TMC5130_VMAX)); + ZASSERT(m_cache.activeReg(TMC5130_VSTART)); + ZASSERT(m_cache.activeReg(TMC5130_A1)); + ZASSERT(m_cache.activeReg(TMC5130_AMAX)); + ZASSERT(m_cache.activeReg(TMC5130_V1)); + ZASSERT(m_cache.activeReg(TMC5130_DMAX)); + ZASSERT(m_cache.activeReg(TMC5130_D1)); + ZASSERT(m_cache.activeReg(TMC5130_VSTOP)); + ZASSERT(m_cache.activeReg(TMC5130_TZEROWAIT)); + ZASSERT(m_cache.activeReg(TMC5130_ENCMODE)); + ZASSERT(m_cache.activeReg(TMC5130_ENC_CONST)); + ZASSERT(m_cache.activeReg(TMC5130_XENC)); + writeInt(TMC5130_PWMCONF, 0x000500C8); writeInt(TMC5130_CHOPCONF, 0x000100c3); writeInt(TMC5130_IHOLD_IRUN, 0x00051A00); @@ -67,11 +88,11 @@ void TMC51X0::initialize(int mid, TMC51X0Cfg cfg) { writeInt(TMC5130_TZEROWAIT, 0); setVstart(100); - setA1(30); - setAmax(50); + setA1(15); + setAmax(15); setV1(500); - setDmax(50); - setD1(30); + setDmax(15); + setD1(15); setVstop(100); setTzerowait(100); @@ -79,6 +100,13 @@ void TMC51X0::initialize(int mid, TMC51X0Cfg cfg) { enable(false); } +void TMC51X0::refreshcfg() { + m_cache.foreach ([this](TMCReg *item) { + ZLOGI(TAG, "refreshcfg %x,%x", item->reg, item->val); + writeInt(item->reg, item->val); + }); +} + /******************************************************************************* * 驱动器寄存器读写方法 * *******************************************************************************/ @@ -95,6 +123,7 @@ void TMC51X0::writeDatagram(uint8_t address, uint8_t x1, uint8_t x2, uint8_t x3, readWriteArray(&data[0], 5); } void TMC51X0::writeInt(uint8_t address, int32_t value) { // + m_cache.setReg(address, value); writeDatagram(address, BYTE(value, 3), BYTE(value, 2), BYTE(value, 1), BYTE(value, 0)); } @@ -206,6 +235,10 @@ void TMC51X0::moveTo(int32_t position, uint32_t velocityMax) { void TMC51X0::moveToEnd(int32_t direction, uint32_t velocityMax) { zlock_guard lkg(m_mutex); + // @WARNING: + // the motor will stop running(1000RPM) for about 10 minutes + // If you really need to use this feature, reset XACTUAL every 30s + setXACTUAL(0); if (direction >= 0) { writeInt(TMC5130_RAMPMODE, TMC5130_MODE_POSITION); writeInt(TMC5130_VMAX, to_motor_vel(velocityMax)); @@ -321,9 +354,6 @@ void TMC51X0::setIHOLD_IRUN(uint8_t ihold, uint8_t irun, uint16_t iholddelay) { writeInt(TMC5130_IHOLD_IRUN, (iholddelay << TMC5130_IHOLDDELAY_SHIFT) | (irun << TMC5130_IRUN_SHIFT) | (ihold << TMC5130_IHOLD_SHIFT)); } void TMC51X0::setGlobalScale(uint8_t globalscale) { -#define TMC5160_GLOBAL_SCALER 0x0B -#define TMC5160_GLOBAL_SCALER_MASK 0xFF -#define TMC5160_GLOBAL_SCALER_SHIFT 0 zlock_guard lkg(m_mutex); if (isTMC5130()) { return; diff --git a/tmcdriver/tmc51x0/tmc51x0.hpp b/tmcdriver/tmc51x0/tmc51x0.hpp index 34dab70..02aefe2 100644 --- a/tmcdriver/tmc51x0/tmc51x0.hpp +++ b/tmcdriver/tmc51x0/tmc51x0.hpp @@ -7,6 +7,7 @@ // #include "../tmc/tmc_type.h" +#include "../tmc/tmc_reg_cache.hpp" #include "reg/TMC5130_Type.h" #include "stm32basic/stm32basic.hpp" namespace iflytop { @@ -24,9 +25,11 @@ class TMC51X0Cfg { TMC51X0Cfg() {} }; + class TMC51X0 { protected: - TMC51X0Cfg m_cfg; + TMC51X0Cfg m_cfg; + TMCRegCache m_cache; SPI_HandleTypeDef *m_hspi = NULL; ZGPIO m_csnpin; @@ -56,6 +59,7 @@ class TMC51X0 { public: bool ping(); void enable(bool enable); + void refreshcfg(); void setdriErr(bool val) { m_driErr = val; } bool getdriErr() { return m_driErr; } From 29c41362b35e5097f8b52751098aede52133aed5 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 10 Sep 2024 20:12:41 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtmc=5Freg=5Fcache?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tmcdriver/tmc/tmc_reg_cache.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tmcdriver/tmc/tmc_reg_cache.hpp b/tmcdriver/tmc/tmc_reg_cache.hpp index 8517808..319a051 100644 --- a/tmcdriver/tmc/tmc_reg_cache.hpp +++ b/tmcdriver/tmc/tmc_reg_cache.hpp @@ -14,9 +14,9 @@ class TMCReg { private: /* data */ public: - uint8_t flag = 0; - uint8_t reg = 0; - uint8_t val = 0; + uint8_t flag = 0; + uint8_t reg = 0; + int32_t val = 0; void setActiveFlag() { flag = flag | 0x01; } bool isActive() { return flag & 0x01; } @@ -27,7 +27,7 @@ class TMCReg { class TMCRegCache { public: - TMCReg cache[50]; + TMCReg cache[20]; public: void foreach (function fn) { @@ -52,7 +52,7 @@ class TMCRegCache { return false; } - void setReg(uint8_t reg, uint8_t val) { + void setReg(uint8_t reg, int32_t val) { TMCReg* item = findReg(reg); if (item) { item->val = val; From 16ccc17d6d41154562af9294f49c5545cedaea00 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 10 Sep 2024 20:25:54 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=B8=B0=E5=AF=8CmoveToEnd=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tmcdriver/tmc51x0/tmc51x0.cpp | 8 +++++++- tmcdriver/tmc51x0/tmc51x0.hpp | 10 ++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/tmcdriver/tmc51x0/tmc51x0.cpp b/tmcdriver/tmc51x0/tmc51x0.cpp index 6041775..4131cba 100644 --- a/tmcdriver/tmc51x0/tmc51x0.cpp +++ b/tmcdriver/tmc51x0/tmc51x0.cpp @@ -213,7 +213,7 @@ void TMC51X0::stop() { } else { rotate(0); } - + m_isMoveToEnd = false; // rotate(0); } void TMC51X0::rotate(int32_t velocity) { @@ -222,6 +222,7 @@ void TMC51X0::rotate(int32_t velocity) { velocity = to_motor_vel(velocity); writeInt(TMC5130_VMAX, abs(velocity)); writeInt(TMC5130_RAMPMODE, (velocity >= 0) ? TMC5130_MODE_VELPOS : TMC5130_MODE_VELNEG); + m_isMoveToEnd = false; } void TMC51X0::moveTo(int32_t position, uint32_t velocityMax) { zlock_guard lkg(m_mutex); @@ -231,6 +232,7 @@ void TMC51X0::moveTo(int32_t position, uint32_t velocityMax) { writeInt(TMC5130_RAMPMODE, TMC5130_MODE_POSITION); writeInt(TMC5130_VMAX, velocityMax); writeInt(TMC5130_XTARGET, position); + m_isMoveToEnd = false; } void TMC51X0::moveToEnd(int32_t direction, uint32_t velocityMax) { zlock_guard lkg(m_mutex); @@ -248,8 +250,12 @@ void TMC51X0::moveToEnd(int32_t direction, uint32_t velocityMax) { writeInt(TMC5130_VMAX, to_motor_vel(velocityMax)); writeInt(TMC5130_XTARGET, INT32_MIN / 1.5 + 1000); } + m_isMoveToEnd = true; } +void TMC51X0::refreshMoveToEnd() { setXACTUAL(0); } +bool TMC51X0::isMoveToEnd() { return m_isMoveToEnd; } + void TMC51X0::moveBy(int32_t relativePosition, uint32_t velocityMax) { // determine actual position and add numbers of ticks to move zlock_guard lkg(m_mutex); diff --git a/tmcdriver/tmc51x0/tmc51x0.hpp b/tmcdriver/tmc51x0/tmc51x0.hpp index 02aefe2..a862dfa 100644 --- a/tmcdriver/tmc51x0/tmc51x0.hpp +++ b/tmcdriver/tmc51x0/tmc51x0.hpp @@ -6,8 +6,8 @@ #include // -#include "../tmc/tmc_type.h" #include "../tmc/tmc_reg_cache.hpp" +#include "../tmc/tmc_type.h" #include "reg/TMC5130_Type.h" #include "stm32basic/stm32basic.hpp" namespace iflytop { @@ -25,7 +25,6 @@ class TMC51X0Cfg { TMC51X0Cfg() {} }; - class TMC51X0 { protected: TMC51X0Cfg m_cfg; @@ -42,8 +41,9 @@ class TMC51X0 { double m_onecirclepulse = 51200; int32_t m_enc_resolution = 0; // - zmutex m_mutex = {"TMC51X0"}; - bool m_driErr = false; + zmutex m_mutex = {"TMC51X0"}; + bool m_driErr = false; + bool m_isMoveToEnd = false; public: void initialize(int mid, TMC51X0Cfg cfg); @@ -69,6 +69,8 @@ class TMC51X0 { void rotate(int32_t velocity); void moveTo(int32_t position, uint32_t velocityMax); void moveToEnd(int32_t direction, uint32_t velocityMax); + void refreshMoveToEnd(); + bool isMoveToEnd(); void moveBy(int32_t relativePosition, uint32_t velocityMax); void stop(); /*********************************************************************************************************************** From 4e7f7f3c3e59d813586e88ef6e30ffe8c8594653 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 12 Sep 2024 10:21:22 +0800 Subject: [PATCH 5/6] add pvd detect --- sysmgr/sys_mgr.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 8 deletions(-) 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()); From 2d392a81f356b3987da8eb7883dd002585c446b2 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 12 Sep 2024 13:41:40 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=8D=E4=BD=8D?= =?UTF-8?q?=E5=8E=9F=E5=9B=A0=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sysmgr/sys_mgr.cpp | 27 +++++++++++++++++++++++++++ sysmgr/sys_mgr.hpp | 23 +++++++++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/sysmgr/sys_mgr.cpp b/sysmgr/sys_mgr.cpp index 889c6b9..e0a7243 100644 --- a/sysmgr/sys_mgr.cpp +++ b/sysmgr/sys_mgr.cpp @@ -126,6 +126,32 @@ SysMgr* SysMgr::ins() { size_t SysMgr::osGetSysRunTime() { return HAL_GetTick(); } UBaseType_t uxTaskGetSystemState(TaskStatus_t* const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t* const pulTotalRunTime); +void SysMgr::checkRst(void) { + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) { // NRST 引脚复位 + printf("RESET_REASON: PIN reset \n"); + m_reset_reason = kreset_reason_pinrst; + } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) { // 上电掉电复位 + printf("RESET_REASON: POR/PDR reset \n"); + m_reset_reason = kreset_reason_porrst; + } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) { // 软件复位 + printf("RESET_REASON: Software reset \n"); + m_reset_reason = kreset_reason_sftrst; + } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) { // 独立看门狗复位 + printf("RESET_REASON: Independent watchdog reset \n"); + m_reset_reason = kreset_reason_iwdgrst; + } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) { // 窗口看门狗复位 + printf("RESET_REASON: Window watchdog reset \n"); + m_reset_reason = kreset_reason_wwdgrst; + } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST) != RESET) { // 低功耗复位 + printf("RESET_REASON: (Low-power reset \n"); + m_reset_reason = kreset_reason_lpwrrst; + } else { + printf("RESET_REASON: Unkown reset \n"); + m_reset_reason = kreset_reason_unkown; + } + __HAL_RCC_CLEAR_RESET_FLAGS(); // 清除复位标志 +} + void SysMgr::initedFinished() { // static TaskStatus_t pxTaskStatusArray[SDK_MAX_TASK + 1]; UBaseType_t uxArraySize = SDK_MAX_TASK + 1; @@ -137,6 +163,7 @@ void SysMgr::initedFinished() { // ZASSERT_INFO(m_ntask < SDK_MAX_TASK, "task num is too large, please increase SDK_MAX_TASK"); PVD_Init(); + checkRst(); } size_t SysMgr::osGetMinimumEverFreeHeapSize() { return ::xPortGetMinimumEverFreeHeapSize(); } diff --git a/sysmgr/sys_mgr.hpp b/sysmgr/sys_mgr.hpp index 3e43b64..609b426 100644 --- a/sysmgr/sys_mgr.hpp +++ b/sysmgr/sys_mgr.hpp @@ -7,13 +7,24 @@ class ZTaskInfo { osThreadId Id; }; +typedef enum { + kreset_reason_pinrst = 1, // NRST引脚复位 + kreset_reason_porrst = 2, // 上电掉电复位 + kreset_reason_sftrst = 3, // 软件复位 + kreset_reason_iwdgrst = 4, // 独立看门狗复位 + kreset_reason_wwdgrst = 5, // 窗口看门狗复位 + kreset_reason_lpwrrst = 6, // 低功耗复位 + kreset_reason_unkown = 7, // +} reset_reason_t; + class SysMgr { private: /* data */ public: - ZTaskInfo m_task[30] = {0}; - int m_ntask = 0; + ZTaskInfo m_task[30] = {0}; + int m_ntask = 0; + reset_reason_t m_reset_reason = kreset_reason_unkown; static SysMgr* ins(); void initedFinished(); @@ -45,6 +56,14 @@ class SysMgr { void osTaskGetState(osThreadId id, char* state); int32_t getTaskNum(); + + /*********************************************************************************************************************** + * CHIP * + ***********************************************************************************************************************/ + reset_reason_t chipGetResetReason() { return m_reset_reason; } + + private: + void checkRst(void); }; } // namespace iflytop