OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4356|回复: 6

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

[复制链接]

4

主题

6

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-4-7
在线时间
11 小时
发表于 2019-4-12 08:52:31 | 显示全部楼层 |阅读模式
5金钱
就是我在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();
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14407
金钱
14407
注册时间
2018-8-3
在线时间
1156 小时
发表于 2019-4-12 09:18:56 | 显示全部楼层
灯没有呼吸灯的效果吗?你主函数怎么写的
回复

使用道具 举报

4

主题

6

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-4-7
在线时间
11 小时
 楼主| 发表于 2019-4-12 09:38:04 | 显示全部楼层
翼行园子 发表于 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);
                }
                       
        }

}

回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-6-26
在线时间
8 小时
发表于 2019-7-17 10:55:50 | 显示全部楼层
请问楼主解决了吗?我现在也遇到了这样的问题
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2020-3-5
在线时间
1 小时
发表于 2020-4-26 09:50:09 | 显示全部楼层
请问楼主解决了吗?我现在也遇到了这样的问题
回复

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2020-4-27 21:06:20 | 显示全部楼层
我之前也遇到点问题,如果不加   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//反向通道失效    这条会出现花屏
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//反向通道失效
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:低
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-9-21
在线时间
6 小时
发表于 2020-10-4 13:03:41 | 显示全部楼层
同样遇到过这个问题,这个好像是这个函数OLED_Clear();和pwm冲突,但是具体为什么就不知道了,一句一句查的,查了一天
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 03:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表