diff --git a/app/MDK-ARM/app.uvguix.29643 b/app/MDK-ARM/app.uvguix.29643 index acbdca2..14694c7 100644 --- a/app/MDK-ARM/app.uvguix.29643 +++ b/app/MDK-ARM/app.uvguix.29643 @@ -110,8 +110,8 @@ 0 - 323 - 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000001000000000000000100000079433A5C55736572735C32393634335C4465736B746F705C705F626F6469746563685F76696461735F61383030305C705F626F6469746563685F76696461735F61383030305F496E63756261746F725F636F6E74726F6C5F73797374656D5F636F70795C7372635C626F6172645C68617264776172652E637070000000000C68617264776172652E63707000000000C5D4F200FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000320900008B000000D00E0000DF020000 + 60 + 010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000000000000 @@ -1806,7 +1806,7 @@ File 2537 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050FFFFFFFF0096000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000400020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000004000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000004000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000400000000000000000000000000000000000001000000010000009600000002002050FFFFFFFF0096000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000004001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 1423 @@ -1822,7 +1822,7 @@ Build 966 - 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000002001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000036170709600000000000000010003617070000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000002001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000036170709600000000000000010003617070000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 583 @@ -3598,22 +3598,4 @@ - - 1 - 0 - - 100 - 0 - - ..\..\src\board\hardware.cpp - 0 - 1 - 9 - 1 - - 0 - - - - diff --git a/src/board/fan_state_monitor.cpp b/src/board/fan_state_monitor.cpp index e69de29..b98d172 100644 --- a/src/board/fan_state_monitor.cpp +++ b/src/board/fan_state_monitor.cpp @@ -0,0 +1,70 @@ +#include "fan_state_monitor.hpp" + +#include "libiflytop_micro/stm32/basic/basic.h" +#include "libiflytop_micro\stm32\basic/stm32_hal.hpp" + +using namespace iflytop; + +#define TAG "FAN_STATE_MONITOR" +void FanStateMonitor::initialize(IflytopMicroOS* os, GPIO_TypeDef* FB_GPIOx, uint16_t FB_GPIO_Pin, bool* fanstate) { + m_FB_GPIOx = FB_GPIOx; + m_FB_GPIO_Pin = FB_GPIO_Pin; + m_fanstate = fanstate; + m_os = os; + m_fanFBCount = 0; + m_lastPinState = GPIO_PIN_RESET; + m_lastCallTicket = 0; + m_fanOpenTicket = 0; + m_lastFanState = false; + m_fanError = false; + + STM32_HAL::gpioInitAsInput(FB_GPIOx, FB_GPIO_Pin); + m_lastPinState = HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin); +} +void FanStateMonitor::doFanStateCheckPeriodicJob() { + /** + * @brief 捕获风扇异常反馈信号 + */ + GPIO_PinState pinState = HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin); + if (HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin) != m_lastPinState) { + m_fanFBCount++; + m_count++; + m_lastPinState = pinState; + } + /** + * @brief 电机工作超过2秒,且2秒内没有反馈信号,判断电机不工作 + */ + if (m_os->hasPassedMS(m_fanOpenTicket) > 2000 && m_os->hasPassedMS(m_lastCallTicket) > 2000) { + if (m_fanFBCount == 0) { + ZLOGE(TAG, "Fan is not working!"); + m_fanError = true; + } + m_lastCallTicket = m_os->getTicket(); + m_fanFBCount = 0; + } +} +void FanStateMonitor::periodicJob() { + // + bool& fanstate = *m_fanstate; + + if (fanstate != m_lastFanState) { + m_lastFanState = fanstate; + if (fanstate) { + /** + * @brief 风扇有关到开 + */ + // 启动检查 + m_fanOpenTicket = m_os->getTicket(); + m_lastCallTicket = m_os->getTicket(); + m_fanFBCount = 0; + m_fanError = false; + } + } + + /** + * @brief 如果当前风扇正在工作,则周期性检查风扇状态 + */ + if (fanstate) { + doFanStateCheckPeriodicJob(); + } +} \ No newline at end of file diff --git a/src/board/fan_state_monitor.hpp b/src/board/fan_state_monitor.hpp index e69de29..45f2c5a 100644 --- a/src/board/fan_state_monitor.hpp +++ b/src/board/fan_state_monitor.hpp @@ -0,0 +1,46 @@ +#pragma once +#include "libiflytop_micro/stm32/basic/iflytop_micro_os.hpp" +#include "main.h" +namespace iflytop { +class FanStateMonitor { + GPIO_TypeDef* m_FB_GPIOx; // 风扇反馈引脚 + uint16_t m_FB_GPIO_Pin; // 风扇反馈引脚 + bool* m_fanstate; // 风扇当前是否正在工作 + IflytopMicroOS* m_os; // 系统基础方法 + uint16_t m_fanFBCount; // 风扇反馈计数 + GPIO_PinState m_lastPinState; // 上次风扇反馈引脚状态,用来实现风扇反馈计数逻辑 + uint32_t m_lastCallTicket; // 上次调用周期性任务的时间戳 + uint32_t m_fanOpenTicket; // 风扇打开的时间戳 + bool m_lastFanState; // 上次风扇状态,用来实现捕获风扇打开事件 + + bool m_fanError; // 风扇故障标志位 + uint32_t m_count; // 总计数,不清零 + + public: + FanStateMonitor(/* args */){}; + ~FanStateMonitor(){}; + + void initialize(IflytopMicroOS* os, GPIO_TypeDef* FB_GPIOx, uint16_t FB_GPIO_Pin, bool* fanstate); + + /** + * @brief 读取风扇故障状态 + * 风扇故障异常会在以下两种情况被清除 + * 1. 风扇关闭后又重新启动 + * 2. 上层代码调用clearFanError()清除 + * @return true + * @return false + */ + bool getFanError() { return m_fanError; } + void clearFanError() { m_fanError = false; } + uint32_t getCount() { return m_count; } + /******************************************************************************* + * 周期性调度任务 * + *******************************************************************************/ + /** + * @brief 周期性调度任务,需要上层代码尽可能的频繁调度 + */ + void periodicJob(); + private: + void doFanStateCheckPeriodicJob(); +}; +} // namespace iflytop \ No newline at end of file diff --git a/src/board/hardware.cpp b/src/board/hardware.cpp index 8ac8639..80e93f8 100644 --- a/src/board/hardware.cpp +++ b/src/board/hardware.cpp @@ -180,12 +180,12 @@ void Hardware::fan_init(int freq) { * FAN4_FB_INT PC7 * FAN5_FB_INT PC10 */ - // m_fan.fanStateMonitor[0].initialize(this, GPIOC, GPIO_PIN_1, fanGetPowerState(0)); - // m_fan.fanStateMonitor[1].initialize(this, GPIOC, GPIO_PIN_4, fanGetPowerState(1)); - // m_fan.fanStateMonitor[2].initialize(this, GPIOC, GPIO_PIN_5, fanGetPowerState(2)); - // m_fan.fanStateMonitor[3].initialize(this, GPIOC, GPIO_PIN_6, fanGetPowerState(3)); - // m_fan.fanStateMonitor[4].initialize(this, GPIOC, GPIO_PIN_7, fanGetPowerState(4)); - // m_fan.fanStateMonitor[5].initialize(this, GPIOC, GPIO_PIN_10, fanGetPowerState(5)); + m_fan.fanStateMonitor[0].initialize(this, GPIOC, GPIO_PIN_1, fanGetPowerState(0)); + m_fan.fanStateMonitor[1].initialize(this, GPIOC, GPIO_PIN_4, fanGetPowerState(1)); + m_fan.fanStateMonitor[2].initialize(this, GPIOC, GPIO_PIN_5, fanGetPowerState(2)); + m_fan.fanStateMonitor[3].initialize(this, GPIOC, GPIO_PIN_6, fanGetPowerState(3)); + m_fan.fanStateMonitor[4].initialize(this, GPIOC, GPIO_PIN_7, fanGetPowerState(4)); + m_fan.fanStateMonitor[5].initialize(this, GPIOC, GPIO_PIN_10, fanGetPowerState(5)); } void Hardware::fanSetDutyCycle(int fanIndex, uint16_t dutyCycle) { @@ -259,9 +259,9 @@ void Hardware::fan_periodicJob() { /** * @brief 风扇状态监控服务周期调度 */ - // for (size_t i = 0; i < ZARRAY_SIZE(m_fan.fanStateMonitor); i++) { - // m_fan.fanStateMonitor[i].periodicJob(); - // } + for (size_t i = 0; i < ZARRAY_SIZE(m_fan.fanStateMonitor); i++) { + m_fan.fanStateMonitor[i].periodicJob(); + } /** * @brief 风扇测试 @@ -286,12 +286,12 @@ void Hardware::fan_periodicJob() { *fanGetPowerState(4), // *fanGetPowerState(5)); // - // ZLOGI(TAG, "FANCount:%d,%d,%d,%d,%d,%d", m_fan.fanStateMonitor[0].getCount(), // - // m_fan.fanStateMonitor[1].getCount(), // - // m_fan.fanStateMonitor[2].getCount(), // - // m_fan.fanStateMonitor[3].getCount(), // - // m_fan.fanStateMonitor[4].getCount(), // - // m_fan.fanStateMonitor[5].getCount()); + ZLOGI(TAG, "FANCount:%d,%d,%d,%d,%d,%d", m_fan.fanStateMonitor[0].getCount(), // + m_fan.fanStateMonitor[1].getCount(), // + m_fan.fanStateMonitor[2].getCount(), // + m_fan.fanStateMonitor[3].getCount(), // + m_fan.fanStateMonitor[4].getCount(), // + m_fan.fanStateMonitor[5].getCount()); } } } diff --git a/src/board/hardware.hpp b/src/board/hardware.hpp index 12e6b98..78c8d7e 100644 --- a/src/board/hardware.hpp +++ b/src/board/hardware.hpp @@ -1,5 +1,6 @@ #pragma once +#include "board/fan_state_monitor.hpp" #include "board/project_board.hpp" #include "i2c.h" #include "libiflytop_micro/stm32/basic/basic.h" @@ -18,7 +19,7 @@ class HardwareListener { virtual void Hardware_onHomeRefSwitchISR(){}; }; -class Hardware { +class Hardware : public IflytopMicroOS { private: /* data */ @@ -37,11 +38,11 @@ class Hardware { int32_t pwm; }; struct fan_res_t { - // FanStateMonitor fanStateMonitor[6]; - bool m_fanState[6]; - uint16_t fan0_3duty; - uint16_t fan4duty; - uint16_t fan5duty; + FanStateMonitor fanStateMonitor[6]; + bool m_fanState[6]; + uint16_t fan0_3duty; + uint16_t fan4duty; + uint16_t fan5duty; }; fan_res_t m_fan; can_res_t m_can;