没志青年
发布于 2025-07-28 / 16 阅读
0

RT-Thread 时钟节拍与延时

时钟节拍

时钟节拍在 rtconfig.h 中设置

/* 
*频率是 1000HZ 周期是 1/1000 s
*所以节拍是 1ms
*/
#define RT_TICK_PER_SECOND 1000

给 RT-Thread 提供时钟节拍:

void SysTick_Handler(void)
{
    rt_interrupt_enter();
    rt_tick_increase();     // 系统从启动到现在的节拍数 + 1
    rt_interrupt_leave();
}

// 具体使用参考移植

获取时钟节拍

rt_tick_t rt_tick_get(void);

延时函数

示例程序:

void rt_hw_us_delay(rt_uint32_t us)
{
    rt_uint32_t ticks;
    rt_uint32_t told, tnow, tcnt = 0;
    rt_uint32_t reload = SysTick->LOAD;

    /* 获得延时经过的 tick 数 */
    ticks = us * reload / (1000000 / RT_TICK_PER_SECOND);
    /* 获得当前时间 */
    told = SysTick->VAL;
    while (1)
    {
        /* 循环获得当前时间,直到达到指定的时间后退出循环 */
        tnow = SysTick->VAL;
        if (tnow != told)
        {
            if (tnow < told)
            {
                tcnt += told - tnow;
            }
            else
            {
                tcnt += reload - tnow + told;
            }
            told = tnow;
            if (tcnt >= ticks)
            {
                break;
            }
        }
    }
}

注意:这个函数只支持低于 1 个 OS Tick 的延时。

或者使用 DWT 定时器。

延时的时候要关全局中断。