时钟节拍
时钟节拍在 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 定时器。
延时的时候要关全局中断。