OpenEdv-开源电子网

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

请教原子哥 测量4路频率的问题

[复制链接]

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2013-7-9
在线时间
5 小时
发表于 2014-5-14 11:18:58 | 显示全部楼层 |阅读模式
5金钱
我想用定时器的输入捕获功能来测量频率,例程序只给了测量一路的例子,如果我想同时或者循环测量4路频率,我该如何修改?

void TIM5_Cap_Init(u16 arr,u16 psc)

 GPIO_InitTypeDef GPIO_InitStructure;
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能TIM5时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟
 
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前设置 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入 
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 GPIO_ResetBits(GPIOA,GPIO_Pin_0);       //PA0 下拉
 
 //初始化定时器5 TIM5 
 TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
 TIM_TimeBaseStructure.TIM_Prescaler =psc;  //预分频器  
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
 TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
 //初始化TIM5输入捕获参数
 TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01  选择输入端 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);
 
 //中断分组初始化
 NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM3中断
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
 NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
 
 TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断 
 
    TIM_Cmd(TIM5,ENABLE );  //使能定时器5
}

最佳答案

查看完整内容[请看2#楼]

添加捕获通道。注意,这里的通道不能通过或的方式写,必须重复设置,有几个通道设置几个。 TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01  选择输入端 IC1映射到TI1上    TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获    TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectT ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

180

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2013-4-23
在线时间
25 小时
发表于 2014-5-14 11:18:59 | 显示全部楼层
添加捕获通道。注意,这里的通道不能通过或的方式写,必须重复设置,有几个通道设置几个。

TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01  选择输入端 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);
回复

使用道具 举报

15

主题

180

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2013-4-23
在线时间
25 小时
发表于 2014-5-14 11:18:59 | 显示全部楼层
回复【3楼】奋斗的小鸟:
---------------------------------
表示对你无语。
/**
  * @brief  Checks whether the TIM interrupt has occurred or not.
  * @param  TIMx: where x can be 1 to 14 to select the TIM peripheral.
  * @param  TIM_IT: specifies the TIM interrupt source to check.
  *          This parameter can be one of the following values:
  *            @arg TIM_IT_Update: TIM update Interrupt source
  *            @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source
  *            @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source
  *            @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source
  *            @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source
  *            @arg TIM_IT_COM: TIM Commutation Interrupt source
  *            @arg TIM_IT_Trigger: TIM Trigger Interrupt source
  *            @arg TIM_IT_Break: TIM Break Interrupt source
  *
  * @note   TIM6 and TIM7 can generate only an update interrupt.
  * @note   TIM_IT_COM and TIM_IT_Break are used only with TIM1 and TIM8.
  *     
  * @retval The new state of the TIM_IT(SET or RESET).
  */
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
{
  ITStatus bitstatus = RESET;  
  uint16_t itstatus = 0x0, itenable = 0x0;
  /* Check the parameters */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
  assert_param(IS_TIM_GET_IT(TIM_IT));
   
  itstatus = TIMx->SR & TIM_IT;
  
  itenable = TIMx->DIER & TIM_IT;
  if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  return bitstatus;
}

调用此函数判断哪个通道发生中断。至于其中一路产生中断处理的时候,另一路又产生中断,怎么办?他们公用的一个定时器5的中断。这个就要你处理中断足够快了。
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2013-7-9
在线时间
5 小时
 楼主| 发表于 2014-5-14 12:49:49 | 显示全部楼层
回复【2楼】wobukansanguo:
---------------------------------
如果直接添加捕获通道,那4路捕获中断的时候怎么判别是哪一个产生的中断?或者当其中一路产生中断处理的时候,另一路又产生中断,怎么办?他们公用的一个定时器5的中断
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 02:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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