OpenEdv-开源电子网

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

F407 用定时器2ETR测量输入信号频率 为什么计数值一直是0?

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-22
在线时间
5 小时
发表于 2019-7-29 20:17:07 | 显示全部楼层 |阅读模式
2金钱
int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        uart_init(115200);                //初始化串口波特率为115200
        TIM3_Int_Init(9999,8399);//定时器3中断频率1Hz
        TIM14_PWM_Init(999,83);//产生1kHz方波 PF9
        TIM2_Cap_Init(0xFFFF);     //自动重装载值 PA15 与PF9相连
          while(1)
        {                 
        }
}

//通用定时器3中断初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
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更新中断
       
        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_Cmd(TIM3,ENABLE); //使能定时器3
}
//通用定时器2初始化
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
void TIM2_Cap_Init(u32 arr)                                    //配置 TIM2_CH1_ETR 为外部脉冲计数
{   
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    //使能TIM2时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);   //使能GPIOA时钟

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;              //PA15
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                  // 复用
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
       
          GPIO_PinAFConfig(GPIOA,GPIO_Pin_15,GPIO_AF_TIM2);          //管脚复用映射

    //初始化定时器2 TIM2   
    TIM_TimeBaseStructure.TIM_Period = arr;              //设定计数器自动重装值
    TIM_TimeBaseStructure.TIM_Prescaler =0;                 //预分频器   
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);         //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//          TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ETRF);          //配置外部触发,否则不会计数
    TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
    TIM_SetCounter(TIM2, 0);        
    TIM_Cmd(TIM2,ENABLE );                                  //使能定时器2
}

void TIM14_PWM_Init(u32 arr,u32 psc)
{                                                          
        //此部分需手动修改IO口设置
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);          //TIM14时钟使能   
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);         //使能PORTF时钟       
       
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           //GPIOF9
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
        GPIO_Init(GPIOF,&GPIO_InitStructure);              //初始化PF9
          
        TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
       
        TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
       
        //初始化TIM14 Channel1 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低
        TIM_OC1Init(TIM14, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1

        TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的预装载寄存器

  TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
        TIM_SetCompare1(TIM14,5000);
        TIM_Cmd(TIM14, ENABLE);  //使能TIM14                          
}  

/*******************************************************************************
* 名称: TIM3_IRQHandler
* 功能: 通用定时器3中断服务函数
* 形参: 无
* 返回: 无
* 说明: 1S定时中断一次
******************************************************************************/
u16 CNT=0;
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!= RESET)      //检查TIM3更新中断发生与否
    {
      TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除TIMx更新中断标志

      CNT=TIM_GetCounter(TIM2);                   //读取1s内计数器计的CNT值
//                        LCD_ShowxNum(10,50,CNT,200,16,0);                         //脉冲的频率
                        printf("%d\r\n",CNT);
      TIM_SetCounter(TIM2,0);
    }
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-7-30 02:24:46 | 显示全部楼层
帮顶,可以参考下其他网友的代码
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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