[STM32定时器学习-001]TimeBase

/ 0评 / 2

平台:STM32F072-DISCO
一直在用SysTick做TimeBase,用FreeRTOS的定时器做定时,现在也该研究一下定时器方式定时了.
定时器方法定时,有向上向下等等计算模式.和SysTick一样,有一个Reload值.
设置好Reload后,就开始计时了.首先TIM1的时钟来源于APB1时钟.关系还满足TIM1CLK = PCLK1(APB1 CLK) = HCLK (系统主频).所以TIM1CLK取决于APB1分频器,系统主频一般相对稳定.
其中Reload寄存器最大是65535,也就是最低定时中断频率是732.5kHz,以前用51时候进行一分钟定时,通常是进入中断加标志直到标志时间够了.但是其实STM32定时器有PSC功能,通常就不用那么麻烦.

如上图,PSC的位置在输入时钟到下面的比较寄存器之前.如果PSC=1,那么两个输入跳变,才会产生一个真正系统时钟.

比如现在要得到1Hz的中断,那么不用PSC是做不到的,PSC小,就时间精度高,PSC大,就定时时间长了.比如PSC = 0时候,精度是20+(5/6)纳秒.但是732.5kHz是极限.但是我们要得到1Hz的话,可以先分出10kHz的基础频率,再进行定时.但是精度却只有0.1ms,差距很多倍.如何找出时间平衡点,就看个人了.

    LL_TIM_SetCounterMode(TIM1, LL_TIM_COUNTERMODE_UP);
    /*
      In this example TIM1 input clock (TIM2CLK)  is set to APB1 clock (PCLK1),
      since APB1 prescaler is equal to 1.
        TIM1CLK = PCLK1
        PCLK1 = HCLK
        => TIM1CLK = HCLK = SystemCoreClock
      To get TIM1 counter clock at 10 KHz, the Prescaler is computed as following:
      Prescaler = (TIM1CLK / TIM1 counter clock) - 1
      Prescaler = (SystemCoreClock /10 KHz) - 1
    */
    LL_TIM_SetPrescaler(TIM1, __LL_TIM_CALC_PSC(SystemCoreClock, 10000));
    /* Set the auto-reload value to have an initial update event frequency of 10 Hz */
    InitialAutoreload = __LL_TIM_CALC_ARR(SystemCoreClock, LL_TIM_GetPrescaler(TIM1), 1);
    LL_TIM_SetAutoReload(TIM1, InitialAutoreload);

允许中断.然后开机LED翻转功能,测试一下就知道,这是向上计数,加上分频.

    LL_TIM_EnableIT_UPDATE(TIM1);
    NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0);
    NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
    LL_TIM_EnableCounter(TIM1);

其中定时器还有向上向下各种计数方式,本质上做TimeBase的话,向上向下没什么区别的.比如ARR是5,向上就是0...1...2...3...4...5,而向下就是5...4...3...2...1...0,时间是一样的,这应该是用来翻转PWM波形的,比如遇到1就跳变波形这种,这样向上向下才有区别,当然这是我猜测.中心对齐也是给PWM用的.具体到时候看.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注