STM32f4---输入捕获实验代码(01)

发布者:平和思绪最新更新时间:2018-09-29 来源: eefocus 手机看文章 扫描二维码
随时随地手机看文章

我们来看看 timer.c文件中,我们添加的两个函数的内容:

TIM_ICInitTypeDef  TIM5_ICInitStructure;

//定时器 5通道1 输入捕获配置

//arr:自动重装值(TIM2,TIM5 是 32位的!!)        psc:时钟预分频数

void TIM5_CH1_Cap_Init(u32 arr,u16 psc)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  //TIM5时钟使能     

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA时钟

  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0

  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_DOWN; //下拉

  GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0

 

  GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0复用位定时器5

   

  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(TIM5,&TIM_TimeBaseStructure);

  

  TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端  IC1 映射到TI1上

     TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //上升沿捕获

     TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上

     TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;    //配置输入分频,不分频  

     TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波

      TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5输入捕获参数

    

  TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新和捕获中断 

      TIM_Cmd(TIM5,ENABLE );    //使能定时器 5

 

       NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2

  NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;//响应优先级0

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //IRQ 通道使能

  NVIC_Init(&NVIC_InitStructure);  //根据指定的参数初始化VIC 寄存器、

}

//捕获状态

//[7]:0,没有成功的捕获;1,成功捕获到一次.

//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.

//[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)

u8  TIM5CH1_CAPTURE_STA=0;  //输入捕获状态                 

u32  TIM5CH1_CAPTURE_VAL;  //输入捕获值(TIM2/TIM5是 32位)

//定时器 5中断服务程序    

void TIM5_IRQHandler(void)

{  

    if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获  

  {

    if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)//溢出

    {        

      if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了

      {

        if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了

        {

          TIM5CH1_CAPTURE_STA|=0X80;    //标记成功捕获了一次

          TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;

        }else TIM5CH1_CAPTURE_STA++;

      }    

    }

    if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获 1发生捕获事件

    {  

      if(TIM5CH1_CAPTURE_STA&0X40)  //捕获到一个下降沿      

      {           

         TIM5CH1_CAPTURE_STA|=0X80;  //标记成功捕获到一次高电平脉宽

         TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);//获取当前的捕获值.

           TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置上升沿捕获

      }else                 //还未开始,第一次捕获上升沿

      {

         TIM5CH1_CAPTURE_STA=0;  //清空

         TIM5CH1_CAPTURE_VAL=0;

         TIM5CH1_CAPTURE_STA|=0X40;//标记捕获到了上升沿

         TIM_Cmd(TIM5,ENABLE );    //使能定时器 5

           TIM_SetCounter(TIM5,0); //计数器清空

           TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);//设置下降沿捕获

         TIM_Cmd(TIM5,ENABLE );    //使能定时器 5

      }         

    }                                 

    }

  TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

}


引用地址:STM32f4---输入捕获实验代码(01)

上一篇:STM32f4---输入捕获实验代码(02)
下一篇:STM32f4---PWM输出实验代码

推荐阅读最新更新时间:2024-03-16 16:14

STM32f4---输入捕获实验代码(02)
此部分代码包含两个函数,其中TIM5_CH1_Cap_Init函数用于 TIM5通道 1的输入捕获设置,其设置和我们上面讲的步骤是一样的,这里就不多说,特别注意:TIM5 是 32 位定时器,所以 arr是u32 类型的。接下来,重点来看看第二个函数。 TIM5_IRQHandler 是 TIM5 的中断服务函数,该函数用到了两个全局变量,用于辅助实现高电平捕获。其中TIM5CH1_CAPTURE_STA,是用来记录捕获状态,该变量类似我们在usart.c里面自行定义的USART_RX_STA 寄存器(其实就是个变量,只是我们把它当成一个寄存器那样来使用)。TIM5CH1_CAPTURE_STA各位描述如表15.3.1所示: TI
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved