[技术问答] 关于M453的定时器库函数问题

[复制链接]
2391|18
 楼主| 阿甘童鞋 发表于 2016-1-7 13:35 | 显示全部楼层 |阅读模式
uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq),这个函数的第三个参数是表示什么,这个定时器的实际工作频率吗?但是定时器的时钟不是通过CLKSEL和APBCLK这个两个寄存器选择的?选择过后工作频率不就确定了吗?为什么那个函数还要自己设置定时器的工作频率呢?
598330983 发表于 2016-1-8 17:17 | 显示全部楼层
u32Freq     Target working frequency
不是实际工作频率,是设备工作频率。
598330983 发表于 2016-1-8 17:18 | 显示全部楼层
* @param[in]  u32Freq     Target working frequency
  *
  * @return     Real timer working frequency
  *
  * @Details    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.
  * @NOTE       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.
你去。c文件看更多说明。这个就是配置定时器,工作在指定的频率和模式下,然后返回频率,看看你配置的对不对。
yiyigirl2014 发表于 2016-1-8 21:12 | 显示全部楼层
那个是你想要设置的频率,但是实际频率不一定是这个,实际频率应该是返回的那个,通过判断是不是返回值等于传递值。
mintspring 发表于 2016-1-8 22:33 | 显示全部楼层
上面说的都挺对,就是通过那个参数设置频率,然后最后能不能设置成功就看返回值是对不对了。
小猫爱吃鱼 发表于 2016-1-10 15:59 | 显示全部楼层
是指设备的工作频率吧
 楼主| 阿甘童鞋 发表于 2016-1-12 17:11 | 显示全部楼层
调用了这个函数,它返回的频率值在哪里可以看啊
 楼主| 阿甘童鞋 发表于 2016-1-12 20:58 | 显示全部楼层
598330983 发表于 2016-1-8 17:18
* @param  u32Freq     Target working frequency
  *
  * @return     Real timer working frequency

你好,返回的频率在哪里看啊?
motor666 发表于 2016-1-12 21:57 | 显示全部楼层
这两天也正弄这个定时器,也是看不懂怎么能计算出分频系数和TIMERx_CMP的值,最后按我自己的方法计算出分频系数和比较寄存器的值直接填进去,特简单,以Timer1定时500毫秒为例:
         TIMER1->CTL = 0x28000003;     // 4分频
         TIMER1->CMP = 0x895440;       // 500mS  
         TIMER1->CTL |= 0x40000000;   // 开定时器
598330983 发表于 2016-1-16 20:50 | 显示全部楼层
阿甘童鞋 发表于 2016-1-12 20:58
你好,返回的频率在哪里看啊?

返回的频率就是返回值啊,你看这个函数的原型啊,不是void,这个函数本身执行后就是个返回值。。
huangcunxiake 发表于 2016-1-30 17:29 | 显示全部楼层
是设备工作频率
玛尼玛尼哄 发表于 2016-1-30 17:37 | 显示全部楼层
不是实际工作频率,是设备工作频率。
Mancherstun 发表于 2016-2-4 10:25 | 显示全部楼层
是设定timer的工作频率吧
734774645 发表于 2016-2-4 17:23 | 显示全部楼层

  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]      Open Timer in specified mode and frequency
  3.   *
  4.   * @param[in]  timer       The base address of Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3.
  5.   * @param[in]  u32Mode     Operation mode. Possible options are
  6.   *                         - \ref TIMER_ONESHOT_MODE
  7.   *                         - \ref TIMER_PERIODIC_MODE
  8.   *                         - \ref TIMER_TOGGLE_MODE
  9.   *                         - \ref TIMER_CONTINUOUS_MODE
  10.   * @param[in]  u32Freq     Target working frequency
  11.   *
  12.   * [url=home.php?mod=space&uid=266161]@return[/url]     Real Timer working frequency
  13.   *
  14.   * [url=home.php?mod=space&uid=1543424]@Details[/url]    This API is used to configure timer to operate in specified mode and frequency.
  15.   *             If timer cannot work in target frequency, a closest frequency will be chose and returned.
  16.   * [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
  17.   *             \ref TIMER_Start macro or program registers directly.
  18.   */
  19. uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq)
  20. {
  21.     uint32_t u32Clk = TIMER_GetModuleClock(timer);
  22.     uint32_t u32Cmpr = 0, u32Prescale = 0;

  23.     // Fastest possible timer working freq is (u32Clk / 2). While cmpr = 2, pre-scale = 0.
  24.     if(u32Freq > (u32Clk / 2))
  25.     {
  26.         u32Cmpr = 2;
  27.     }
  28.     else
  29.     {
  30.         if(u32Clk >= 0x4000000)
  31.         {
  32.             u32Prescale = 7;    // real prescaler value is 8
  33.             u32Clk >>= 3;
  34.         }
  35.         else if(u32Clk >= 0x2000000)
  36.         {
  37.             u32Prescale = 3;    // real prescaler value is 4
  38.             u32Clk >>= 2;
  39.         }
  40.         else if(u32Clk >= 0x1000000)
  41.         {
  42.             u32Prescale = 1;    // real prescaler value is 2
  43.             u32Clk >>= 1;
  44.         }

  45.         u32Cmpr = u32Clk / u32Freq;
  46.     }

  47.     timer->TCSR = u32Mode | u32Prescale;
  48.     timer->TCMPR = u32Cmpr;

  49.     return(u32Clk / (u32Cmpr * (u32Prescale + 1)));
  50. }



* @param[in] u32Freq Target working frequency
*
* @return Real Timer working frequency

好多人疑问的是这两个,也就是第三个参数和返回值,其实一个是目标值,一个是实时值,也就是你想设置的是什么,实际上设置后是什么
598330983 发表于 2016-2-5 11:44 | 显示全部楼层
该函数类型为uint32_t,返回实际工作的频率,你设置的是你想要的,而实际的可能跟你想要的不同。你就可以逐渐修正,直到返回值是你想要的。
奥德赛 发表于 2016-2-15 20:13 | 显示全部楼层
第三个参数表示的是设备的工作频率吧
dongnanxibei 发表于 2016-2-16 11:36 | 显示全部楼层
楼主 是C语言 新手  吗?返回值都不了解?
芙蓉洞 发表于 2016-2-17 20:28 | 显示全部楼层
M453也有库函数啊,和st的库函数类似吗
Micachl 发表于 2016-2-19 20:18 | 显示全部楼层
uint32_t u32Freq表示是设备的工作频率
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

35

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部