打印
[技术问答]

关于M453的定时器库函数问题

[复制链接]
2006|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 | 只看该作者
那个是你想要设置的频率,但是实际频率不一定是这个,实际频率应该是返回的那个,通过判断是不是返回值等于传递值。

使用特权

评论回复
5
mintspring| | 2016-1-8 22:33 | 只看该作者
上面说的都挺对,就是通过那个参数设置频率,然后最后能不能设置成功就看返回值是对不对了。

使用特权

评论回复
6
小猫爱吃鱼| | 2016-1-10 15:59 | 只看该作者
是指设备的工作频率吧

使用特权

评论回复
7
阿甘童鞋|  楼主 | 2016-1-12 17:11 | 只看该作者
调用了这个函数,它返回的频率值在哪里可以看啊

使用特权

评论回复
8
阿甘童鞋|  楼主 | 2016-1-12 20:58 | 只看该作者
598330983 发表于 2016-1-8 17:18
* @param  u32Freq     Target working frequency
  *
  * @return     Real timer working frequency

你好,返回的频率在哪里看啊?

使用特权

评论回复
9
motor666| | 2016-1-12 21:57 | 只看该作者
这两天也正弄这个定时器,也是看不懂怎么能计算出分频系数和TIMERx_CMP的值,最后按我自己的方法计算出分频系数和比较寄存器的值直接填进去,特简单,以Timer1定时500毫秒为例:
         TIMER1->CTL = 0x28000003;     // 4分频
         TIMER1->CMP = 0x895440;       // 500mS  
         TIMER1->CTL |= 0x40000000;   // 开定时器

使用特权

评论回复
10
598330983| | 2016-1-16 20:50 | 只看该作者
阿甘童鞋 发表于 2016-1-12 20:58
你好,返回的频率在哪里看啊?

返回的频率就是返回值啊,你看这个函数的原型啊,不是void,这个函数本身执行后就是个返回值。。

使用特权

评论回复
11
huangcunxiake| | 2016-1-30 17:29 | 只看该作者
是设备工作频率

使用特权

评论回复
12
玛尼玛尼哄| | 2016-1-30 17:37 | 只看该作者
不是实际工作频率,是设备工作频率。

使用特权

评论回复
13
Mancherstun| | 2016-2-4 10:25 | 只看该作者
是设定timer的工作频率吧

使用特权

评论回复
14
734774645| | 2016-2-4 17:23 | 只看该作者

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]      Open Timer in specified mode and frequency
  *
  * @param[in]  timer       The base address of 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)
{
    uint32_t u32Clk = TIMER_GetModuleClock(timer);
    uint32_t u32Cmpr = 0, u32Prescale = 0;

    // Fastest possible timer working freq is (u32Clk / 2). While cmpr = 2, pre-scale = 0.
    if(u32Freq > (u32Clk / 2))
    {
        u32Cmpr = 2;
    }
    else
    {
        if(u32Clk >= 0x4000000)
        {
            u32Prescale = 7;    // real prescaler value is 8
            u32Clk >>= 3;
        }
        else if(u32Clk >= 0x2000000)
        {
            u32Prescale = 3;    // real prescaler value is 4
            u32Clk >>= 2;
        }
        else if(u32Clk >= 0x1000000)
        {
            u32Prescale = 1;    // real prescaler value is 2
            u32Clk >>= 1;
        }

        u32Cmpr = u32Clk / u32Freq;
    }

    timer->TCSR = u32Mode | u32Prescale;
    timer->TCMPR = u32Cmpr;

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



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

好多人疑问的是这两个,也就是第三个参数和返回值,其实一个是目标值,一个是实时值,也就是你想设置的是什么,实际上设置后是什么

使用特权

评论回复
15
598330983| | 2016-2-5 11:44 | 只看该作者
该函数类型为uint32_t,返回实际工作的频率,你设置的是你想要的,而实际的可能跟你想要的不同。你就可以逐渐修正,直到返回值是你想要的。

使用特权

评论回复
16
奥德赛| | 2016-2-15 20:13 | 只看该作者
第三个参数表示的是设备的工作频率吧

使用特权

评论回复
17
dongnanxibei| | 2016-2-16 11:36 | 只看该作者
楼主 是C语言 新手  吗?返回值都不了解?

使用特权

评论回复
18
芙蓉洞| | 2016-2-17 20:28 | 只看该作者
M453也有库函数啊,和st的库函数类似吗

使用特权

评论回复
19
Micachl| | 2016-2-19 20:18 | 只看该作者
uint32_t u32Freq表示是设备的工作频率

使用特权

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

本版积分规则

15

主题

35

帖子

1

粉丝