diff --git a/chip/basic/clock.cpp b/chip/basic/clock.cpp index 02c7969..452294e 100644 --- a/chip/basic/clock.cpp +++ b/chip/basic/clock.cpp @@ -20,9 +20,6 @@ uint32_t zchip_clock_init(zchip_clock_cfg_t* cfg) { cfg->usdleaytim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_Base_Init(cfg->usdleaytim); - HAL_NVIC_SetPriority(chip_tim_get_irq(cfg->usdleaytim), IFLYTOP_PREEMPTPRIORITY_DEFAULT, 0); - HAL_NVIC_EnableIRQ(chip_tim_get_irq(cfg->usdleaytim)); - return 0; } // diff --git a/chip/chip.cpp b/chip/chip.cpp index 7881f69..356cd2a 100644 --- a/chip/chip.cpp +++ b/chip/chip.cpp @@ -1,10 +1,15 @@ #include "chip.hpp" extern "C" { -static iflytop::ZGPIO *g_debuglight = NULL; + +static iflytop::ZGPIO g_debuglight; +static Pin_t g_debuglight_pin = PinNull; void chip_init(chip_cfg_t *cfg) { - g_debuglight = cfg->debuglight; + g_debuglight_pin = cfg->debuglight; + if (g_debuglight_pin != PinNull) { + g_debuglight.initAsOutput(g_debuglight_pin, iflytop::ZGPIO::kMode_nopull, false, false); + } // zchip_loggger_init(cfg->huart); // @@ -18,8 +23,8 @@ void chip_init(chip_cfg_t *cfg) { iflytop::ChipTimIrqShceduler::instance().regPeriodJob( [](iflytop::ChipTimIrqShceduler::Job *job) { - if (!g_debuglight) return; - g_debuglight->toggleState(); + if (g_debuglight_pin == PinNull) return; + g_debuglight.toggleState(); }, 100); diff --git a/chip/chip.hpp b/chip/chip.hpp index 2d2c85a..2707b5d 100644 --- a/chip/chip.hpp +++ b/chip/chip.hpp @@ -10,10 +10,10 @@ extern "C" { typedef struct { - zchip_tim_t *us_dleay_tim; - zchip_tim_t *tim_irq_scheduler_tim; - zchip_uart_t *huart; - iflytop::ZGPIO *debuglight; + zchip_tim_t *us_dleay_tim; + zchip_tim_t *tim_irq_scheduler_tim; + zchip_uart_t *huart; + Pin_t debuglight; } chip_cfg_t; void chip_init(chip_cfg_t *cfg); diff --git a/chip/chip_tim_irq_shceduler.cpp b/chip/chip_tim_irq_shceduler.cpp index a920d58..e280039 100644 --- a/chip/chip_tim_irq_shceduler.cpp +++ b/chip/chip_tim_irq_shceduler.cpp @@ -41,6 +41,9 @@ void ChipTimIrqShceduler::simpleTimer_startByFreq(float freq) { m_htim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_Base_Init(m_htim); + HAL_NVIC_SetPriority(chip_tim_get_irq(m_htim), IFLYTOP_PREEMPTPRIORITY_DEFAULT, 0); + HAL_NVIC_EnableIRQ(chip_tim_get_irq(m_htim)); + HAL_TIM_Base_Start_IT(m_htim); ZIRQDispatcher::instance().regTimIrqListener([this](zchip_tim_t* tim) { diff --git a/chip/zirq_dispatcher.cpp b/chip/zirq_dispatcher.cpp index f345f52..533e32f 100644 --- a/chip/zirq_dispatcher.cpp +++ b/chip/zirq_dispatcher.cpp @@ -4,7 +4,20 @@ using namespace iflytop; using namespace std; extern "C" { -void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) { ZIRQDispatcher::instance()._callOnTimIrq(htim); } +/** + * @brief 这个方法必须在HAL_TIM_PeriodElapsedCallback中调用 + * + * @param htim + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { +#ifdef IFLTYOP_ZTICKET_TIMER + if (htim->Instance == IFLTYOP_ZTICKET_TIMER) { + HAL_IncTick(); + return; + } +#endif + ZIRQDispatcher::instance()._callOnTimIrq(htim); +} } ZIRQDispatcher &ZIRQDispatcher::instance() {