为什么LED没有任何物理中断就会闪烁?

问题描述 投票:1回答:1

以下是LED0在UART0发生中断时由于从主机到从机的LIN传输而切换的中断处理程序,我的设备是从机。但是,如果没有将我的设备(从设备)连接到主设备,这意味着没有通过UART进行任何LIN传输,LED0就会切换。我无法理解,这怎么会自动发生?如何产生中断并切换掉LED0?

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 for LIN transmission */
            /* Reset counter */
            LED0_TOGGLE;
            LED_counter = 0;
        }
        LED_counter++;
    }
  }

在我的main函数中,我调用了我的计时器初始化,如下所示:

lin_application_timer_FTM0();

以上功能定义如下:

void lin_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);
}

任何人都可以解释为什么LED0没有任何中断切换?

embedded microcontroller
1个回答
0
投票

实际上可能触发了中断。您的中断引脚是否连接了上拉或下拉电阻?如果它断开并且只是“浮动”,环境中的电噪声可能会导致虚假中断。

© www.soinside.com 2019 - 2024. All rights reserved.