[STM32F0] STM32F030K6的PB4(TIM3-CH1)无法输出PWM波形,一直是低电平

[复制链接]
5070|18
 楼主| hopewise 发表于 2014-11-26 11:08 | 显示全部楼层 |阅读模式
原先PB4脚在TIM3定时中断里翻转,可以测出1K的方波,现改用PWM功能,一直无法输出PWM波形
      RCC->AHBENR|=1<<18;            //使能PORTB时钟       
       
      GPIOB->MODER   = 0X55551655;   //PB4复用功能输出        
      GPIOB->OTYPER  = 0X00000000;   //推挽输出
      GPIOB->OSPEEDR = 0X00000000;   //低速
      GPIOB->PUPDR   = 0X00004000;
       
      RCC->APB1ENR|=1<<1;              //TIM3时钟使能
      TIM3->PSC=47;                     //预分频器48分频
      TIM3->ARR=1000;                     //设置频率
      TIM3->CCR1 =500;               //设置占空比   
      TIM3->EGR |= 1;                //产生一次更新事件  
      TIM3->CCMR1|=7<<4;               //CH1 PWM2模式               
      TIM3->CCMR1|=1<<3;                //CH1预装载使能                       
      TIM3->CCER|=1<<0;                //OC1输出使能          
      TIM3->CR1=0x0080;                //ARPE使能
      TIM3->CR1|=0x01;                 //使能定时器3
 楼主| hopewise 发表于 2014-11-26 11:09 | 显示全部楼层
PCLK=HCLK=48MHZ
mmuuss586 发表于 2014-11-26 12:33 | 显示全部楼层
好像没设计数模式;

程序最好改成库函数模式吧,调好后再改成寄存器的;
寄存器的看起来累;
 楼主| hopewise 发表于 2014-11-26 13:57 | 显示全部楼层
mmuuss586:TIM3定时功能没问题,现设置成PWM模式(CH1通道输出PWM),没反应
小班儿 发表于 2014-11-26 14:24 | 显示全部楼层
    TIM_OCInitTypeDef  TIM_OCInitStructure;//定义结构体
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定义结构体
    /* 打开定时器3外设时钟 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
                          
                /* 定时器3基本定时器设置 */
                /* 定时器从0计数到255为一个定时周期 */
    TIM_TimeBaseStructure.TIM_Period = 255;
       
                /* 设置预分频 2000 分频 */
    TIM_TimeBaseStructure.TIM_Prescaler = 1999;
       
                /* 设置时钟分频系数,此处未分频 */
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
       
                /* 向上计数模式 */
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
       
                /* 基本定时器初始化 */
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
   
               
    /* 定时器3PWM设置   PWM1 模式 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
               
                /* 使能输出 */
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
               
                /* 设置初始 PWM 脉冲宽度为 0 */
    TIM_OCInitStructure.TIM_Pulse = 0;
               
                /* 当定时器计数值小于 TIM_Pulse 时为低电平 */
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
               
                /* TIM3的CH1初始化 */
    TIM_OC3Init(TIM3, &TIM_OCInitStructure);
               
                /* 使能的预装载寄存器 */
    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
               
    /* 使能 TIM3 重载寄存器 ARR */
    TIM_ARRPreloadConfig(TIM3, ENABLE);
               
    /* 使能定时器3 */
    TIM_Cmd(TIM3, ENABLE);
               
                /* 使能定时器3的 update中断 */
    TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);
小班儿 发表于 2014-11-26 14:25 | 显示全部楼层
定时器的基本功能没有设置,PWM模式也没有设置。最好用库函数的形式来写程序,易懂,好移植!
小班儿 发表于 2014-11-26 14:26 | 显示全部楼层
/* 设置初始 PWM 脉冲宽度为 0 */
    TIM_OCInitStructure.TIM_Pulse = 0;
小班儿 发表于 2014-11-26 14:27 | 显示全部楼层
/* 设置初始 PWM 脉冲宽度为 0 */
    TIM_OCInitStructure.TIM_Pulse = 0;

这个占空比需要你自己设置,我这个是有别的用处!
 楼主| hopewise 发表于 2014-11-26 15:22 | 显示全部楼层
1.小班儿,我的这个子函数是抄原子的,也网上找一些,几乎是同一样的。
2 定时器的基本功能没有设置,PWM模式也没有设置-----这是PWM功能-----可从TIM3->CCMR1|=7<<4;这条指令看出是PWM模式,从通道1(即PB4/TIM3-CH1)输出PWM波形.
3.TIM3的定时功能是正确的,我已在定时中断函数里翻转PB4脚,测出的波形正确.
mmuuss586 发表于 2014-11-26 20:54 | 显示全部楼层
hopewise 发表于 2014-11-26 15:22
1.小班儿,我的这个子函数是抄原子的,也网上找一些,几乎是同一样的。
2 定时器的基本功能没有设置,PWM模 ...

那就用库函数先试下吧;
没必要抄原子的;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

468

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部