打印
[STM32]

立创商城STM32F系列——STM32f4输入捕获实验代码(01)

[复制链接]
572|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-9-7 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32f4————输入捕获实验代码(01)
/*******************************************************/
我们来看看 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); //清除中断标志位
}
/*******************************************************/


【立创商城】STM32F103CBT6 托盘  https://item.szlcsc.com/8796.html

相关帖子

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

本版积分规则

70

主题

70

帖子

0

粉丝