OpenEdv-开源电子网

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

STM32F429TIM4的Encoder接口问题,配置成Encoder接口CNT无法计数

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-9-23
在线时间
4 小时
发表于 2020-9-23 14:54:52 | 显示全部楼层 |阅读模式
5金钱
为什么GPIOB,可以读到PB6和PB7的电平变化,
EncoderPortLevel_00.PNG

TIM4配置成定时器模式也正常,
EncoderCNT1.PNG

但是配置成Encoder模式就无法计数,CNT值不会发生任何变化。
EncoderCNT.PNG
TIM4的配置如下:
  1. /*
  2.   ** TIM4 Clock Enable
  3.   */
  4.   __HAL_RCC_TIM4_CLK_ENABLE();
  5.   SET_BIT(RCC->AHB1ENR, RCC_APB1ENR_TIM4EN);
  6.   /*
  7.   ** TIM4 port clock Enable
  8.   */
  9.   __HAL_RCC_GPIOB_CLK_ENABLE();
  10.   /*
  11.   ** TIM4 input IO initialization
  12.   */
  13.   GPIOB_EncoderInit.Pin       = GPIO_PIN_6 | GPIO_PIN_7;
  14.   GPIOB_EncoderInit.Mode      = GPIO_MODE_INPUT;
  15.   GPIOB_EncoderInit.Alternate = GPIO_AF2_TIM4;
  16.   HAL_GPIO_Init(GPIOB, &GPIOB_EncoderInit);
  17.   GPIOB->AFR[0] = 0x22000010;
  18.   /*
  19.   ** TIM4 clock initialization
  20.   */
  21.   TIM4_Handler.Instance                = TIM4;
  22.   TIM4_Handler.Init.Prescaler          = 0;
  23.   TIM4_Handler.Init.CounterMode        = TIM_COUNTERMODE_UP;
  24.   TIM4_Handler.Init.Period             = 19999;
  25.   TIM4_Handler.Init.ClockDivision      = TIM_CLOCKDIVISION_DIV1;
  26.   HAL_TIM_Base_Init(&TIM4_Handler);
  27.   
  28.   /*
  29.   ** TIM1 channel initialization
  30.   */
  31.   TIM4_CH_Handler.EncoderMode  = TIM_ENCODERMODE_TI12;
  32.   TIM4_CH_Handler.IC1Polarity  = TIM_ICPOLARITY_RISING;
  33.   TIM4_CH_Handler.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  34.   TIM4_CH_Handler.IC2Polarity  = TIM_ICPOLARITY_RISING;
  35.   TIM4_CH_Handler.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  36.   HAL_TIM_Encoder_Init(&TIM4_Handler, &TIM4_CH_Handler);
  37.   /*
  38.   ** Clear Intc flag
  39.   */
  40.   __HAL_TIM_CLEAR_FLAG(&TIM4_Handler, TIM_SR_UIF);
  41.   /*
  42.   ** ENABLE Encoder Input
  43.   */
  44.   /*
  45.   ** ENABLE TIM1
  46.   */
  47.   TIM4->CNT = 19999;
  48.   HAL_TIM_Base_Start_IT(&TIM4_Handler);
  49.   HAL_TIM_Encoder_Start(&TIM4_Handler, TIM_CHANNEL_ALL);
复制代码

最佳答案

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

这个问题解决了,只配置GPIOB_EncoderInit.Alternate为GPIO_AF2_TIM4是没有用的,仍然需要配置GPIO的mode为复用模式,我是找了好久的手册才看到还有这个坑,因为HAL库没有淡村的复用模式供选择,所以就直接操作寄存器了,加上这行代码就OK了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-9-23
在线时间
4 小时
 楼主| 发表于 2020-9-23 14:54:53 | 显示全部楼层
这个问题解决了,只配置GPIOB_EncoderInit.Alternate为GPIO_AF2_TIM4是没有用的,仍然需要配置GPIO的mode为复用模式,我是找了好久的手册才看到还有这个坑,因为HAL库没有淡村的复用模式供选择,所以就直接操作寄存器了,加上这行代码就OK了
  1. GPIOB->MODER                       = 0xA288;
复制代码
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-9-23
在线时间
4 小时
 楼主| 发表于 2020-9-23 15:14:53 | 显示全部楼层
还有一个神奇的现象,用HAL_GPIO_Init函数配置PB6和PB7复用为TIM4的CH1和CH2,GPIO的复用功能寄存器没有变化。
只能直接操作寄存器,但是根据目前的测试结果来看,我觉得GPIO口和TIM4之间仍然没有建立连接
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2020-9-24 01:45:15 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-5-3
在线时间
4 小时
发表于 2020-9-26 12:51:12 | 显示全部楼层
我用的是STM32F429IET6的TIM5的通道1和通道2来读编码器数据,引脚是PH10和PH11,代码是从STM32F407IGT6那边移植过来的,一摸一样的配置,为啥STM32F407IGT6读得到,STM32F429IET6就读不到?STM32F407IGT6的寄存器TIM5->CNT毛变化都没有。而TIM2的通道1和通道2,引脚是PA15和PB3,这两个CPU都能读到编码器计数值。
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2022-7-22
在线时间
2 小时
发表于 2022-7-22 09:47:52 | 显示全部楼层
配置成了复用但还是读不出来
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2022-7-22 10:02:14 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 12:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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