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);
posted @   会编程的数组  阅读(239)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示