强大的STM32F4的定时器设定方法-附源码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32定时器比较多,使用起来也比较混乱。
windows下做过编程的人一定对SetTimer有印象,不过该定时器也不那么好用,因为id要自己维护,并且保证不跟程序中的其他id冲突。
手头上的项目要用到定时器,又不想每次都跑到寄存器里详细设定参数,所以就写了个类似SetTimer的定时器。
注:请在STM32F407上使用该定时器,其他内核需要修改,如M3内核是没有32位定时器的
使用方法:
u8 SetTimer(u32 unTime, u32 unCount, TIMERFUN pHandler,u32 ucPara)
使用SetTimer去向系统申请一个定时器,如果成功,返回定时器ID,失败返回0.为了使定时器ID更有意义,这里设定返回值为定时器编号
这里根据计时时间自动分配定时器。比如你需要一个比较长时间的定时,那么SetTimer会给你分配一个32位定时器(M4内核)
参数:
unTime:计时时间(ms,如需ns请自行修改或者使用delay)
unCount :计时器运行次数,0为无限运行,非零的话,运行unCount次后,该定时器关闭。
pHandler:定时器定时后执行的函数,该处如果不需要执行,可填0(什么都不需要做,干嘛要开启定时器?),当然这里可以自己定义函数指针类型(比如传2个参数或者变参:呃,变参太变态)
ucPara:函数参数
/*关闭定时器
tmrId:定时器ID
*/
void KillTimer(TIMER tmrId);
例如:
view sourceprint?
1 //每隔0.5s 反转4bit 灯
2 tmrIrb = SetTimer(500, 0, IndRvsBit, 4);
3 printf("IndRvsBit Timer Id: %d\r\n",tmrIrb);
4
5 if(0 != tmrIrb)
6 {
7 ucCnt = SetTimer(10 * 1000, 1, KillBlink, tmrIrb); //10s 后关闭位4反转
8 printf("KillBlink Timer Id: %d\r\n",ucCnt);
9 }
view sourceprint?
1
view sourceprint?
1
view sourceprint?
1
view sourceprint?
1
view sourceprint?
1
view sourceprint?
1
这里要提前定义好参数里的函数指针
view sourceprint?
01 void KillBlink(u8 ucOpt)
02 {
03 // RTC_ShutWakeUp();
04 KillTimer(ucOpt);
05 printf("KillBlink(%d)\r\n", ucOpt);
06 }
07
08 void AdPickTime(u8 ucOpt)
09 {
10 PushCmd(0xF2,0);
11 }
12
13 void IndRvsBit(u8 ucOpt)
14 {
15 SubBoardIndSingle(4, acCurInd[4] ^ (1 << ucOpt));
16 }
header:
view sourceprint?
01 #ifndef __TIMER_H
02 #define __TIMER_H
03 #include "board.h"
04 #include "zkekglobe.h"
0 5 /////////////////////////////////////////////////////////////////// ///////////////
6
0//All rights reserved
7
08 //////////////////////////////////////////////////////////////////////////////////
09
10
11
12 /*使能基本计时器
13 ucTimerIdx:计时器编号 范围:2~5 9~14
14 unCount 自动重装值。
15 uwPsc 计数器分频 2-65535 计时时间 = unCount * uwPsc / 84M(168M if ucTimerIdx in{9, 10, 11})
16 pHandler 计数完成后执行函数
17 ucPara 执行函数的参数
18
19
20 返回值:
21 0:成功
22 1:ucOpt unRunningFreqency unCount 参数错误
23 2:定时器编号参数错误
24 3:定时器已经被占用
25 4:16位定时器传入的计数参数超阈值*/
26 u8 TimerEnable(u8 ucTimerIdx, u32 unCount, u16 uwPsc,TIMERFUN pHandler,u8 ucPara);
27
28 /*
29 获取空闲计时器
30
31 unTime :要计时的时间
32
33 返回值:timerId or 0:failed
34 */
35 u8 GetAFreeTimer(u32 unTime);
36
37
38
39 /*设置定时器,最大计时2147483647ms(24.8天),最小1ms ,其中unTime 值