强大的STM32F4的定时器设定方法-附源码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 值

相关文档
最新文档