看过了好多原子哥的例程,查了好久还是查不出原因,我接上电机编码器到PA15(TIM2 CH1)和PB3
(TIM2 CH2),转电机有反应,TIM2->CNT的值只在0和ARR这两个值变化。复用这些问题都考虑过了。
下图是我在转电机时,TIM2定时器的变化,最左栏代表TIM2->CNT,(arr设置的是0X270F),第二栏代表TIM2->CR1,第三栏代表TIM2->SR。
下面是我的初始化函数
void Timer2_Init()//PA15 PB3 两相编码器输入
{ RCC->APB1ENR|=1<<0; //TIM2时钟使能,左轮
RCC->APB2ENR|=1<<3; //GPIOB端口时钟
RCC->APB2ENR|=1<<2; //GPIOA端口时钟
RCC->APB2ENR|=1<<0;
AFIO->MAPR&=0XF8FFFFFF;
AFIO->MAPR|=0X04000000; //关闭PA15 JTAG功能
AFIO->MAPR&=0XFFFFFCFF;
AFIO->MAPR|=0X00000100;//PA15 和PB3 复用为TIM2
GPIOA->CRH&=0x0FFFFFFF;
GPIOA->CRH|=0X8000000;
GPIOB->CRL&=0xFFFF0FFF;
GPIOB->CRL|=0X00008000;//GPIO初始化
TIM2->CCER|=1<<1; //反相
TIM2->CCMR1&=0X0000;
TIM2->CCMR1|=1<<8;//CH1对应TI1
TIM2->CCMR1|=1<<0;//CH2对应TI2
TIM2->SMCR&=0xFFF8;
TIM2->SMCR|=0x0003;//CH1与CH2同时计数
TIM2->CR1&=0x0000;
TIM2->CR1|=0x01; //使能定时器2
}
---------------------------------
奋战了一整天,逐个排查原因,终于解决问题了。问题还是端口复用的事。
但是令人疑惑的是,以下方法1(库函数)和方法2(寄存器),只有方法1能行,方法二就出不来结果,具体原因也不愿意去查了,反正应该是有某个资料有重大错误,我写寄存器全是按照手册来的。
方法1:【能行】
RCC->APB2ENR|=1<<0;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);
AFIO->MAPR&=0XF8FFFFFF;
AFIO->MAPR|=0X04000000;
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2 ,ENABLE);
方法2:【不能行,TIM2->CNT无变化】
RCC->APB2ENR|=1<<0;
AFIO->MAPR&=0XF8FFFFFF;
AFIO->MAPR|=0X04000000; //关闭PA15 JTAG功能
AFIO->MAPR&=0XFFFFFCFF;
AFIO->MAPR|=0X00000100;//PA15 和PB3 复用为TIM2
之前感觉寄存器设置文件体积比库函数小巧,就一直用寄存器,想想还是库函数靠谱。
哎,为了这个问题白白浪费了一整天的时间。终于可以睡觉了。
TIM2->SC=0;
这些也设置了,上面没复制出来
一周热门 更多>