| 如有些信号,频率很高,要精确地实现脉冲计数,一般不能使用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) | 
 Timer0外部触发计数Demo-202503106133.rar
Timer0外部触发计数Demo-202503106133.rar
				
										
			
			
 
                            
                        
