RT-thread(3)RT-Thread的定时器 简单例程(基于HAL库,在keil中使用程序框架)

1)配置 rtconfig.h

复制代码
/* rtconfig.h */

// <e>Software timers Configuration
// <i> Enables user timers
#define RT_USING_TIMER_SOFT         0
#if RT_USING_TIMER_SOFT == 0
    #undef RT_USING_TIMER_SOFT
#endif
// <o>The priority level of timer thread <0-31>
//  <i>Default: 4
#define RT_TIMER_THREAD_PRIO        4
// <o>The stack size of timer thread <0-8192>
//  <i>Default: 512
#define RT_TIMER_THREAD_STACK_SIZE  512
复制代码

2)在main.c中编写代码

复制代码
/*main.c*/

/* USER CODE BEGIN PD */
      /* 定义线软件定时器制块 */
        static rt_timer_t swtmr1 = RT_NULL;
        static rt_timer_t swtmr2 = RT_NULL;
      /* 其他变量 */        
        static uint32_t TmrCb_Count1 = 0;
    static uint32_t TmrCb_Count2 = 0;
/* USER CODE END PD */


/* USER CODE BEGIN PFP */

  /* RT-Thread 线程入口函数声明 */
    static void task1_thread_entry(void* parameter);
    static void task2_thread_entry(void* parameter);
  /* RT-Thread 超时函数(定时器回调函数)声明 */
    static void swtmr1_callback(void* parameter);
    static void swtmr2_callback(void* parameter);

/* USER CODE END PFP */

  /* USER CODE BEGIN 2 */
        /* 创建一个软件定时器 */
        swtmr1 = rt_timer_create("swtmr1_callback", /* 软件定时器的名称 */
                                                            swtmr1_callback,/* 软件定时器的超时函数 */
                                                            0, /* 定时器超时函数的入口参数 */
                                                            5000, /* 软件定时器的超时时间 (周期超时时间) */
                                  RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER);/* 软件定时器模式 一次模式 */
        /* 启动定时器 */
        if (swtmr1 != RT_NULL)
           rt_timer_start(swtmr1);    
        
        /* 创建一个软件定时器 */
        swtmr2 = rt_timer_create("swtmr2_callback", /* 软件定时器的名称 */
                                                            swtmr2_callback,/* 软件定时器的超时函数 */
                                                            0, /* 定时器超时函数的入口参数 */
                                                            5000, /* 软件定时器的超时时间 (周期超时时间) */
                                  RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);/* 软件定时器模式 周期模式 */
        /* 启动定时器 */
        if (swtmr2 != RT_NULL)
           rt_timer_start(swtmr2);    
。。。
 /* USER CODE END 2 */



/* USER CODE BEGIN 4 */
static void swtmr1_callback(void* parameter)
{
    uint32_t tick_num1;
    TmrCb_Count1++; /* 每调用一次加一 */

    tick_num1 = (uint32_t)rt_tick_get(); /* 获取滴答定时器的计数值 */

    rt_kprintf("swtmr1_callback 函数执行 %d 次\n", TmrCb_Count1);
    rt_kprintf("滴答定时器数值 =%d\n", tick_num1);
}
static void swtmr2_callback(void* parameter)
{
    uint32_t tick_num2;
    TmrCb_Count2++; /* 每调用一次加一 */

    tick_num2 = (uint32_t)rt_tick_get(); /* 获取滴答定时器的计数值 */

    rt_kprintf("swtmr2_callback 函数执行 %d 次\n", TmrCb_Count2);
    rt_kprintf("滴答定时器数值 =%d\n", tick_num2);
}
    }
}

/* USER CODE END 4 */
复制代码
复制代码
/*main.c*/

/* USER CODE BEGIN PD */
      /* 定义线软件定时器制块 */
        static rt_timer_t swtmr1 = RT_NULL;
        static rt_timer_t swtmr2 = RT_NULL;
      /* 其他变量 */        
        static uint32_t TmrCb_Count1 = 0;
        static uint32_t TmrCb_Count2 = 0;
/* USER CODE END PD */


/* USER CODE BEGIN PFP */
/* RT-Thread 超时函数(定时器回调函数)声明 */
    static void swtmr1_callback(void* parameter);
    static void swtmr2_callback(void* parameter);
/* USER CODE END PFP */

  /* USER CODE BEGIN 2 */
        /* 创建一个软件定时器 */
        swtmr1 = rt_timer_create("swtmr1_callback", /* 软件定时器的名称 */
                                  swtmr1_callback,/* 软件定时器的超时函数 */
                                  0, /* 定时器超时函数的入口参数 */
                                  5000, /* 软件定时器的超时时间 (周期超时时间) */
                                  RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER);/* 软件定时器模式 一次模式 */
        /* 启动定时器 */
        if (swtmr1 != RT_NULL)
           rt_timer_start(swtmr1);    
        
        /* 创建一个软件定时器 */
        swtmr2 = rt_timer_create("swtmr2_callback", /* 软件定时器的名称 */
                                  swtmr2_callback,/* 软件定时器的超时函数 */
                                  0, /* 定时器超时函数的入口参数 */
                                  5000, /* 软件定时器的超时时间 (周期超时时间) */
                                  RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);/* 软件定时器模式 周期模式 */
        /* 启动定时器 */
        if (swtmr2 != RT_NULL)
           rt_timer_start(swtmr2);    
。。。
 /* USER CODE END 2 */



/* USER CODE BEGIN 4 */
static void swtmr1_callback(void* parameter)
{
    uint32_t tick_num1;
    TmrCb_Count1++; /* 每调用一次加一 */

    tick_num1 = (uint32_t)rt_tick_get(); /* 获取滴答定时器的计数值 */

    rt_kprintf("swtmr1_callback 函数执行 %d 次\n", TmrCb_Count1);
    rt_kprintf("滴答定时器数值 =%d\n", tick_num1);
}
static void swtmr2_callback(void* parameter)
{
    uint32_t tick_num2;
    TmrCb_Count2++; /* 每调用一次加一 */

    tick_num2 = (uint32_t)rt_tick_get(); /* 获取滴答定时器的计数值 */

    rt_kprintf("swtmr2_callback 函数执行 %d 次\n", TmrCb_Count2);
    rt_kprintf("滴答定时器数值 =%d\n", tick_num2);
}
。。。

/* USER CODE END 4 */
复制代码

 

posted @   辛河  阅读(365)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示