6626快速脉冲计数范例(Timer 定时器)

wen sir · 28次点击 · 2天前

如有些信号,频率很高,要精确地实现脉冲计数,一般不能使用GPIO中断模式来实现。可以使用定时器的外部触模式来,来实现此功能。

image.png


1- 用逻辑分析仪生产一个10Hz PWM ,输入到GPIO17  (模拟触发信号)

2- 逻辑分析仪生产另一个16789Hz PWM信号,输入到GPIO15   (模拟信号输入)

3- 配置定时器0为 外部触发模式,并在GPIO17 中断中读取计数器CNT值,并清0。


static void drv_gpio_isr_handler(void *om_reg, drv_event_t event, void *int_status, void *data)
{
    static uint32_t count_now = 0;
    count_now = OM_TIM0->CNT;
    OM_TIM0->CNT = 0;
    OM_LOG_DEBUG("\nOM_TIM0->CNT %d (0x%x)", count_now, count_now);
}


static void hardware_init(void)
{
    drv_gpio_register_isr_callback(OM_GPIO0, drv_gpio_isr_handler);
    drv_pmu_wakeup_pin_set(BITMASK(PAD_BUTTON_0) | BITMASK(PAD_BUTTON_1), PMU_PIN_WAKEUP_LOW_LEVEL);
    drv_pmu_wakeup_pin_register_callback(drv_pin_wakeup_isr_handler);
    pm_sleep_notify_user_callback_register(pm_sleep_notify_handler);
}


void Example_Extern_Trigger_Timer(void)
{
#define GPIO_ETR   (15)  //GPIO作为外部信号输入
    pin_config_t pin_cfg[] =
    {
        {GPIO_ETR, {PINMUX_PAD15_TIMER0_ETR_CFG}, PMU_PIN_MODE_PU, PMU_PIN_DRIVER_CURRENT_NORMAL},
    };

    drv_pin_init(pin_cfg, sizeof(pin_cfg) / sizeof(pin_cfg[0]));

    drv_tim_init(OM_TIM0);
    drv_tim_register_event_callback(OM_TIM0, tim_count_callback);//可以不需要了
    OM_TIM0->PSC = 0; //0-不分频,1-2分频
    OM_TIM0->ARR = 0xFFFFFFFF; //到
    // use edge-aligned mode, upcounter, ARR register is buffered
    register_set(&OM_TIM0->CR1, MASK_4REG(TIM_CR1_ARPE, 1,
                                          TIM_CR1_OPM,  0,
                                          TIM_CR1_CMS,  0,
                                          TIM_CR1_DIR,  0));
    OM_TIM0->DIER = 0;
    OM_TIM0->CNT  = 0;
    OM_TIM0->SR   = 0;
    //config extern trigger mode 2
    OM_LOG_DEBUG("\nSMCR = 0x%x,CEN=%d", OM_TIM0->SMCR, OM_TIM0->CR1 & 0x01);
    register_set(&OM_TIM0->SMCR, MASK_4REG(TIM_SMCR_ETF,  0x00, //filter=0
                                           TIM_SMCR_ETPS,  0x00,  //prescal=1
                                           TIM_SMCR_ECE,  0x01, //external clock mode 2
                                           TIM_SMCR_TS, 0x07)); //rising edge
    // Enable the counter by writing CEN = 1 in the TIM_CR1 register.
    register_set(&OM_TIM0->CR1, MASK_1REG(TIM_CR1_CEN,  0x01));
    OM_LOG_DEBUG("\nSMCR = 0x%x,CEN=%d", OM_TIM0->SMCR, OM_TIM0->CR1 & 0x01);
    //drv_tim_gp_stop(OM_TIM0);  //
}



image.png

[17:46:12.257]收←◆ OM_TIM0->CNT 839 (0x347)
[17:46:12.308]收←◆ OM_TIM0->CNT 840 (0x348)
[17:46:12.358]收←◆ OM_TIM0->CNT 839 (0x347)
[17:46:12.408]收←◆ OM_TIM0->CNT 839 (0x347)
[17:46:12.458]收←◆ OM_TIM0->CNT 840 (0x348)
[17:46:12.508]收←◆ OM_TIM0->CNT 839 (0x347)
[17:46:12.558]收←◆ OM_TIM0->CNT 839 (0x347)
[17:46:12.608]收←◆ OM_TIM0->CNT 840 (0x348)
[17:46:12.658]收←◆ OM_TIM0->CNT 839 (0x347)
[17:46:12.708]收←◆ OM_TIM0->CNT 839 (0x347)
[17:46:12.758]收←◆ OM_TIM0->CNT 840 (0x348)
[17:46:12.807]收←◆ OM_TIM0->CNT 839 (0x347)
[17:46:12.858]收←◆ OM_TIM0->CNT 839 (0x347)
[17:46:12.908]收←◆ OM_TIM0->CNT 840 (0x348)
[17:46:12.959]收←◆ OM_TIM0->CNT 839 (0x347)
[17:46:13.008]收←◆ OM_TIM0->CNT 839 (0x347)








Timer0外部触发计数Demo-202503106133.rar
被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站