OpenEdv-开源电子网

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

请问原子哥,STM32F407IGT6 TIM5_ETR引脚,可以作为外部计数吗?

[复制链接]

19

主题

490

帖子

4

精华

论坛元老

Rank: 8Rank: 8

积分
5190
金钱
5190
注册时间
2016-7-21
在线时间
1148 小时
发表于 2017-11-6 10:17:00 | 显示全部楼层 |阅读模式
50金钱
芯片有TIM5_CH1_ETR 360截图20171106101333170.jpg 调试了很久不能成功计数,是我的初始化有问题吗?还是获取计数值得方式不对?下面为初始化代码和读取函数:

    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
               
/*输入管脚*/               
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
    GPIO_PinAFConfig(GPIOH, GPIO_PinSource10, GPIO_AF_TIM5);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
                GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOH, &GPIO_InitStructure);
       
/*计数器*/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
    TIM_DeInit(TIM5);
    TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /*定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)
                                                                            使用的采样频率之间的分频比为1*/
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit( TIM5, &TIM_TimeBaseStructure); // Time base configuration   
    TIM_TIxExternalClockConfig(TIM5, TIM_TIxExternalCLK1Source_TI2, TIM_ICPolarity_Rising, 0);//TIM5 的chanl2 做外部时钟的输入管脚。
     //TIM5 的ETR管脚做外部时钟的输入管脚用这种模式
    TIM_ETRClockMode2Config(TIM5, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
    TIM_Cmd(TIM5, ENABLE);
                TIM_SetCounter(TIM5, 0);   // 清零计数器CNT       
//        TIM_Cmd(TIM5, DISABLE);

  获取脉冲个数
  SPEED4 = TIM5->CNT;       

最佳答案

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

附件的图片是从F4的《中文参考手册》上截的图,外部触发输入只使用与TIM2.3.4,并不使用于TIM5,所以楼主可以 -----1. 换个定时器试试 -----2. 根据截图的内容,把模式2换做模式1(外部输入ETR选择换为外部输入引脚TI1) 希望回答对你有帮助
@野生程序员
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2017-9-27
在线时间
33 小时
发表于 2017-11-6 10:17:01 | 显示全部楼层
本帖最后由 Bigflish 于 2017-11-6 21:50 编辑

            附件的图片是从F4的《中文参考手册》上截的图,外部触发输入只使用与TIM2.3.4,并不使用于TIM5,所以楼主可以   -----1.  换个定时器试试

  -----2.  根据截图的内容,把模式2换做模式1(外部输入ETR选择换为外部输入引脚TI1)
          希望回答对你有帮助

STM32时钟选择

STM32时钟选择
回复

使用道具 举报

19

主题

490

帖子

4

精华

论坛元老

Rank: 8Rank: 8

积分
5190
金钱
5190
注册时间
2016-7-21
在线时间
1148 小时
 楼主| 发表于 2017-11-6 22:08:22 | 显示全部楼层
Bigflish 发表于 2017-11-6 21:47
附件的图片是从F4的《中文参考手册》上截的图,外部触发输入只使用与TIM2.3.4,并不使用于TIM5 ...

现在电路接口已经设计好了,tim2.3.4的etr接口已经用了,只能使用ph10这个端口,请问你说的方式2是使用tim5?我是想用tim5的etr功能采集电机脉冲,etr模式不占用CPU,还有一种方式是使用ph10的外部中断采集,这样一直中断占用CPU,请问根据我的需求您有好的方式推荐吗?
@野生程序员
回复

使用道具 举报

3

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2017-9-27
在线时间
33 小时
发表于 2017-11-7 10:29:11 | 显示全部楼层
本帖最后由 Bigflish 于 2017-11-7 10:33 编辑

    可以选择如图所示的时钟(TI1,对应外部输入与引脚TIM5_CH1)作为定时器输入的时钟。做如下的配置:
     例如,要使递增计数器在 TI1 输入出现上升沿时计数,请执行以下步骤:
1. 通过在 TIMx_CCMR1 寄存器中写入 CC1S=“01”来配置通道 1,使其能够检测 TI1 输入的上升沿。
2.  通过在 TIMx_CCMR1 寄存器中写入 IC1F[3:0] 位来配置输入滤波时间(如果不需要任何滤波,请保持 IC1F=0000)。 由于捕获预分频器不用于触发操作,因此无需对其进行配置。
3.  通过在 TIMx_CCER 寄存器中写入 CC1P=0 和 CC2NP=0 来选择上升沿极性。
4.  通过在 TIMx_SMCR 寄存器中写入 SMS=111,使定时器在外部时钟模式 1 下工作。
5.  通过在 TIMx_SMCR 寄存器中写入 TS=101 来选择 TI1 作为输入源。
6.  通过在 TIMx_CR1 寄存器中写入 CEN=1 来使能计数器。
当 TI1 出现上升沿时,计数器便会计数一次并且 TIF 标志置 1。
   上边的步骤也是参考《中文参考手册》


     与之对应的库函数为  TIM_TIxExternalClockConfig(TIM5,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising,0)
  调用 TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);
    之后,只是选择了定时器的时钟来源,还得进一步设置分频其的值(1)
      然后开启定时器,就可以工作了

定时器框图.png
回复

使用道具 举报

19

主题

490

帖子

4

精华

论坛元老

Rank: 8Rank: 8

积分
5190
金钱
5190
注册时间
2016-7-21
在线时间
1148 小时
 楼主| 发表于 2017-11-7 13:36:50 | 显示全部楼层
Bigflish 发表于 2017-11-7 10:29
可以选择如图所示的时钟(TI1,对应外部输入与引脚TIM5_CH1)作为定时器输入的时钟。做如下的配置:
  ...

可以写一份库函数版本的配置函数吗?好多寄存器搞不懂,谢谢您
@野生程序员
回复

使用道具 举报

3

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2017-9-27
在线时间
33 小时
发表于 2017-11-7 18:32:02 | 显示全部楼层
     我也是刚接触不久啊,看了一下寄存器操作,TIM_TIxExternalClockConfig(TIM5,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising,0) ,这个函数就是库函数版本的配置了吧,配置完以后就选择了时钟源,之后的配置就是TIM_TimeBaseInit(),正常的的定时操作。
    开启定时器,然后需要的时候,读取计数值。
   
回复

使用道具 举报

19

主题

490

帖子

4

精华

论坛元老

Rank: 8Rank: 8

积分
5190
金钱
5190
注册时间
2016-7-21
在线时间
1148 小时
 楼主| 发表于 2017-11-7 19:45:56 | 显示全部楼层
Bigflish 发表于 2017-11-7 18:32
我也是刚接触不久啊,看了一下寄存器操作,TIM_TIxExternalClockConfig(TIM5,TIM_TIxExternalCLK1So ...

好的,多谢了
@野生程序员
回复

使用道具 举报

4

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2017-3-11
在线时间
78 小时
发表于 2017-11-7 23:13:02 | 显示全部楼层
你猜啊 啊啊啊
回复

使用道具 举报

19

主题

490

帖子

4

精华

论坛元老

Rank: 8Rank: 8

积分
5190
金钱
5190
注册时间
2016-7-21
在线时间
1148 小时
 楼主| 发表于 2017-11-13 20:48:16 来自手机 | 显示全部楼层
Bigflish 发表于 2017-11-7 18:32
我也是刚接触不久啊,看了一下寄存器操作,TIM_TIxExternalClockConfig(TIM5,TIM_TIxExternalCLK1So ...

你好,我把PH10配置成外部中断,不能进入中断是芯片没有这个功能还是要用特殊的配置初始化?
回复

使用道具 举报

3

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2017-9-27
在线时间
33 小时
发表于 2017-11-13 21:32:26 | 显示全部楼层
有的吧,最好查一下芯片资料:
       但是注意的是外部中段10是和其他中断一起使用的
     void  EXTI15_10_IRQHandler  (void)
   {
  }

,在这个得注意。我之前就理所应当的认为是EXTI10_IRQHandler,后来才发现不对
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 06:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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