技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152
这里定时器就是倒数,倒数完以后,执行一个回调函数
然后这里有时间分辨率的概念
比如这里我们定义了这个定时器从10开始,那么时钟频率是100ms,那么这里的100就好像是步长,
那么10*100 这里就是 1s=1000ms
这里默认设置为100hz,就是10ms
这里还要注意,这个时钟节拍如果是5的话,那么时钟分辨率一定要设置是
5的整数倍.
去代码看看这个宏:
要使用软件定时器,还需要
把这个宏设置为1,进行使能.
一些注意的
代码在下面这个文件中.
可以看到这些函数都有对应的参数,说明和错误说明.
然后先看创建定时器:
先去看这个OSTmrCreate()
的第一个参数OS_TMR,进去看看
这个是定时器的一些参数.
接下来注意,使用定时器的时候
首先定义一下
然后 ,创建的时候,作为参数传入.
然后再去看看:
这里CPU_CHAR 这个是定时器的名称.
然后OS_TICK DLY这是第一次延时的时候需要花的时间
然后PERIOD这个,以后每次这个时间分辨率,也就是以后每次所需要的时间.
倒计数一次需要的时间.
然后再看这个OS_OPT这个选项.
这个选项有两个
OS_OPT_TMR_ONE_SHOT是 单次定时器.
OS_OPT_TMR_PERIODIC这个是周期定时器.
这个OS_TMR_CALLBACK_PTR这个是回调函数.
这里,这个p_callback_arg是回调函数的参数,然后
p_err这个是 OS_ERR这个是 错误信息
然后就是这个开启定时器的函数,这个p_tmr这个是
开启定时器,然后
p_err这个是错误码
然后这个是停止定时器的函数.
第一个参数是定时器
第二个是选项.
可以看看上面,这个选项有三个参数
第一个 OS_OPT_TMR_NONE 这个是 也就是停止定时器的时候,什么都不做
然后第二个:
OS_OPT_TMR_CALLBACK 这个就是去调用回调函数,
也就是比如正常情况下,我们从100倒计时到0的时候,才会去回调函数,但是,比如我们
定时器执行到50的时候,我们就调用这个方法,强制进行停止定时器了,那么这个时候
如果这里我们选项设置了,OS_OPT_TMR_CALLBACK 虽然没有定时到0,他也会去
调用一次回调函数.
然后这里,p_callback_arg是调用这个回调函数的时候,同时传入一个参数.
这个一般很少用.
然后
最后一个是错误码
咱们说可以通过这里OS_OPT设置,定时器的定时模式
这里如果设置为单次定时器的话.
可以看到从OSTmrCreate()开始创建,定时器,然后直到OSTmrStart(),
这函数调用的时候,就开始,进行定时倒数dly个节拍数,然后
一直到定时结束的时候,调用回调函数
这样就执行一次就完了.
虽然单次定时器,这里
调用回调函数的时候只调用一次就结束了,但是咱们可以多次调用这个单次定时器,这样就可以实现
多次调用回调函数.
然后:
周期定时器,其实可以这样,
就是说,当OSTmrCreate(),这个函数调用,创建定时器,然后
OSTmrStart调用的时候,开始倒计数,这里不用倒计数到0,再去调用回调函数,这里
可以让他倒计数到某个值以后,就可以去调用回调函数.
这样可以周期的执行多次回调函数.
再去看看周期模式定时器:
周期模式有两种定时器,第一种,就是没有初始延迟的.
也就是dly是0,这个时候,每个周期是period,都是倒数到0,去回调函数,不停的这样执行.
这里看一下代码,
这里要知道OS_TICK DLY这个是,设置的第一个周期,倒数的时钟节拍数
OS_TICK period这个是,第二个周期以及以后倒数用到的时钟节拍数
如果这里第一次dly,这个周期设置为0,那么这个就是无初始延迟周期定时器,那么
每一次都会倒数period个时钟节拍,然后调用回调函数.
如果有初始延迟的话,就是第一个dly参数设置比如100,第二个period设置50
那么第一次倒数100到0 的时候会调用回调函数
然后从第二次开始从50倒数到0的时候,会调用回调函数.
知道了这些基础知识以后来做个试验:
首先把OS_CFG_TMR_EN设置为1,使能开启定时器.
然后这里
再去定义两个任务.
然后再去定义两个定时器,那么
再去定义两个定时器的回调函数,然后可以看到
p_tmr,p_arg这两个参数,一个是定时器,一个是回调函数的参数.
然后再去看main.c这个main函数,可以看到
做一些初始化,然后用LCD去画
一个屏幕,上面两个框,用LCD画的,
左边的用定时器1来控制,右边的用定时器2来控制.
然后下面再去创建这开始任务,start_task
然后去看看这开始任务
首先这任务创建了两个定时器,
可以看到定时器1是周期模式,然后dly是20,period是100,也就是第一次倒数20就调用回调函数,
第二次倒数100再去调用回调函数
第二个定时器可以看到,dly是200,这里period是0,这个是个单次定时器,
倒数200以后,执行回调函数,然后就完了.
然后定义了任务一,这个时候
去task1_task去看看
然后看看,定时器的回调函数
可以看到定时器1,不停的显示执行的次数,然后同时,变换颜色
然后定时器2,只执行一次,也是显示次数和填充颜色.
下载到开发版去看看
刚启动是嘿嘿,画了两个区域定时器1,定时器2.
然后
按下WKUP的时候,打开定时器以,可以看到左侧的定时器1开始有颜色变化
然后按下key0的时候,在任务1里开启了定时器2
然后可以看到,定时器2控制的区域也亮了.
可以看到,定时器2运行一次就不运行了.如果想要运行,需要按多次,然后
按下key1,就都停止了
然后再去看一下串口.
可以看到效果.