打印
[牛人杂谈]

定时器初始化中的细节

[复制链接]
1229|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
598330983|  楼主 | 2018-11-30 22:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
定时器操作模式
定时器控制器提供4 种工作模式,单脉冲(one-shot)模式、周期(periodic)模式、开关(toggle)和连续计数(continuous counting)模式。

这里修改就可以选择不同的模式。
前两种模式很好理解的。看第三种
开关模式
如果定时器工作在开关模式且CEN(定时器使能位)置1,定时器计数器开始计数。一旦定时器计数器
的值与定时器比较寄存器TCMPR 的值匹配时,且IE(中断使能位)设置为1,则定时器中断标志置位,产生
中断信号并送到NVIC 通知CPU。表示定时器发生计数溢出。相应开关输出(tout) 信号置1。
在这种操作模式,一旦定时器计数器的值与定时器比较寄存器TCMPR 的值匹配, 定时器计数器的值
返回到计数初始值且CEN 保持为1 (持续使能计数)。定时器计数器重新开始计数。如果中断标志由软件
清除,一旦定时器计数器的值与定时器比较寄存器中TCMPR 的值匹配且IE (中断使能位) 置1,则定时
器中断标志置位,发生中断信号,并送到NVIC 再次通知CPU。相应开关输出(tout)信号置0。定时器计
数操作在CEN 设置为0 之后才停止。因此,开关输出(tout)信号以50%的占空比反复改变,所以这种
操作模式称为开关模式。
这样大家知道第三种的用处了吧?可以输出标准的方波啊。懂了吗

沙发
598330983|  楼主 | 2018-11-30 22:54 | 只看该作者
周期模式和连续模式的区别呢?先看连续模式
连续计数模式
如果定时器工作在连续计数模式且CEN (定时器使能位)置1,如果IE(中断使能位)设置为1, 当
TDR =TCMPR 时,相关的中断信号产生。用户可以立即改变TCMPR 的值,而不需要禁用或重启定时器计
数。例如,TCMPR 的值先被设置为80(TCMPR 的值应当小于224-1 并且大于1),当TDR 的值等于80
时,如果IE (中断使能位)设置为1,定时器产生中断,TIF(定时器中断标志)将被置位,产生中断信号
并送到NVIC 通知CPU,且CEN 保持为1 (持续使能计数),但是TDR 的值不会返回到零,而是继续计
数81,82,83,……to 224-1, 0, 1, 2, 3, …… to 224-1 。接下来,如果用户设置TCMPR 为
200,且TIF 被清零。当TDR 的值达到200,定时器中断发生,TIF 被置位,产生中断信号并送到NVIC
再次通知CPU。最后,用户设置TCMPR 为500,并再一次清零TIF,当TDR 的值达到500,定时器中断
发生,TIF 被置位,产生中断信号并送到NVIC 通知CPU。从应用的角度看,中断的产生取决于TCMPR。
在该模式下,定时器计数是连续的,所以这种操作模式被称为连续计数模式。
这说明连续模式是可以在运行中修改比较值的。

使用特权

评论回复
板凳
598330983|  楼主 | 2018-11-30 22:55 | 只看该作者
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]      Open Timer with Operate Mode and Frequency
  *
  * @param[in]  timer       The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3.
  * @param[in]  u32Mode     Operation mode. Possible options are
  *                         - \ref TIMER_ONESHOT_MODE
  *                         - \ref TIMER_PERIODIC_MODE
  *                         - \ref TIMER_TOGGLE_MODE
  *                         - \ref TIMER_CONTINUOUS_MODE
  * @param[in]  u32Freq     Target working frequency
  *
  * [url=home.php?mod=space&uid=266161]@return[/url]     Real timer working frequency
  *
  * [url=home.php?mod=space&uid=1543424]@Details[/url]    This API is used to configure timer to operate in specified mode and frequency.
  *             If timer cannot work in target frequency, a closest frequency will be chose and returned.
  * [url=home.php?mod=space&uid=536309]@NOTE[/url]       After calling this API, Timer is \b NOT running yet. But could start timer running be calling
  *             \ref TIMER_Start macro or program registers directly.
  */
uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq)

还有这三个参数的意义,第一个选择定时器,第二个模式,就是单次,周期,开关,连续。。。。
第三个是指前面配置的中期内触发几次,如果按照例子中默认的是定时1S,那么这里设置为1,就是1S触发一次,如果是2,那么一秒内平均触发两次,就是2Hz

使用特权

评论回复
地板
598330983|  楼主 | 2018-11-30 22:56 | 只看该作者
所以搞个1000,那么就是1mS一次了。

使用特权

评论回复
5
gaoyang9992006| | 2018-12-1 10:28 | 只看该作者
对,不懂的地方一定要看头文件对应的.c,因为函数本体在.c里面实现,会在这里提供参数和功能说明。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

227

主题

5279

帖子

22

粉丝