首页 > 其他分享 >Freertos学习09-软件定时器

Freertos学习09-软件定时器

时间:2023-07-20 10:56:23浏览次数:43  
标签:定时器 函数 Freertos void 09 TimerHandle xtimer1 xTimer

一、概述

软件定时器是一种在单片机上实现定时功能的方法,可以用于周期性地执行任务或者延时执行任务。软件定时器由FreeRTOS内核实现,不需要硬件支持。软件定时器只有在软件定时器回调函数被调用时才需要占用CPU时间。
  本节主要设计以下内容:

  • 软件定时器的API介绍
  • 实例测试

二、软件定时器API

  1. 创建一个软件定时器
TimerHandle_t xTimerCreate(const char *pcTimerName, 
			   TickType_t xTimerPeriod, 
			   UBaseType_t uxAutoReload, 
			   void *pvTimerID, 
			   TimerCallbackFunction_t pxCallbackFunction);
参数 说明
pcTimerName 定时器的名称
xTimerPeriod 定时器的周期,以FreeRTOS的时钟节拍为单位。定时器将在每个周期结束时触发回调函数。
uxAutoReload 设置定时器是否自动重载
pvTimerID 用户自定义的定时器ID
pxCallbackFunction 定时器到期时要执行的回调函数
返回值 NULL,软件定时器无法创建;其他值,定时器句柄
//创建定时器xtimer1
xtimer1 =  xTimerCreate("xtimer1",100,pdTRUE,( void * ) 0,vTimerCallback);
  1. 启动定时器:
BaseType_t xTimerStart(TimerHandle_t xTimer, TickType_t xTicksToWait);

  其中,xTimer是要启动的定时器句柄,xTicksToWait是启动定时器前要等待的时钟节拍数。
 
3. 定时器回调函数:

void vTimerCallback(TimerHandle_t xTimer);

  在定时器到期时,会调用注册的回调函数。该函数传入定时器的句柄。
4. 停止定时器:

BaseType_t xTimerStop(TimerHandle_t xTimer, TickType_t xTicksToWait);

其中,xTimer是要停止的定时器句柄,xTicksToWait是停止定时器前要等待的时钟节拍数。
5. 重启定时器

BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );

该个函数用于重置一个软件定时器。当调用xTimerReset函数时,定时器将被重置为其初始状态,并重新开始计时。示例用法如下:

// 创建一个定时器
TimerHandle_t xTimer = xTimerCreate("MyTimer", pdMS_TO_TICKS(1000), pdTRUE, NULL, vTimerCallback);

// 启动定时器
xTimerStart(xTimer, 0);

// 重置定时器
xTimerReset(xTimer, 0);

在上面的示例中,我们首先使用xTimerCreate函数创建了一个名为"MyTimer"的定时器,定时器的周期为1000毫秒,并指定了一个回调函数vTimerCallback。然后,我们使用xTimerStart函数启动定时器。最后,我们使用xTimerReset函数重置定时器。

请注意,xTimerReset函数的第二个参数是一个延迟时间,用于指定何时重置定时器。如果将延迟时间设置为0,则定时器将立即重置。如果将延迟时间设置为正值,则定时器将在指定的延迟时间后重置。

三、代码实例

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/timers.h"

void vTimerCallback(TimerHandle_t xtimer1)
{
    printf("xtimer task test!\r\n");

}

TimerHandle_t xtimer1;
void app_main(void)
{
    //创建定时器xtimer1
    xtimer1 =  xTimerCreate("xtimer1",100,pdTRUE,( void * ) 0,vTimerCallback);
    xTimerStart(xtimer1, 0);//启动定时器
}

标签:定时器,函数,Freertos,void,09,TimerHandle,xtimer1,xTimer
From: https://www.cnblogs.com/seekwhale13/p/17538118.html

相关文章

  • 51单片机-利用定时器控制LED灯轮闪
    #include"reg52.h"//#include"delay.h"#include"intrins.h"#include<stdio.h>typedefunsignedintu16;typedefunsignedcharu8;typedefunsignedintuint;typedefunsignedcharuchar;#defineLED_PORTP2#defineSM......
  • 20090408_每年放生750次 嚴重威脅生態環境(報導)
    根據台灣動物社會研究會的調查,台灣每年宗教放生活動高達750次,平均每天2.1次。調查統計,被放生的動物中有不少是外來物種,嚴重威脅生態環境。台灣動物社會研究會今天召開記者會,公布2009年「台灣放生現象調查」結果指出,經常被放生動物的地點不乏熱門景點,像是淡水漁人碼頭、日月潭、旗......
  • 7.19-分摸 一枪2模(09案例分析)包括 分模-做虎口-做摸胚
      ......
  • android transaction failed 29201/-1, size 0-0 line 3009
    解决"androidtransactionfailed29201/-1,size0-0line3009"错误引言在Android开发中,我们经常会遇到各种错误和异常。其中一个常见的错误是"androidtransactionfailed29201/-1,size0-0line3009"。这个错误通常与Fragment事务相关,并且可能会导致应用崩溃或功能异常......
  • STM32定时器PWM
    个人估计理解这个图片就差不多明白PWM了。用定时器的加减也一样使用PWM的时候要看PWM的相关IO引脚。CH1-CH4对应OC配置的OC1-OC4频率计算可以看前面的定时器文章。PWM配置过程:1:初始化相关的PWM引脚2:初始化配置定时器   TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseInitStruct);3:配置O......
  • 109.C++类内初始化
    109.C++类内初始化C++11规定,可以为数据成员提供一个类内初始值。创建对象时,类内初始值用于初始化数据成员。像下面这样,cursor和height的类内初始值均为0。classScreen{private: intcursor=0; intheight=0;};1.不能用圆括号给类内初始值的原因C++primer(第5版)中......
  • 20090325_福報跟業是互不相抵但是會有影響
    假設:你被他人騙錢,被騙感情了...你討厭騙你感情的人,你難過自己被欺騙、你恨死他了,這一切都是他的錯,為什麼你是好人,你都有做好事情,還會有這樣的下場呢?因為你有沒有學會判斷呢?下輩子你與他在次相遇,而不見淂是他還你喔。..何解?因為"本性難改"你又沒有分辨什麼是真什麼是假了,你......
  • [SDOI2009] Bill的挑战
    [SDOI2009]Bill的挑战目录题目描述题意概括思路历程1.设计转移2.有没有发现少了个\(K\)代码实现题目描述Sheng_bill不仅有惊人的心算能力,还可以轻松地完成各种统计。在昨天的比赛中,你凭借优秀的程序与他打成了平局,这导致Sheng_bill极度的不满。于是他再次挑战你。这次你可......
  • 题解 P6091 【模板】原根
    题解太高深,自己整理一份。阶的定义:若\(\gcd(a,m)=1\),则使\(a^l\equiv1\pmod{m}\)的最小的\(l\)称为\(a\)关于模\(m\)的阶,记为\(\operatorname{ord}_ma\)。阶的性质:根据欧拉定理,\(a^{\varphi(m)}\equiv1\pmod{m}\),所以\(\operatorname{ord}_ma\mid\varphi(m)\)......
  • P7809 [JRKSJ R2] 01 序列 题解
    前言传送门blog思路Problem1问题一问的是最长不下降子序列的长度,在一个$01$串中的最长不下降子序列,总共有三种$000\dots$,$000\dots111\dots$和$111111\dots$。可以把找到以上三种最长不下降子序列问题变为:$$\max^r_{i=l}(\sum_{j=l}^i[a_j=0])+(\sum_{j=i+1}^......