Files
Frame-rate-optimization/Common/systick.c
2026-04-09 10:14:20 +08:00

59 lines
1.1 KiB
C

#include "systick.h"
__IO uint64_t g_system_tick = 0;
void systick_config(void)
{
/* setup systick timer for 1000Hz interrupts */
if(SysTick_Config( system_core_clock / 1000U)) {
/* capture error */
while(1) {
}
}
/* configure the systick handler priority */
NVIC_SetPriority(SysTick_IRQn, 0x00U);
}
uint64_t get_system_tick(void)
{
return g_system_tick;
}
void delay_us(uint32_t _us)
{
uint32_t ticks;
uint32_t told, tnow, tcnt = 0;
// 计算需要的时钟数 = 延迟微秒数 * 每微秒的时钟数
ticks = _us * (SystemCoreClock / 1000000);
// 获取当前的SysTick值
told = SysTick->VAL;
while (1)
{
// 重复刷新获取当前的SysTick值
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
tcnt += told - tnow;
else
tcnt += SysTick->LOAD - tnow + told;
told = tnow;
// 如果达到了需要的时钟数,就退出循环
if (tcnt >= ticks)
break;
}
}
}
void delay_ms(uint32_t _ms) { delay_us(_ms * 500); }