OpenEdv-开源电子网

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

STM32F407定时器编码器模式下,不进入中断

[复制链接]

19

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2019-10-17
在线时间
42 小时
发表于 2019-10-31 11:09:20 | 显示全部楼层 |阅读模式
1金钱
编码器配置的代码如下
void Encode_Init(void)
{
        GPIO_InitTypeDef         GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;
        TIM_ICInitTypeDef        TIM_ICInitStructure;
         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能GPIOD时钟


                GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);
                GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化

       
        TIM_TimeBaseInitStructure.TIM_Period = 65535;         //自动重装载值
        TIM_TimeBaseInitStructure.TIM_Prescaler=0;  //定时器分频
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInitStructure.TIM_ClockDivision=0; //设置时钟分割:TDTS=Tck_tim
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);//初始化TIM4
       
       
       
                TIM_EncoderInterfaceConfig(TIM4,TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
                TIM_ICStructInit(&TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_ICFilter = 0;  //输入滤波器
    TIM_ICInit(TIM4, &TIM_ICInitStructure);
    TIM_ClearFlag(TIM4, TIM_FLAG_Update);  //清楚所有标志位
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //允许中断更新
    TIM4->CNT = 0;
               
    TIM_Cmd(TIM4, ENABLE);  //使能TIM4
}

//定时器3中断服务函数
void TIM4_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) //溢出中断
        {
                printf("kkkkkkkkk");
        }
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  //清除中断标志位
}



目前的问题就是用了编码器AB端连接到PE12/13口后,没有进入中断,编码器按钮旋转了没有任何反应,求大佬指导为啥???是配置错误了么。。。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-11-1 02:11:34 | 显示全部楼层
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-11-1 08:59:00 | 显示全部楼层
也没看到你配置中断啊,可以参考一下这个代码,测试可以进入中断

  1.         GPIO_InitTypeDef GPIO_InitStructure;
  2.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;       
  3.         TIM_ICInitTypeDef TIM_ICInitStructure;
  4.         NVIC_InitTypeDef NVIC_InitStructure;
  5.        
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能TIM4时钟       
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  8.         GPIO_StructInit(&GPIO_InitStructure);//将GPIO_InitStruct中的参数按缺省值输入
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;       
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  11. //        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  12. //        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//GPIO_PuPd_UP;//GPIO_PuPd_NOPULL
  13.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  15.         TIM_TimeBaseInitStructure.TIM_Period = 20-1;//20;         //自动重装载值
  16.         TIM_TimeBaseInitStructure.TIM_Prescaler=0;  //定时器分频
  17.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  18.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  19.        
  20.         TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);//初始化TIM1
  21.        
  22.         TIM_EncoderInterfaceConfig(TIM4,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);        //TIM_EncoderMode_TI12 表示TI1 TI2边沿处均计数
  23.        
  24.         TIM_ICStructInit(&TIM_ICInitStructure);
  25.        
  26.         TIM_ICInitStructure.TIM_Channel = TIM_Channel_1 ;       
  27.         TIM_ICInitStructure.TIM_ICFilter = 0; //最大为15
  28.         TIM_ICInit(TIM4, &TIM_ICInitStructure);
  29.        
  30.         TIM_ICInitStructure.TIM_Channel = TIM_Channel_2 ;       
  31.         TIM_ICInitStructure.TIM_ICFilter = 0;
  32.         TIM_ICInit(TIM4, &TIM_ICInitStructure);

  33.         //溢出中断设置
  34.         TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //允许TIM2溢出中断
  35.         NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
  36.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;
  37.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01;
  38.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  39.         NVIC_Init(&NVIC_InitStructure);

  40.         TIM_SetCounter(TIM4,0);//应该不能为0
  41.        
  42.         TIM_Cmd(TIM4,ENABLE);
复制代码
茵茵猪头
回复

使用道具 举报

19

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2019-10-17
在线时间
42 小时
 楼主| 发表于 2019-11-1 17:31:50 | 显示全部楼层
htao 发表于 2019-11-1 08:59
也没看到你配置中断啊,可以参考一下这个代码,测试可以进入中断

谢谢帮助
回复

使用道具 举报

19

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2019-10-17
在线时间
42 小时
 楼主| 发表于 2019-11-4 09:28:39 | 显示全部楼层

周末测试了,发现还是不行,其他帖子设置编码器的时候好像也没有配置NVIC,不知道是不是可以不用配置。我是用f407的,会不会f1和f4有点不一样??
回复

使用道具 举报

19

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2019-10-17
在线时间
42 小时
 楼主| 发表于 2019-11-4 09:29:38 | 显示全部楼层
htao 发表于 2019-11-1 08:59
也没看到你配置中断啊,可以参考一下这个代码,测试可以进入中断

周末测试了,发现还是不行,其他帖子设置编码器的时候好像也没有配置NVIC,不知道是不是可以不用配置。我是用f407的,会不会f1和f4有点不一样??
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-11-4 10:00:29 | 显示全部楼层
Blokeke 发表于 2019-11-4 09:29
周末测试了,发现还是不行,其他帖子设置编码器的时候好像也没有配置NVIC,不知道是不是可以不用配置。我 ...

记录溢出次数需要,不记录不需要,这不配置你使能溢出中断干嘛
你又用中断又不配置肯定不行
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-11-4 10:28:57 | 显示全部楼层
这是407的,可以参考下,测试过可以进入

STM32-编码器-2019.1.8.rar

4.27 MB, 下载次数: 593

茵茵猪头
回复

使用道具 举报

19

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2019-10-17
在线时间
42 小时
 楼主| 发表于 2019-11-4 11:16:23 | 显示全部楼层
htao 发表于 2019-11-4 10:28
这是407的,可以参考下,测试过可以进入

被大佬的回答热情感动哭了,先不说代码行不行,您很行!!!感谢大佬
回复

使用道具 举报

19

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2019-10-17
在线时间
42 小时
 楼主| 发表于 2019-11-4 13:48:38 | 显示全部楼层
htao 发表于 2019-11-4 10:28
这是407的,可以参考下,测试过可以进入

我用的是编码器按键,现在这个程序直接一直进入中断,qui大佬指教怎么改才行。
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-11-4 13:57:26 | 显示全部楼层
Blokeke 发表于 2019-11-4 13:48
我用的是编码器按键,现在这个程序直接一直进入中断,qui大佬指教怎么改才行。

编码器按键是啥意思?

我发的程序对应的是正交编码器的计数,可以参考一下这个网站 https://blog.csdn.net/oxiaoxue123456789/article/details/80762211

你是啥要求或者要实现啥功能
茵茵猪头
回复

使用道具 举报

19

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2019-10-17
在线时间
42 小时
 楼主| 发表于 2019-11-4 16:29:56 | 显示全部楼层
htao 发表于 2019-11-4 13:57
编码器按键是啥意思?

我发的程序对应的是正交编码器的计数,可以参考一下这个网站 https://blog.csdn ...

就是一种类似滑动电位器一样的旋钮,原理就是编码器一样的利用相位差实习计数和判断方向。开始我是利用外部中断对编码器旋钮的其中一端(a端或者b端进行脉冲触发,进入中断,完成一次旋转旋钮操作),现在想利用编码器模式重新实现功能,减少旋钮产生的电压毛刺等的影响。
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-2-5
在线时间
17 小时
发表于 2021-1-11 22:43:20 | 显示全部楼层
TIM_TimeBaseInitStructure.TIM_Period = 65535;         //自动重装载值
1、先需要配置好中断
2、设小点试试,你设这么大,那得放肆转编码器才行,溢出中断呀,转半天能进一次
回复

使用道具 举报

4

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2019-7-28
在线时间
61 小时
发表于 2021-3-21 22:15:29 | 显示全部楼层
因为编码器的CNT没有大于0XFFFFFFFF,所以没有产生中断。
而你的处理除了中断,可以可以在主程序中(例如没秒)测试读取以下编码器的数值,
以便直到编码器是有效的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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