打印
[技术问答]

NUC029TAN定时器捕获不成功

[复制链接]
1745|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
参考官方BSP里的Timer Capture这个例程,调试NUC029TAN定时器1的捕获功能,捕获输入信号用单片机自己产生的40KHz PWM,调了三四天了,一直不进捕获中断,捕获寄存器的值一直是0.
测试硬件IO T1(P3.5口)是好的,可以输出高低电平,就是不能捕获,急求大神解答啊。。。

附上调试代码:
1、时钟配置
void SysClockInit(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable Internal RC 22.1184MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

    /* Waiting for Internal RC clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

    /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

    /* Enable external XTAL 12MHz clock */
    //CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

    /* Waiting for external XTAL clock ready */
    //CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);
       
          /* Enable peripheral clock */
    CLK->APBCLK = CLK_APBCLK_UART1_EN_Msk |
                  CLK_APBCLK_TMR0_EN_Msk | CLK_APBCLK_TMR1_EN_Msk | CLK_APBCLK_TMR2_EN_Msk | CLK_APBCLK_TMR3_EN_Msk;

    /* Peripheral clock source */
    CLK->CLKSEL1 = CLK_CLKSEL1_UART_S_PLL |
                   CLK_CLKSEL1_TMR0_S_HXT | CLK_CLKSEL1_TMR1_S_HCLK | CLK_CLKSEL1_TMR1_S_HIRC | CLK_CLKSEL1_TMR3_S_HXT;

    /* Lock protected registers */
    SYS_LockReg();
}


2、GPIO配置
void GPIO_Init(void)
{
    SYS->P0_MFP =SYS_MFP_P01_RXD1 | SYS_MFP_P00_TXD1;
          /* Set P2 multi-function pins for PWMA Channel2 */
    SYS->P2_MFP = SYS_MFP_P22_PWM2 | SYS_MFP_P23_PWM3 | SYS_MFP_P24_PWM4;
       
    //GPIO_SetMode(P3, BIT2, GPIO_PMD_INPUT);
    //GPIO_SetMode(P0, BIT0, GPIO_PMD_OPEN_DRAIN);
    //P00 = 1;
    //ACMP0 ACMP1
    SYS->P1_MFP = SYS_MFP_P15_ACMP0_P;
    //SYS->P2_MFP = SYS_MFP_P26_ACMP1_O;
    SYS->P3_MFP = SYS_MFP_P31_ACMP1_P | SYS_MFP_P34_T0 | SYS_MFP_P35_T1;
       
    /* Disable digital input path of analog pin ACMP0_P to prevent leakage */
    GPIO_DISABLE_DIGITAL_PATH(P1, (1 << 5) << GPIO_OFFD_OFFD_Pos);
   /* Disable digital input path of analog pin ACMP0_P to prevent leakage */
    GPIO_DISABLE_DIGITAL_PATH(P3, (1 << 1) << GPIO_OFFD_OFFD_Pos);
       
   //KEY
   /*  Configure P3.2 as Quasi-bidirection mode and enable interrupt by falling edge trigger */
    GPIO_SetMode(P3, BIT2, GPIO_PMD_QUASI);
    GPIO_EnableInt(P3, 2, GPIO_INT_FALLING);
    NVIC_EnableIRQ(EINT0_IRQn);
}

3、定时器相关配置(主函数)
    /*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                           */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{
        volatile uint32_t u32InitCount;
       
        SysClockInit();
        GPIO_Init();
        UART1_Init(115200);                //NUC029 UART1
        //PWMA2_Init();
        //PWMA3_Init();
        PWM_DeadZone_Init();
        //PWMB_Init();
        AMCP01_Init();
       
    printf("\n\nCPU @ %d Hz\n", SystemCoreClock);
    printf("+---------------------------------------------------+\n");
    printf("|    Timer External Capture Function Sample Code    |\n");
    printf("+---------------------------------------------------+\n\n");

    printf("# Timer Settings:\n");
    printf("  Timer0: Clock source is 12 MHz; Toggle-output mode and frequency is 500 Hz.\n");
    printf("  Timer3: Clock source is 12 MHz; Toggle-output mode and frequency is 1 Hz.\n");
    printf("  Timer1: Clock source is HCLK(50 MHz); Continuous counting mode; TCMP is 0xFFFFFF;\n");
    printf("          Counter pin enable; Capture pin and capture interrupt enable;\n");
    printf("# Generate 500 Hz frequency from T0 and connect T0 pin to Timer1 counter pin.\n");
    printf("# Generate 1 Hz frequency from T3 and connect T3 pin to T1EX capture pin.\n");
    printf("# Get 500 event counts from Timer1 counter pin when each T1EX pin interrupt occurred.\n\n");

    /* Initial Timer0 and Timer3 default setting */
    TIMER_Open(TIMER0, TIMER_TOGGLE_MODE, 1000);
    TIMER_Open(TIMER3, TIMER_TOGGLE_MODE, 2);

    /* Initial Timer1 default setting */
    TIMER_Open(TIMER1, TIMER_CONTINUOUS_MODE, 1);

    /* Configure Timer1 setting for external counter input and capture function */
    TIMER_SET_PRESCALE_VALUE(TIMER1, 0);
    TIMER_SET_CMP_VALUE(TIMER1, 0xFFFFFF);
    TIMER_EnableEventCounter(TIMER1, TIMER_COUNTER_FALLING_EDGE);
    TIMER_EnableCapture(TIMER1, TIMER_CAPTURE_FREE_COUNTING_MODE, TIMER_CAPTURE_FALLING_EDGE);
    TIMER_EnableCaptureInt(TIMER1);

    /* Enable Timer1 NVIC */
    NVIC_EnableIRQ(TMR1_IRQn);

    /* Clear Timer1 interrupt counts to 0 */
    u32InitCount = g_au32TMRINTCount[1] = 0;

    /* Start Timer0, Timer1 and Timer3 counting */
    TIMER_Start(TIMER0);
    TIMER_Start(TIMER1);
    TIMER_Start(TIMER3);

    /* Check T1EX interrupt counts */
    while(g_au32TMRINTCount[1] <= 10)
    {
        if(g_au32TMRINTCount[1] != u32InitCount)
        {
            printf("[%2d] - %4d\n", g_au32TMRINTCount[1], TIMER_GetCaptureData(TIMER1));
            u32InitCount = g_au32TMRINTCount[1];
        }
    }

    /* Stop Timer0, Timer1 and Timer3 counting */
    TIMER_Close(TIMER0);
    TIMER_Close(TIMER1);
    TIMER_Close(TIMER3);

    printf("*** PASS ***\n");

    while(1);
}

4、定时器中断函数
/**
* @brief       Timer0 IRQ
*
* @param       None
*
* @return      None
*
* @Details     The Timer0 default IRQ, declared in startup_NUC029xAN.s.
*/
void TMR0_IRQHandler(void)
{
    /* Clear Timer0 time-out interrupt flag */
    TIMER_ClearIntFlag(TIMER0);

    g_au32TMRINTCount[0]++;
}

/**
* @brief       Timer1 IRQ
*
* @param       None
*
* @return      None
*
* @details     The Timer1 default IRQ, declared in startup_NUC029xAN.s.
*/
void TMR1_IRQHandler(void)
{
    if(TIMER_GetCaptureIntFlag(TIMER1) == 1)
    {
        /* Clear Timer1 capture interrupt flag */
        TIMER_ClearCaptureIntFlag(TIMER1);

        g_au32TMRINTCount[1]++;
    }
}

/**
* @brief       Timer2 IRQ
*
* @param       None
*
* @return      None
*
* @details     The Timer2 default IRQ, declared in startup_NUC029xAN.s.
*/
void TMR2_IRQHandler(void)
{
    /* Clear Timer2 time-out interrupt flag */
    TIMER_GetIntFlag(TIMER2);

    g_au32TMRINTCount[2]++;
}

/**
* @brief       Timer3 IRQ
*
* @param       None
*
* @return      None
*
* @details     The Timer3 default IRQ, declared in startup_NUC029xAN.s.
*/
void TMR3_IRQHandler(void)
{
    /* Clear Timer3 time-out interrupt flag */
    TIMER_GetIntFlag(TIMER3);

    g_au32TMRINTCount[3]++;
}



沙发
星星点灯69|  楼主 | 2018-4-4 17:20 | 只看该作者
附上芯片原理图

NUC029TAN.jpg (251.18 KB )

NUC029TAN.jpg

使用特权

评论回复
板凳
星星点灯69|  楼主 | 2018-4-8 10:45 | 只看该作者
有木有哪位大侠用过这款单片机的定时器捕获功能的,帮忙解答一下呀,不胜感激

使用特权

评论回复
地板
星星点灯69|  楼主 | 2018-4-8 15:25 | 只看该作者

使用特权

评论回复
5
huangcunxiake| | 2018-4-11 15:07 | 只看该作者
为何用自身的Pwm信号作为触发信号呢。

使用特权

评论回复
6
huangcunxiake| | 2018-4-11 15:08 | 只看该作者
好几天了,解决了吗

使用特权

评论回复
7
huangcunxiake| | 2018-4-11 15:08 | 只看该作者
不会是你用了自身的这个,然后配置乱了吧

使用特权

评论回复
8
星星点灯69|  楼主 | 2018-4-12 10:08 | 只看该作者
huangcunxiake 发表于 2018-4-11 15:07
为何用自身的Pwm信号作为触发信号呢。

公司的函数信号发生器太渣了,不好用,所以只能用自身产生的PWM做测试了。

使用特权

评论回复
9
星星点灯69|  楼主 | 2018-4-12 10:08 | 只看该作者
huangcunxiake 发表于 2018-4-11 15:08
好几天了,解决了吗

还没有呢

使用特权

评论回复
10
星星点灯69|  楼主 | 2018-4-12 10:12 | 只看该作者
huangcunxiake 发表于 2018-4-11 15:08
不会是你用了自身的这个,然后配置乱了吧

配置倒没乱,后来发现这款单片机的Timer1没有捕获引脚,改成Timer0捕获可以工作,但捕获寄存器的值一直是1,还在纠结中,,网上用的人太少了

使用特权

评论回复
11
小明的同学| | 2018-4-12 16:14 | 只看该作者
这个系列用的不多。都是用M051

使用特权

评论回复
12
星星点灯69|  楼主 | 2018-4-13 16:14 | 只看该作者
小明的同学 发表于 2018-4-12 16:14
这个系列用的不多。都是用M051

M051也在用,主要用串口做数据集中处理。这个系列集成有比较器,定时器、PWM资源都比较丰富

使用特权

评论回复
13
sxc621| | 2018-5-4 21:00 | 只看该作者
定时器配置中使用的是timer1的外部捕获引脚T1EX,但是你这款芯片上没有这个引脚,只有timer0的T0EX可以使用,所以要把timer0重新配置成捕获模式,用T0EX引脚去捕获PWM信号。

使用特权

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

本版积分规则

7

主题

51

帖子

0

粉丝