一、出现的问题
最近用到了管脚映射,用r8t6的片子,用TIM3生成pwm波时候,用的映射管脚PC7、PC8
//1.使能重映射后的GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能GPIO外设时钟使能
//2.使能功能外设时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//
//3.使能AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//4.开启重映射
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
因为要对这个pwm波产生的波形要时时更新,所以我就犯了个个错误。在生成PWM波的时候正在用TIM3,正在用的时候进行一个映射会有问题的,会导致令人费劲的问题。
比如说需要测这个管脚1000个脉冲,实际上测出的只有889,这就是时时更新PWM用TIM3和映射之间的冲突问题。
二、解决方法
经过在网上一顿乱查。
发现是否其他地方使用了TIM3,导致重映射功能没有正确开启?
试验:屏蔽其他程序,在重映射之前添加一行程序
TIM_DeInit(TIM3);
好意外啊!问题解决了。
可是出现新的问题了,生成的PWM波异常了。屏蔽TIM3的那一瞬间,虽然说可以重映射了,但是TIM3正在用来生成PWM,当然把它屏蔽了就异常了。
那怎样解决呢?
加上一个开锁,关锁功能,PWM波输出稳定的时候,咱们就不初始化了,那就进行一次映射就好了,只有在PWM波输出变化的时候才进行管脚重映射设置
if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次周期值
{
buf[0]++;
temp = Full_num;
temp*=65536; //溢出时间总和
temp+=TIM2CH1_CAPTURE_VAL; //得到总的高电平时间
if(buf[0]==1)
{
buf[1] = temp; //第一次捕获的周期值
}else
{
buf[2] = temp; //第二次捕获的周期值
buf[0] = buf[2]-buf[1]; //计算两次捕获周期的差值
buf[0] = buf[0]*buf[0];
//开锁,输入周期变化后要改变输出,进行初始化
if(buf[0]>5)
{
t=0;
}
//进行了一个简单地滤波
if(buf[0]<5 && t!=1)
{
ARR = (72*0.997*(temp+3)/3-1)/2;
TIM3_PWM_Init(ARR,0); //PWM波输出初始化
TIM_SetCompare2(TIM3,ARR*3/4); //pc7管脚,生成A相波,被用作检测下降沿生成1000个脉冲
TIM_SetCompare3(TIM3,ARR/4); //pc8管脚,生成B相波
}
//关锁,输入周期稳定不变后,不再进行PWM_Init初始化
if(buf[0]<5)
{
t=1;
}
buf[0] = 0;
}
//开启下一次捕获
TIM2CH1_CAPTURE_STA=0;
}
可能也有些小bug,但是总归来说,可以用了。