stm32管脚映射问题

一、出现的问题

最近用到了管脚映射,用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,但是总归来说,可以用了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值