• 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,但是总归来说,可以用了。

  • 相关阅读:
    prometheus 监控mysql数据库
    Allegro如何使用快捷键快速切换走线线宽操作指导
    Linux之父一语成谶:Valve拯救桌面版Linux,但新版本仍在分裂其生态
    字节跳动Dev Better技术沙龙来啦!参与活动赢好礼,限时免费报名中!
    Spring Boot发送QQ邮件
    neo4j 删除从一个node开始的所有数据。
    小程序day02
    有人会吗,做一下可以吗
    51单片机-LED实验
    webpack优化篇(四十八):使用 Tree Shaking 擦除无用的 JavaScript 和 CSS
  • 原文地址:https://blog.csdn.net/m0_46171719/article/details/126459278