如有些信号,频率很高,要精确地实现脉冲计数,一般不能使用GPIO中断模式来实现。可以使用定时器的外部触模式来,来实现此功能。 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); // } [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) |
