打印
[技术问答]

NUC029SGE 定时器设置问题

[复制链接]
2360|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
库文件提供的
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 > 64000000)
        {
            u32Prescale = 7;    // real prescaler value is 8
            u32Clk >>= 3;
        }
        else if(u32Clk > 32000000)
        {
            u32Prescale = 3;    // real prescaler value is 4
            u32Clk >>= 2;
        }
        else if(u32Clk > 16000000)
        {
            u32Prescale = 1;    // real prescaler value is 2
            u32Clk >>= 1;
        }

        u32Cmpr = u32Clk / u32Freq;
    }

    timer->CTL = u32Mode | u32Prescale;
    timer->CMP = u32Cmpr;

    return(u32Clk / (u32Cmpr * (u32Prescale + 1)));
}
这个函数的u32Freq参数官方解释为目标工作频率。这个是如何定义的。比如我目标工作频率72M,是不是这样设置:TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 72000000);
我的本意是想设置一个2.5ms的定时中断。但好像不行。我的设置如下:
void IMR0_Init(void)
{
        //Timer0选择HXT做时钟源,并且不除频
        CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT,0);
        //使能Timer0的时钟
        CLK_EnableModuleClock(TMR0_MODULE);
        //初始化Timer0,周期模式,每秒发生一次中断
        TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 72000000);
        TIMER_SET_CMP_VALUE(TIMER0, 180000);//修改比较寄存器的值 180000-2.5ms prescale/72*cmp = 25000(us)
        TIMER_SET_PRESCALE_VALUE(TIMER0, 0x0);//修改预分频的值
        //使能中断
        TIMER_EnableInt(TIMER0);
        NVIC_EnableIRQ(TMR0_IRQn);
        //启动Timer0
        TIMER_Start(TIMER0);
}
不知道为啥就是没有实现?

使用特权

评论回复
沙发
chenqianqian| | 2021-9-10 18:12 | 只看该作者
看下官方例程吧

使用特权

评论回复
板凳
xinpian101| | 2021-9-12 17:44 | 只看该作者
这个头文件的说明是怎么解释的

使用特权

评论回复
地板
jasontu| | 2021-9-13 08:22 | 只看该作者
NUC029xGE_BSP/SampleCode/StdDriver/TIMER_PeriodicINT
CLK_EnableModuleClock(TMR0_MODULE);
CLK_SetModuleClock(TMR0_MODULE,  CLK_CLKSEL1_TMR0SEL_PCLK0, 0);
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 400); =>1/400=0.0025 sec
TIMER_EnableInt(TIMER0);
NVIC_EnableIRQ(TMR0_IRQn);
TIMER_Start(TIMER0);

使用特权

评论回复
5
kiwis66| | 2021-9-13 09:55 | 只看该作者
不知道新唐的是不是通用的

上面的是471

使用特权

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

本版积分规则

6

主题

21

帖子

1

粉丝