OpenEdv-开源电子网

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

输入捕获ICx和TIx的对应

[复制链接]

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
435
金钱
435
注册时间
2014-8-16
在线时间
56 小时
发表于 2015-3-18 10:11:12 | 显示全部楼层 |阅读模式
5金钱
先po上红外实验的代码:

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;  // 选择输入端 IC2映射到TIM5_CH2上
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 
TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波
TIM_ICInit(TIM5, &TIM_ICInitStructure);//初始化定时器输入捕获通道

1.这个TIM_Channel_2 是  设置捕获比较寄存器CCMR1的 CCS2[1:0] 为 01: CC2通道被配置为输入, IC2映射在TI2上  吗?? 
    
    我查了一下,TIM_CHannel_2  的值是0x0004
    #define TIM_Channel_1                      ((uint16_t)0x0000)
    #define TIM_Channel_2                      ((uint16_t)0x0004)


可是跟0x0004好像对不上号啊??

    我又go to definition "TIM_ICInit()" 查找TIM_Channel  究竟是操作哪个寄存器,看到这句
    /* Set or reset the CCxE Bit */ 
  TIMx->CCER |=  (uint16_t)(TIM_CCx << TIM_Channel);
    是写入 TIMx->CCER 吗 ,还是我操作错了?
    看了下 TIM_CCER好像也不对啊。。究竟是哪里出问题了




2.看了一下手册,好像TIM的一个通道可以选择两个捕获通道,例如TIM5_CH2,既可以选择IC1,又可以选择成IC2,这样理解正确吗?
    为什么我把TIM_Channel_2改成TIM_CHannel_1就不行了呢??

疑惑好久啊。。求指教。。。。
 

最佳答案

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

1.  CCS2[1:0] 为 01:意思就是 CC2通道被配置为输入, IC2映射在TI2上  但你要明白IC2 和TI2的意思 : IC2是指输入捕获通道2,TI2是指信号输入通道(TIMx->CHx  x=1,2,3,4) 2. TIM_Channel_x(x=1,2,3,4)只是一个标志   TIM_ICInit根据这个标志,用TIx_Config 和TIM_SetICxPrescaler(x=1,2,3,4) 配置相应的通道 3.  ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-3-18 10:11:13 | 显示全部楼层
1.  CCS2[1:0] 为 01:意思就是 CC2通道被配置为输入, IC2映射在TI2上  但你要明白IC2 和TI2的意思 : IC2是指输入捕获通道2,TI2是指信号输入通道(TIMx->CHx  x=1,2,3,4)
2. TIM_Channel_x(x=1,2,3,4)只是一个标志   TIM_ICInit根据这个标志,用TIx_Config 和TIM_SetICxPrescaler(x=1,2,3,4) 配置相应的通道
3. TIMx->CCER |=  (uint16_t)(TIM_CCx << TIM_Channel); TIM_Channel=TIM_Channel_2=4  对应的是CC2E(不是你的截图CC1E)  也就是用于 使能通道2捕获
4. TIM确实可以选择2个捕获通道,想想第一点和你的截图,  
01 : CC2通道被配置为输入, IC2映射在TI2上;  这个意思是指用 输入捕获通道2去捕获TIMx->CH2的信号
10 : CC2通道被配置为输入, IC2映射在TI1 上; 这个意思是指用 输入捕获通道2去捕获TIMx->CH1的信号
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
435
金钱
435
注册时间
2014-8-16
在线时间
56 小时
 楼主| 发表于 2015-3-18 20:52:12 | 显示全部楼层
回复【2楼】lycreturn:
---------------------------------
谢谢啊。。
“TIM_Channel_x(x=1,2,3,4)只是一个标志   TIM_ICInit根据这个标志,用TIx_Config 和TIM_SetICxPrescaler(x=1,2,3,4) 配置相应的通道”

if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)
  {
    assert_param(IS_TIM_LIST8_PERIPH(TIMx));
    /* TI1 Configuration */
    TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
               TIM_ICInitStruct->TIM_ICSelection,
               TIM_ICInitStruct->TIM_ICFilter);
    /* Set the Input Capture rescaler value */
    TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
  }

刚开始以为TIM_Channel需要写入寄存器,就去查写入哪个寄存器....还有觉得定义了IO口,定时器的通道就确定了,为什么还要写多一次TIM_ICInitStructure.TIM_Channel = TIM_Channel_1,现在知道它只是作为一个判断标志的条件,进行相应配置。
谢谢。
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
435
金钱
435
注册时间
2014-8-16
在线时间
56 小时
 楼主| 发表于 2015-3-18 21:54:57 | 显示全部楼层
回复【2楼】lycreturn:
---------------------------------
选择映射语句是不是这句?   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI   

TIM_ICSelection_DirectTI=0x0001
01: CC1通道被配置为输入, IC1映射在TI1上;  怎么是TI1呢。。。不是TI2吗

如果要选择其他捕获通道(如IC2),该怎么设置?
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-3-18 22:07:22 | 显示全部楼层
回复【4楼】fanleung:
---------------------------------
 看参考手册TIMx_CCMR1和TIMx_CCMR2
不同的捕获通道  映射方式不一样
你刚说的的是 捕获通道1的映射方式
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
435
金钱
435
注册时间
2014-8-16
在线时间
56 小时
 楼主| 发表于 2015-3-18 22:22:50 | 显示全部楼层
 回复【5楼】 lycreturn :
---------------------------------
就红外实验,它使用定时器TIM5_CH2,  CCMR1控制CH1,CH2

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;  // 映射到TIM5_CH2上
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 
TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波
TIM_ICInit(TIM5, &TIM_ICInitStructure);//初始化定时器输入捕获通道  

设置映射是这句吗?
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;     (TIM_ICSelection_DirectTI=0x0001)


1.它本来就是通道2(TI2),不是应该设置成10吗,我哪里理解错了。。。麻烦耐心讲解一下,感激!!

2.如果要把TI2连接IC2,应该怎么设置?

3.TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波
    这里应该不是IC4F吧?应该是IC1F吧?

回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-3-18 22:36:40 | 显示全部楼层
回复【6楼】fanleung:
---------------------------------
你的截图 CC1S[1:0]是配置IC1的  
要使用IC2   去看CC2S[1:0]
使用IC3  请看CC3S[1:0].....   多看看手册
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
435
金钱
435
注册时间
2014-8-16
在线时间
56 小时
 楼主| 发表于 2015-3-18 23:04:57 | 显示全部楼层
回复【7楼】lycreturn:
---------------------------------
可是(TIM_ICSelection_DirectTI=0x0001),控制CC2S[1:0]  不是CCMR1的高八位吗,那不是应该为0x0100吗.....搞不明白。。
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-3-18 23:14:53 | 显示全部楼层
 跟踪下函数TIM_ICInit-->TI2_Config-->
static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,uint16_t TIM_ICFilter)
{
  uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0;
  /* Disable the Channel 2: Reset the CC2E Bit */
  TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC2E);
  tmpccmr1 = TIMx->CCMR1;
  tmpccer = TIMx->CCER;
  tmp = (uint16_t)(TIM_ICPolarity << 4);
  /* Select the Input and set the filter */
  tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC2S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC2F)));
  tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12);
  tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8);
  
TIM_ICSelection=0x0001,    TIM_ICSelection << 8=?  
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
435
金钱
435
注册时间
2014-8-16
在线时间
56 小时
 楼主| 发表于 2015-3-18 23:31:11 | 显示全部楼层
回复【9楼】lycreturn:
---------------------------------
嗯,我明白了。  我追踪到TI1_Config()看到 TIMx->CCMR1 = tmpccmr1;就去查寄存器了。。唉。。学习了!
  
谢谢你耐心的回答!谢谢
回复

使用道具 举报

87

主题

569

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2014-9-30
在线时间
140 小时
发表于 2015-3-21 09:38:39 | 显示全部楼层
回复【2楼】lycreturn:
---------------------------------
谢谢,大师。。你这 解说——非常 清晰——。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 19:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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