0

我正在使用 NXP 的 Kinetis KEA64 微控制器。

时钟的实际频率为 20MHz,每 2.5ms 产生一次定时器中断。我有一个中断处理程序,可以在生成此定时器中断时切换 LED。LED 在此定时器中断上切换,但我不确切知道 LED 的频率。我的 LED 是否以 5kHz 切换?这是对的吗?

void interrupt_application_timer_FTM0()
{
    SIM_SCGC |= SIM_SCGC_FTM0_MASK; /* Enable Clock for FTM0 */         
    FTM0_SC |= FTM_SC_PS(7);    /* Select Preescaler in this case 128. 20 Mhz /128 =156.25 Khz. */ 
                                    /* Counter increase by one every 6.4 us */      
        /* Enable Channle 0*/
    FTM0_C0SC |= FTM_CnSC_CHIE_MASK; /* Enable channel 0 interrupt */
    FTM0_C0SC |= FTM_CnSC_MSA_MASK;  /* Channel as Output compare mode */           
        /*Select interrupt frequency*/
    FTM0_C0V = FTM_CnV_VAL(391) ;       /* Interrupt every 2.5ms */ 

    FTM0_SC |= FTM_SC_CLKS(1); /*FTM0 use system clock*/

        /* Set the ICPR and ISER registers accordingly */
    NVIC_ICPR |= 1 << ((INT_FTM0-16)%32);
    NVIC_ISER |= 1 << ((INT_FTM0-16)%32);
}

这是我的中断处理程序

void FTM0_IRQHandler()
  {     
    if (1==((FTM0_C0SC & FTM_CnSC_CHF_MASK)>>FTM_CnSC_CHF_SHIFT) )  /* If the CHF of the channel is equal to 0 */
    {
        (void)FTM0_C0SC;                            /* Read to clear flag */
        FTM0_C0SC ^= FTM_CnSC_CHF_MASK;             /* Clear flag */
        FTM0_C0V = FTM0_C0V + 391 ; /* Refresh interrupt period */

        if (LED_counter>=50){
            /* Toggle LED */
            /* Reset counter */
            LED0_TOGGLE;
            LED_counter = 0;
        }
        LED_counter++;
    }
  }
4

1 回答 1

1
  1. 频率测量使用范围
  2. 在 MCU 中,您可以将总线时钟启用到一个引脚 (Busclockout),启用它并检查总线时钟,以便您可以确认您的计算
  3. 然后在 LED 上使用示波器来确认您的频率
于 2018-07-01T00:22:06.697 回答