关于PWM与OLED之间冲突的问题

2019-07-20 22:23发布

就是我在miniSTM32开发板上,将PWM的频率和时间以及大小显示在OLED屏上面,但是当我的PWM功能实现之后,再加入OLED的程序进主函数的时候,发现PWM的功能不正常了。OLED显示正常,但是PWM就不能使用了。想请问各位大神是不是冲突了。是两者的时间冲突吗?还是什么原因?
(1)PWM用的是:
void TIM1_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
                                                                                    

   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

       
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

    TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能       

        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
       
        TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
       
        TIM_Cmd(TIM1, ENABLE);  //使能TIM1
}



(2)OLED用的是:
void OLED_Init(void)
{                                                                                                
        GPIO_InitTypeDef  GPIO_InitStructure;
            
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE );
                  
#if OLED_MODE==1       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);        //使能AFIO时钟
       
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);        //JTAG-DP 失能 + SW-DP使能

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                                             
        GPIO_Write(GPIOB,0XFFFF);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_SetBits(GPIOC, GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);//如果每一位决定一个GPIO_Pin,则可以通过或的形式来初始化多个IO

#else
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD ;                  //推挽输出       
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                             
        GPIO_Write(GPIOB,0X03);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_SetBits(GPIOC, GPIO_Pin_8|GPIO_Pin_9);
#endif                                                                  
                  
        OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
        OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
        OLED_WR_Byte(80,OLED_CMD);   //[3:0],分频因子;[7:4],震荡频率
        OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
        OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64)
        OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
        OLED_WR_Byte(0X00,OLED_CMD); //默认为0

        OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
                                                                                                            
        OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
        OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
        OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
        OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
        OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
        OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
        OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
        OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
                 
        OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
        OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
        OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
        OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
        OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
        OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;

        OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
        OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示                                                              
        OLED_WR_Byte(0xAF,OLED_CMD); //开启显示         
        OLED_Clear();
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
JasonBread
2019-07-21 05:09
翼行园子 发表于 2019-4-12 09:18
灯没有呼吸灯的效果吗?你主函数怎么写的

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"
#include "key.h"
#include "oled.h"



int main(void)
{       
        int count=0;
        int n=0;
        int j=0;
        u8 t=0;
         
        u16 arr=500;
         
        KEY_Init();
        delay_init();            //延时函数初始化          
        LED_Init();                          //初始化与LED连接的硬件接口

        OLED_Init();        //初始化OLED

         
        OLED_ShowString(0,0,"Time:",16);  
        OLED_ShowString(0,16, "Frequency:",16);  
        OLED_ShowString(0,32,"Size:",16);
        OLED_ShowString(60,0,"s",16);  
        OLED_ShowString(110,16, "Hz",16);   
        OLED_Refresh_Gram();//更新显示到OLED         

           while(1)
        {
               
                t=KEY_Scan(0);
                switch(t)
                {
                        case KEY0_PRES:  //KEY0按键控制灯变亮
                                 count+=10;
                                 if(count>100) count=0;
                        break;
                       
                        case KEY1_PRES: //KEY1按键控制灯变频
                                 arr-=50;
                                 if(arr<100) arr=500;
                        break;
                       
                        case WKUP_PRES: //WK_UP按键控制灯持续的时间
                                 j+=1;
                                 if(j>9) j=0;
                        break;
                       
                        case KEY2_PRES: //KEY2按键控制开关
                                 TIM1_PWM_Init(arr,720-1);
                                 TIM_SetCompare1(TIM1,count);
                                 switch(j)
                                 {
                                         case 0:
                                                 for(n=0;n<5;n++) delay_ms(1000);
                                         break;
                                         
                                         case 1:
                                                 for(n=0;n<10;n++) delay_ms(1000);
                                         break;
                                         
                                         case 2:
                                                 for(n=0;n<15;n++) delay_ms(1000);
                                         break;
                                         
                                         case 3:
                                                 for(n=0;n<20;n++) delay_ms(1000);
                                         break;
                                         
                                         case 4:
                                                 for(n=0;n<25;n++) delay_ms(1000);
                                         break;
                                         
                                         case 5:
                                                 for(n=0;n<30;n++) delay_ms(1000);
                                         break;
                                         
                                         case 6:
                                                 for(n=0;n<35;n++) delay_ms(1000);
                                         break;
                                         
                                         case 7:
                                                 for(n=0;n<40;n++) delay_ms(1000);
                                         break;
                                         
                                         case 8:
                                                 for(n=0;n<45;n++) delay_ms(1000);
                                         break;
                                         
                                         case 9:
                                                 for(n=0;n<50;n++) delay_ms(1000);
                                         break;
                                         
                                         default: delay_ms(10);
                                 }
                                 LED1=0;
                                 TIM_Cmd(TIM1, DISABLE);//关闭PWM
                                 TIM_ForcedOC1Config(TIM1, TIM_ForcedAction_InActive);
                                 
                        break;
                       
                        default: delay_ms(10);
                }
                       
        }

}

一周热门 更多>