2026-05-10 17:28:14 +08:00
|
|
|
/**
|
|
|
|
|
* @file systick.cpp
|
|
|
|
|
* @brief SysTick 时基模块实现。
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "main.h"
|
|
|
|
|
#include "sys/systick.h"
|
|
|
|
|
|
|
|
|
|
volatile uint32_t SysTickTimer::s_ms = 0U;
|
|
|
|
|
|
2026-05-10 21:27:51 +08:00
|
|
|
/**
|
|
|
|
|
* @brief SysTick 中断处理入口。
|
|
|
|
|
* @param[in] 无。
|
|
|
|
|
* @param[out] 无。
|
|
|
|
|
* @retval 无返回值。
|
|
|
|
|
* @note 每次 SysTick 中断到来时,将毫秒计数器自增 1。
|
|
|
|
|
*/
|
2026-05-10 17:28:14 +08:00
|
|
|
void SysTickTimer::onInterrupt()
|
|
|
|
|
{
|
|
|
|
|
s_ms++;
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-10 21:27:51 +08:00
|
|
|
/**
|
|
|
|
|
* @brief 执行毫秒级阻塞延时。
|
|
|
|
|
* @param[in] ms 需要延时的毫秒数。
|
|
|
|
|
* @param[out] 无。
|
|
|
|
|
* @retval 无返回值。
|
|
|
|
|
* @note 基于 SysTick 维护的毫秒计数器忙等,适用于短时初始化等待。
|
|
|
|
|
*/
|
2026-05-10 17:28:14 +08:00
|
|
|
void SysTickTimer::delayMs(uint32_t ms)
|
|
|
|
|
{
|
|
|
|
|
uint32_t start = s_ms;
|
|
|
|
|
while((s_ms - start) < ms) { }
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-10 21:27:51 +08:00
|
|
|
/**
|
|
|
|
|
* @brief 初始化 1ms SysTick 时基。
|
|
|
|
|
* @param[in] 无。
|
|
|
|
|
* @param[out] 无。
|
|
|
|
|
* @retval 无返回值。
|
|
|
|
|
* @note 先更新 `SystemCoreClock`,再按 1kHz 频率配置 SysTick。
|
|
|
|
|
*/
|
2026-05-10 17:28:14 +08:00
|
|
|
void SysTickTimer::initMs()
|
|
|
|
|
{
|
|
|
|
|
SystemCoreClockUpdate();
|
|
|
|
|
SysTick_Config(SystemCoreClock / 1000U);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ----- 中断入口 C 包装 ---------------------------------------------- */
|
2026-05-10 21:27:51 +08:00
|
|
|
/**
|
|
|
|
|
* @brief SysTick 中断向量入口。
|
|
|
|
|
* @param[in] 无。
|
|
|
|
|
* @param[out] 无。
|
|
|
|
|
* @retval 无返回值。
|
|
|
|
|
* @note C 向量包装函数,内部转调 `SysTickTimer::onInterrupt()`。
|
|
|
|
|
*/
|
2026-05-30 00:24:31 +08:00
|
|
|
extern "C" void SysTick_Handler(void) { SysTickTimer::onInterrupt(); }
|