[技术讨论]

NUC029SGE 定时器设置问题

[复制链接]
1008|3
手机看帖
扫描二维码
随时随地手机跟帖
zzz5858662|  楼主 | 2021-9-10 11:15 | 显示全部楼层 |阅读模式
库文件提供的
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);
}
不知道为啥就是没有实现?

使用特权

评论回复

相关帖子

tyw| | 2021-9-26 12:46 | 显示全部楼层
NUC029LAN_2017-01-19.PDF (1.38 MB)

使用特权

评论回复
amychen1234| | 2021-9-26 13:52 | 显示全部楼层
我司有FAE技术支持,有需要可➕扣: 3001916457

使用特权

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

本版积分规则

6

主题

21

帖子

1

粉丝