OpenEdv-开源电子网

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

有段求方波频率的代码很迷,求各位路过的

[复制链接]

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
发表于 2018-8-22 18:02:59 | 显示全部楼层 |阅读模式

void time_init()
{       
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM2_TimeBaseInitStructure;         
        TIM_TimeBaseInitTypeDef TIM3_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除TIM2中断标志位
        TIM2_TimeBaseInitStructure.TIM_Period = 0xFFFF;//设置自动重装载值
        TIM2_TimeBaseInitStructure.TIM_Prescaler = 0;//设置分频
        TIM2_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM2_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
        TIM_TimeBaseInit(TIM2,&TIM2_TimeBaseInitStructure);       
          
        TIM_ETRClockMode1Config(TIM2, TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted, 0x00);  //设置为采用外部时钟计数,可设定滤波参数消除信号干扰
       
        TIM_Cmd(TIM2,ENABLE);
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
        TIM3_TimeBaseInitStructure.TIM_Period = 999;
        TIM3_TimeBaseInitStructure.TIM_Prescaler = 3599;
        TIM3_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM3_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseInitStructure);       
       
        TIM_Cmd(TIM3,ENABLE);
        TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE );       
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;       
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;  
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
        NVIC_Init(&NVIC_InitStructure);       
}



      定时器中断函数


void TIM3_IRQHandler()         
{
        static u8 i;
        static u32 frequent_sum;
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);   //清中断
        if(i<19)
        {
                cnt += TIM_GetCounter(TIM2);  //,获取计数器的值,累加减少误差
                TIM_SetCounter(TIM2,0);    //计数器清零
                i++;
        }
        else
        {
                cnt += TIM_GetCounter(TIM2);
                TIM_SetCounter(TIM2,0);
                cnt += cnt*0.000025;        //根据实际情况修改系数线性补偿
                frequent = cnt;
                i = 0;
                cnt = 0;               
        }
}

为什么要if(i<19)

为什么frequent=cnt

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

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7620
金钱
7620
注册时间
2016-11-30
在线时间
646 小时
发表于 2018-8-23 14:35:19 | 显示全部楼层
椰子皮djc 发表于 2018-8-23 11:55
那对于预分频系数该怎么设置啊,有点懵

这要看你主频是多少了,根据你的主频进行分频,然后设置计数多少次产生中断。
假如你的主频是72MHz,那么,TIM3中断就是(999+1)*(3599+1)/72000000秒,就是50ms
回复 支持 1 反对 0

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
 楼主| 发表于 2018-8-22 18:04:33 | 显示全部楼层
表示定时中断函数这段代码没看懂
回复 支持 反对

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7620
金钱
7620
注册时间
2016-11-30
在线时间
646 小时
发表于 2018-8-23 10:00:02 | 显示全部楼层
会不会你的TIM3是50ms中断?如果是这样,就需要记满20次的cnt才是频率呢
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
 楼主| 发表于 2018-8-23 11:55:01 | 显示全部楼层
lvkanger 发表于 2018-8-23 10:00
会不会你的TIM3是50ms中断?如果是这样,就需要记满20次的cnt才是频率呢

那对于预分频系数该怎么设置啊,有点懵
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
 楼主| 发表于 2018-8-23 21:44:34 | 显示全部楼层
lvkanger 发表于 2018-8-23 14:35
这要看你主频是多少了,根据你的主频进行分频,然后设置计数多少次产生中断。
假如你的主频是72MHz,那 ...

可以加个QQ 交流下技术问题吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-11 09:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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