嵌入式学习小组
直播中

余温重顾

9年用户 866经验值
擅长:可编程逻辑 嵌入式技术 EMC/EMI设计
私信 关注

M261芯片如何用timer capture外部脉冲的个数?

M261芯片如何用timer capture外部脉冲的个数?
用timer1,PB14,代码如下,是没有捕获到脉冲。请问是什么原因?

回帖(1)

丁冬芹

2024-1-17 17:14:42
以下是使用Timer1和PB14捕获外部脉冲个数的代码:

```
#include "stdio.h"
#include "NUC126.h"

#define TIMER_CLOCK_FREQ 48000000
#define PRESCALE         3 // Prescale value for Timer1
#define EVENT_CNT        4 // Select the event as the counter source

#define TIMER1_IRQn      TMR1_IRQn

volatile uint32_t g_u32Count = 0;

void TMR1_IRQHandler(void)
{
    // Clear the interrupt flag
    TIMER1->INTSTS = TIMER_INTSTS_TIF_Msk;
   
    // Get the captured value
    uint32_t u32CapVal = TIMER_GetCaptureData(TIMER1, 0);
   
    // Increment the count
    g_u32Count++;
}

int main()
{
    // Enable peripheral clock
    CLK_EnableModuleClock(TMR1_MODULE);
    CLK_EnableModuleClock(GPB_MODULE);
   
    // Set PB.14 as input mode
    PB->MODE &= ~GPIO_MODE_MODE14_Msk;
   
    // Enable PB.14 digital input path
    PB->DINOFF &= ~(BIT14 << GPIO_DINOFF_DINOFF_Pos);
   
    // Set PB.14 as TIMER1 counter pin
    SYS->GPB_MFPH |= SYS_GPB_MFPH_PB14MFP_TM1_EXT;
   
    // Configure Timer1
    TIMER_Open(TIMER1, TIMER_CONTINUOUS_MODE, PRESCALE);
    TIMER_SET_CMP_VALUE(TIMER1, 0xFFFFFF); // Set comparator value to the maximum
    TIMER_SET_CAPTURE_CONCRETE_EVENT(TIMER1, 0, TIMER_CAPTURE_EDGE, EVENT_CNT); // Set capture concrete event
   
    // Enable timer capture interrupt
    TIMER_EnableCaptureInt(TIMER1, 0);
    NVIC_EnableIRQ(TIMER1_IRQn);
   
    // Start Timer1
    TIMER_Start(TIMER1);
   
    while(1)
    {
        printf("Count: %dn", g_u32Count);
    }
}
```

在此代码中,我们使用TIMER1和PB14来捕获外部脉冲的个数。首先,我们将PB14设置为输入模式,并将其配置为TIMER1的计数器引脚。然后,我们配置TIMER1为连续模式,并将预分频值设置为3(即时钟频率除以4)。我们还设置用于捕获外部事件的计数器事件,并启用TIMER1的捕获中断。在中断处理程序中,我们获取捕获值并将计数器值增加1。最后,在主循环中,我们输出计数器值并持续监测外部事件。

如果代码运行时没有捕获到脉冲,请检查以下几个方面:

1. 确保输入脉冲的频率不超过TIMER1的最大计数速率。如果脉冲超过了计数速率,则需要将预分频值调整为一个更小的值,以便TIMER1可以处理更高的计数速率。

2. 确保输入脉冲的电平符合TIMER1的输入极性。例如,如果TIM1_EXT是上升沿触发,则输入脉冲应该是上升沿触发的。

3. 确保TIMER1的捕获中断已启用,并且中断处理程序能够正确地获取捕获值并更新计数器变量。

4. 如果仍无法捕获脉冲,请仔细检查电路,并确保输入脉冲已正确连接到PB14。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分