打印
[其他ST产品]

STM32脉冲捕捉功能。 这样的初始化为啥不能捕捉频率, 感觉和正点原子哥的初始化一样的。求指点、

[复制链接]
408|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2024-8-21 17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void tiM3_Configuration(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
                GPIO_InitTypeDef GPIO_InitStructure;   
                TIM_ICInitTypeDef TIM3_ICInitStructure;
                NVIC_InitTypeDef NVIC_InitStructure;
      
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    /*GPIOA Configuration*/
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
               

    TIM_DeInit(TIM3);
/***72M下定时值的计算((1+预分频EXTI_Prescaler)/72*(1+定时周期EXTI_Period))*/
                TIM_TimeBaseStructure.TIM_Period=0xffff;//预分频:72M/(TIM_Period+1)=72
                TIM_TimeBaseStructure.TIM_Prescaler=71;  //定时时间:(1/TIM_Period)*(TIM_Prescaler+1)=0.0139Us
                TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;   //时钟分割
                TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
                TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//Time base configuration

               
                TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1; // 选择输入端 IC1 映射到 TI1 上
          TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;// 捕获下降沿
                TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
                TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //捕获在捕获输入上每探测到一个边沿执行一次
                TIM3_ICInitStructure.TIM_ICFilter = 0x00;                      //输入比较滤波器
                TIM_ICInit(TIM3, &TIM3_ICInitStructure);
               
                NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 中断
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级 2 级
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
                NVIC_Init(&NVIC_InitStructure); //⑤根据指定的参数初始化 NV
        //        TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_DIV8, TIM_ExtTRGPolarity_Inverted, 4);//8分频
                TIM_ITRxExternalClockConfig(TIM3,TIM_TS_ETRF); //配置外部触发,否则不会计数
               
                //TIM3->SMCR=0X43;
                TIM_ITConfig( TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断和捕获中断
                TIM_Cmd(TIM3,ENABLE ); //⑥使能定时器 3
}

void TIM3_IRQHandler(void)
{
        //Fre_flag=1;
        if((TIM3CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
                {
                //        Fre_flag=2;
                        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
                        {
                        //        Fre_flag=5;
                                if(TIM3CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                                {
                        //                Fre_flag=6;
                                        if((TIM3CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                        {
                                //                Fre_flag=7;
                                                TIM3CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                                TIM3CH1_CAPTURE_VAL=0XFFFF;
                                        }else TIM3CH1_CAPTURE_STA++;
                                }
                        }
               
                        if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)//捕获 1 发生捕获事件
                        {
                        //        Fre_flag=3;
                                if(TIM3CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
                                {
                                //        Fre_flag=8;
                                        TIM3CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
                                        TIM3CH1_CAPTURE_VAL=TIM_GetCapture1(TIM3);
                                        TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising); //设置为上升沿捕获
                                }
                                else //还未开始,第一次捕获上升沿
                                {
                                //        Fre_flag=4;
                                        TIM3CH1_CAPTURE_STA=0; //清空
                                        TIM3CH1_CAPTURE_VAL=0;
                                        TIM_SetCounter(TIM3,0);
                                        TIM3CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
                                        TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling); //设置为下降沿捕获
                                }
                        }
        }
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

      
}

使用特权

评论回复
沙发
suw12q| | 2024-8-31 20:51 | 只看该作者
你可以仿真看看程序执行到哪儿了

使用特权

评论回复
板凳
t1ngus4| | 2024-8-31 20:59 | 只看该作者
一般看你代码来说,看不出啥毛病啊

使用特权

评论回复
地板
tax2r6c| | 2024-8-31 21:04 | 只看该作者
就是你程序是正常运行的不?复位了没?

使用特权

评论回复
5
w2nme1ai7| | 2024-8-31 21:23 | 只看该作者
初始化好像没啥问题吧,PD2设置的模拟浮空输入啊?可以吗

使用特权

评论回复
6
y1n9an| | 2024-8-31 21:57 | 只看该作者
脉冲捕捉的话正点原子不是有例程的吗

使用特权

评论回复
7
zhizia4f| | 2024-8-31 22:08 | 只看该作者
你可以看看他家的视频啊,关于定时器方面的,很全面的

使用特权

评论回复
8
b5z1giu| | 2024-8-31 22:39 | 只看该作者
现在看不出啥现象啊,中断的优先级是不是设置的比较低呢?

使用特权

评论回复
9
cen9ce| | 2024-8-31 22:46 | 只看该作者
你可以把其他程序都屏蔽,然后只开定时器和捕获,看看程序怎么运行的

使用特权

评论回复
10
d1ng2x| | 2024-8-31 23:23 | 只看该作者
建议使用STlink或者jlink试试,就是仿真跟踪看看

使用特权

评论回复
11
ex7s4| | 2024-8-31 23:53 | 只看该作者
要不进入到中断先清标记位也是可以吧,而且使用这个标记寄存器这个我看不懂,你可以试试用cubemx配置试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

440

主题

1669

帖子

1

粉丝