OpenEdv-开源电子网

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

F1板子(mini或精英)TIM2编码器模式(重映射)无法计数

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-8-17
在线时间
17 小时
发表于 2018-4-9 12:33:37 | 显示全部楼层 |阅读模式
10金钱
附配置代码:
void Encoder_Init_TIM2(void)
{
//        GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);
//        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
        RCC->APB2ENR|=1<<0;    //开启辅助时钟
        AFIO->MAPR|=(0x01)<<8;      //01部分重映射
        RCC->APB1ENR|=1<<0;     //TIM2时钟使能
        RCC->APB2ENR|=1<<2;    //使能PORTA时钟
        RCC->APB2ENR|=1<<3;    //使能PORTB时钟
       
        GPIOA->CRH&=0X0FFFFFFF;//PA15
        GPIOA->CRH|=0X40000000;//浮空输入       
        GPIOB->CRL&=0XFFFF0FFF;//PB3
        GPIOB->CRL|=0X00004000;//浮空输入
       
        TIM2->DIER|=1<<0;   //允许更新中断                               
        TIM2->DIER|=1<<6;   //允许触发中断
        MY_NVIC_Init(1,3,TIM2_IRQn,1);
       
        TIM2->PSC = 0x0;//预分频器
        TIM2->ARR = ENCODER_TIM_PERIOD;//设定计数器自动重装值
        TIM2->CR1 &=~(3<<8);// 选择时钟分频:不分频
        TIM2->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式               
        TIM2->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
        TIM2->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2
        TIM2->CCER &= ~(1<<1);         //CC1P='0'         IC1FP1不反相,IC1FP1=TI1
        TIM2->CCER &= ~(1<<5);         //CC2P='0'         IC2FP2不反相,IC2FP2=TI2
        TIM2->CCMR1 |= 3<<4; //        IC1F='1000' 输入捕获1滤波器
        TIM2->SMCR |= 3<<0;         //SMS='011' 所有的输入均在上升沿和下降沿有效
        TIM2->CR1 |= 0x01;    //CEN=1,使能定时器
}

最佳答案

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

看了下tim2 编码器模式用的通道1 2 重映射是PA15--JTDI PB3--JTDO你试试关闭jtag看看 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //1、打开复用时钟: GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//2、关闭jtag 开启sw
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-4-9 12:33:38 | 显示全部楼层
看了下tim2 编码器模式用的通道1 2 重映射是PA15--JTDI PB3--JTDO你试试关闭jtag看看
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //1、打开复用时钟:
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//2、关闭jtag 开启sw


回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-8-17
在线时间
17 小时
 楼主| 发表于 2018-4-10 10:06:05 | 显示全部楼层
275891381 发表于 2018-4-9 23:52
看了下tim2 编码器模式用的通道1 2 重映射是PA15--JTDI PB3--JTDO你试试关闭jtag看看
    RCC_APB2PeriphC ...

禁止JTAG功能,把PB3,PB4作为普通IO口使用后,在32核心板上实验成功了,但是在mini或精英开发板上仍然无法使用!
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-8-17
在线时间
17 小时
 楼主| 发表于 2018-4-10 10:11:42 | 显示全部楼层
附ZET6核心板调试成功程序:
1、库函数板:
void Encoder_Init_TIM2(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
        TIM_ICInitTypeDef TIM_ICInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        GPIO_AFIODeInit();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
       
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //禁止JTAG功能,把PB3,PB4作为普通IO口使用  
       
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;        //端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                //根据设定参数初始化GPIOA

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;        //端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //浮空输入
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                //根据设定参数初始化GPIOB

        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器
        TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;////TIM向上计数  
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

        TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge);

        TIM_ICStructInit(&TIM_ICInitStructure);
        TIM_ICInitStructure.TIM_ICFilter = 10;
        TIM_ICInit(TIM2, &TIM_ICInitStructure);//根据TIM_ICInitStruct中指定的参数初始化外设TIM
        TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新标志位
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //使能或者失能指定的TIM中断

        TIM_SetCounter(TIM2,0);
        TIM_Cmd(TIM2, ENABLE);   //使能或者失能TIMx外设
}
2、寄存器板:
void Encoder_Init_TIM2(void)
{

        GPIO_AFIODeInit();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
       
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //禁止JTAG功能,把PB3,PB4作为普通IO口使用  
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);       
       
//        RCC->APB2ENR|=1<<0;    //开启辅助时钟
//        AFIO->MAPR|=(0x01)<<8;      //01部分重映射
//        RCC->APB1ENR|=1<<0;     //TIM2时钟使能
//        RCC->APB2ENR|=1<<2;    //使能PORTA时钟
//        RCC->APB2ENR|=1<<3;    //使能PORTB时钟
       
        GPIOA->CRH&=0X0FFFFFFF;//PA15
        GPIOA->CRH|=0X40000000;//浮空输入       
        GPIOB->CRL&=0XFFFF0FFF;//PB3
        GPIOB->CRL|=0X00004000;//浮空输入
       
//        TIM2->DIER|=1<<0;   //允许更新中断                               
//        TIM2->DIER|=1<<6;   //允许触发中断
//        MY_NVIC_Init(1,3,TIM2_IRQn,1);
       
        TIM2->PSC = 0x0;//预分频器
        TIM2->ARR = ENCODER_TIM_PERIOD;//设定计数器自动重装值
        TIM2->CR1 &=~(3<<8);// 选择时钟分频:不分频
        TIM2->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式               
        TIM2->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
        TIM2->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2
        TIM2->CCER &= ~(1<<1);         //CC1P='0'         IC1FP1不反相,IC1FP1=TI1
        TIM2->CCER &= ~(1<<5);         //CC2P='0'         IC2FP2不反相,IC2FP2=TI2
        TIM2->CCMR1 |= 3<<4; //        IC1F='1000' 输入捕获1滤波器
        TIM2->SMCR |= 3<<0;         //SMS='011' 所有的输入均在上升沿和下降沿有效
        TIM2->CNT = 0;
        TIM2->CR1 |= 0x01;    //CEN=1,使能定时器
}




回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2014-11-27
在线时间
23 小时
发表于 2018-4-19 10:36:38 | 显示全部楼层
103VCT6应用TIM2编码器模式,重映射到A15,B3,无法计数
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-8-17
在线时间
17 小时
 楼主| 发表于 2018-4-21 12:16:54 | 显示全部楼层
碧霄长博 发表于 2018-4-19 10:36
103VCT6应用TIM2编码器模式,重映射到A15,B3,无法计数

你用的是不是核心板,开发板的话可能又其他模块干扰(比如精英板、mini)另外关闭JTAG 调试模式。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 04:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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