说明:记录日常使用 RT_Thread 开发时做的笔记。
持续更新中,欢迎收藏。
1. 延时函数
1. us延时函数
rt_hw_us_delay(rt_uint32_t us);//输如数据是us
rt_hw_us_delay(200);//输入数据是us
2. ms延时函数
rt_thread_mdelay(1000);//输入数据是ms
2. 定时器函数
官网资料:https://www.rt-thread.org/document/site/programming-manual/timer/timer/#_14
/* 定时器的控制块 */
static struct rt_timer timer1;
static int cnt = 0;
/* 定时器 1 超时函数 */
static void timeout1(void* parameter)
{
rt_kprintf("定时器触发 第 %d 次\n",cnt);
/* 运行 10 次 */
if (cnt++>= 9)
{
rt_timer_stop(&timer1); /*关闭定时器*/
}
}
int timer_static_sample(void)
{
/* 初始化定时器 */
rt_timer_init(&timer1, "timer1", /* 定时器名字是 timer1 */
timeout1, /* 超时时回调的处理函数 */
RT_NULL, /* 超时函数的入口参数 */
1000, /* 定时长度,以 OS Tick 为单位,即 10 个 OS Tick */
RT_TIMER_FLAG_PERIODIC|RT_TIMER_FLAG_SOFT_TIMER ); /* 周期性定时器|软件定时器 */
/* 启动定时器 */
rt_timer_start(&timer1);
return 0;
}
INIT_APP_EXPORT(timer_static_sample);
/*以下是其他应用记录:在运行过程中根据需求变更定时器时间*/
uint32_t timeout;
rt_timer_control(&uvled_off_time, RT_TIMER_CTRL_SET_TIME, &timeout);/* 20210924 新增:设置定时器时间 */
rt_timer_start(&uvled_off_time); /* 启动定时器 */
3. 获取时钟节拍 rt_tick_t rt_tick_get(void);
由于全局变量 rt_tick 在每经过一个时钟节拍时,值就会加 1,通过调用 rt_tick_get 会返回当前 rt_tick 的值,即可以获取到当前的时钟节拍值。
此接口可用于记录系统的运行时间长短,或者测量某任务运行的时间。接口函数如下:
rt_tick_t rt_tick_get(void);
下表描述了 rt_tick_get() 函数的返回值:
返回 | 描述 |
rt_tick | 当前时钟节拍值 |
1.应用范例
rt_tick_t start_time = 0;
start_time = rt_tick_get();
2. 毫秒转换为时分秒
uint32_t sys_time,sys_hour,sys_minute,sys_second;
sys_time = rt_tick_get(); /* 获取时钟节拍 */
sys_second = sys_time/1000;
sys_hour = sys_second / 3600; /* 开机运行时间 小时 */
sys_minute = sys_second % 3600 / 60; /* 开机运行时间 分 */
sys_second = sys_second % 60; /* 开机运行时间 秒 */
rt_kprintf("> 开机 %d 时 %d 分 %d 秒 \r\n",sys_hour,sys_minute,sys_second);
3. 获取时钟节拍(ST库函数)
HAL_GetTick();
应用:timestamp 时间戳
uint32_t timestamp = HAL_GetTick();
4. 计算 x 毫秒是多少时钟节拍 rt_tick_from_millisecond(timeout)
在用时钟节拍作为定时的场合下应用
rt_tick_from_millisecond(timeout) 这个函数把多少 ms 计算成系统对应的时钟节拍
如下应用案例
rt_tick_t start_time = 0;
start_time = rt_tick_get();
if (rt_tick_get() - start_time > rt_tick_from_millisecond(timeout))
{
....
}