OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5096|回复: 2

定时器计数模式测量脉冲信号频率无法实现

[复制链接]

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2021-12-8
在线时间
12 小时
发表于 2022-11-1 16:17:47 | 显示全部楼层 |阅读模式
想用定时器2的通道1对外部脉冲计数,但无反应,有没有大佬指点一二
定时器代码
void TIM2_Int_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
          GPIO_InitTypeDef GPIO_InitStructure;

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PA端口时钟

       
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
                GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2);
                GPIO_Init(GPIOA,&GPIO_InitStructure);

//定时器设置-------------------------------------------------------------   
    TIM_TimeBaseInitStructure.TIM_Period = 65535;  //重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler=0;  //预分频
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割
               
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化TIM2
                //TIM_ETRClockMode1Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);//外部计数
                TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI2,TIM_ICPolarity_Rising,0);



//溢出中断设置--------------------------------------------------------------  


    NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);


//Reset counter-----------------------------------------------
  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允许TIM2溢出中断
  TIM_SetCounter(TIM2,0); //TIM2->CNT=0
  TIM_Cmd(TIM2, ENABLE);
}


void TIM3_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
       
  TIM_TimeBaseInitStructure.TIM_Period = arr;         //自动重装载值
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
       
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
       
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
        TIM_Cmd(TIM3,ENABLE); //使能定时器3
       
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        TIM_SetCounter(TIM3,0);
}

int COUNT=0;

void TIM2_IRQHandler(void)
{

  if (TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
  {
                TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  //清除中断标志位
                COUNT++;
        }
       
}


//定时器3中断服务函数

unsigned char i=0;
u32 frq;//连续存取10次的测频法得到的频率
unsigned int pul_num;//标准时间内的脉冲数量
unsigned int cnt;//读取当前计数值
unsigned int last_cnt=0;//上一次的计数值
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
        {
//                cnt = TIM_GetCounter(TIM2);//读取定时器2对外部脉冲的计数结果
//                if(cnt >= last_cnt)//如果发生过溢出,当前计数结果就有可能比上次的计数结果还小
//                                pul_num = (unsigned int)(COUNT<<16)+ (unsigned int)(cnt - last_cnt);
//                else
//                                pul_num = (unsigned int)((COUNT-1)<<16) + (unsigned int)(65536 + cnt - last_cnt);
//                                last_cnt = cnt;//将当前计数结果复制到上次的复制结果寄存,方便下次计算
//                                frq = pul_num * 100;//由于定时器3是1/100秒溢出一次,所以频率时脉冲个数的100倍
//                                COUNT=0;
                cnt = TIM_GetCounter(TIM2);
                pul_num=COUNT*65535+cnt;
                frq = pul_num * 100;
               
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2022-8-8
在线时间
28 小时
发表于 2022-11-1 18:34:57 | 显示全部楼层
可以使用输入捕获来捕获脉冲个数
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2021-12-8
在线时间
12 小时
 楼主| 发表于 2022-11-2 09:13:27 | 显示全部楼层
HZB11 发表于 2022-11-1 18:34
可以使用输入捕获来捕获脉冲个数

输入捕获没研究过啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 03:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表