STM32调试输入捕获
今天碰到一个bug
首先先确认定时器的计数使能
输入捕获功能使能
然后要确认 用的哪个通道就读取哪个CCRX
/* @preif: port_hal_timer4_init @param:en_pwm:enable pwm ,1--enable, 0--disable en_ic:enable input capture, 1--enable, 0--disable en_co:enable compare output, 1--enable, 0--disable @retval:none @author:ygrong @changelog: */ static void port_hal_timer4_init( unsigned char en_pwm,unsigned char en_ic, unsigned char en_co) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_AHB1PeriphClockCmd (POSI_BLOWER_HALL1_INPUT_CAPTURE_PORT_CLK, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); GPIO_PinAFConfig(POSI_BLOWER_HALL1_INPUT_CAPTURE_PORT, POSI_BLOWER_HALL1_INPUT_CAPTURE_PINSource, GPIO_AF_TIM4); GPIO_InitStructure.GPIO_Pin = POSI_BLOWER_HALL1_INPUT_CAPTURE_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(POSI_BLOWER_HALL1_INPUT_CAPTURE_PORT, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 100000 - 1;/*1s*/ /*定时器时钟源TIMxCLK = 90MHz ,设定定时器计数器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz 10us */ TIM_TimeBaseStructure.TIM_Prescaler = 900-1; /*采样时钟分频,这里不需要用到*/ TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /*计数方式*/ TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /*重复计数器,这里不需要用到*/ TIM_TimeBaseStructure.TIM_RepetitionCounter=0; /*初始化定时器TIM4*/ TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); if(en_ic) { TIM_ICInitStructure.TIM_Channel = POSI_BLOWER_HALL1_INPUT_CAPTURE_CHANNEL; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_PWMIConfig(TIM4, &TIM_ICInitStructure); TIM_ITConfig(TIM4, TIM_IT_Update| TIM_IT_CC1, ENABLE); } TIM_Cmd(TIM4, ENABLE); }
static void port_hal_timer4_interrupt_setting(unsigned char int_prio, unsigned char en_flag) { NVIC_InitTypeDef NVIC_InitStructure; //uart1 interrupt NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = int_prio; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; if(en_flag != 0) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; else NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init(&NVIC_InitStructure); }
void TIM4_IRQHandler(void) { if((timer4_obj.capture_sta & 0x80) == 0) /**捕获未成功***/ { if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) /**溢出中断**/ { if(timer4_obj.capture_sta & 0x40) /**已经捕捉到高电平**/ { if((timer4_obj.capture_sta & 0x3F) == 0x3F)/**高电平时间太长**/ { timer4_obj.capture_sta |= 0x80; timer4_obj.capture_val_2 = 0xFFFFFFFF; } else timer4_obj.capture_sta++; } } if(TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET) /**通道4发生捕获***/ { if(timer4_obj.capture_sta & 0x40) /**已经捕捉到一个上升沿**/ { timer4_obj.capture_sta |= 0x80; /**标记成功捕捉到一个周期**/ timer4_obj.capture_val_2 = TIM_GetCapture1(TIM4); } else /**第一次捕捉上升沿**/ { timer4_obj.capture_val_1 = 0; timer4_obj.capture_val_2 = 0; timer4_obj.capture_sta = 0; timer4_obj.capture_sta |= 0x40; /**记录找到上升沿**/ TIM_SetCounter(TIM4, 0); } } } TIM_ClearITPendingBit(TIM4, TIM_IT_CC1|TIM_IT_Update); /**清除中断标志位***/ }
timer4_obj.capture_val_2 = TIM_GetCapture1(TIM4);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步