专栏中心

EEPW首页 > 专栏 > RT-Thread高精度延时实现

RT-Thread高精度延时实现

发布人:电子禅石 时间:2019-04-28 来源:工程师 发布文章

主要就是说明:us 延时的实现。方法是时钟摘取法。

RT-Thread 定时器的最小精度是由系统时钟节拍所决定的(1 OS Tick = 1/RT_TICK_PER_SECOND 秒,RT_TICK_PER_SECOND 值在 rtconfig.h 文件中定义),定时器设定的时间必须是 OS Tick 的整数倍。当需要实现更短时间长度的系统定时时,例如 OS Tick 是 10ms,而程序需要实现 1ms 的定时或延时,这种时候操作系统定时器将不能够满足要求,只能通过读取系统某个硬件定时器的计数器或直接使用硬件定时器的方式。

在 Cortex-M 系列中,SysTick 已经被 RT-Thread 用于作为 OS Tick 使用,它被配置成 1/RT_TICK_PER_SECOND 秒后触发一次中断的方式,中断处理函数使用 Cortex-M3 默认的 SysTick_Handler 名字。在 Cortex-M3 的 CMSIS(Cortex Microcontroller Software Interface Standard)规范中规定了 SystemCoreClock 代表芯片的主频,所以基于 SysTick 以及 SystemCoreClock,我们能够使用 SysTick 获得一个精确的延时函数,如下例所示,Cortex-M3 上的基于 SysTick 的精确延时(需要系统在使能 SysTick 后使用):

高精度延时的例程如下所示:

/**
 * This function will delay for some us.
 *
 * @param us the delay time of us
 */
void rt_hw_us_delay(rt_uint32_t us)
{
    rt_uint32_t start, now, delta, reload, us_tick;
    start = SysTick->VAL;
    reload = SysTick->LOAD;
    us_tick = SystemCoreClock / 1000000UL;//比如系统时钟频率是80M 那么1us 需要80个周期
    do {
        now = SysTick->VAL;
        delta = start > now ? start - now : reload + start - now;//是倒数 还是正数
    } while(delta < us_tick * us);
}

QQ群:嵌入式进阶,271882374,期待和大家交流。

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

高管离职潮持续,特斯拉Cybertruck、Model Y项目负责人相继离职

中汽创智发布 “人 - 车 - 路 - 云 - 星” 平台 车路云一体化战略落地发布

四通道热电偶集成冷端补偿与多项式线性化功能

AMD在两家公司改革合作伙伴计划时给英特尔施加渠道压力

公投!

jackwang 2003-11-28

带插入式I/O的Zynq UltraScale+MPSoC模块

英特尔人工智能领导者Sachin Katti将加入OpenAI

自动级 4 端子分流电阻器提供精确检测

英飞凌推出全新软件开发集成工具AURIX™ Configuration Studio

Molex为先进汽车系统提供高性能连接的高速FAKRA-Mini(HFM)互连系统在贸泽开售

FURY Renegade G8系列NVMe SSD中添加了5TB选项

更多 培训课堂
更多 焦点
更多 视频

技术专区