[STM32F1] TIM1的PWM输出时有时没有

[复制链接]
 楼主| yszong 发表于 2021-8-14 12:09 | 显示全部楼层 |阅读模式
使用的是STM32F103C8T6,使用的TIM1的PWM输出,还有TIM3的PWM输出,程序下载完后,TIM1的pwm一直没有输出,tim3的pwm一直有输出
zhaoxqi 发表于 2021-8-14 12:12 | 显示全部楼层

什么意思?不是很明白你说的什么,能再解释一下这个现象吗
zhanghqi 发表于 2021-8-14 12:14 | 显示全部楼层
需要在主函数里面先初始化tim1再初始化tim3
 楼主| yszong 发表于 2021-8-14 12:16 | 显示全部楼层
试了,tim1有了pwm输出,但是重新上电后tim1又没有PWM输出了
 楼主| yszong 发表于 2021-8-14 12:18 | 显示全部楼层
又重新烧写tim1又可以输出PWM了,但是重新上电依然没有
wangzsa 发表于 2021-8-14 12:20 | 显示全部楼层

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| yszong 发表于 2021-8-14 12:22 | 显示全部楼层

void TIM3_Configuration(void)    //PWM2 ch2     PWM3 ch3
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
                        TIM_OCInitTypeDef  TIM_OCInitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
    TIM_TimeBaseStructure.TIM_Period=99;
    TIM_TimeBaseStructure.TIM_Prescaler= 22;
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);        

  /* PWM1 Mode configuration: Channel2 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;           
        //TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse  = 20;        
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);        
  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);        

  /* PWM1 Mode configuration: Channel2 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;         
        //TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse  = 20;        
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);         
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);        
        
  TIM_ARRPreloadConfig(TIM3, ENABLE);      

  TIM_Cmd(TIM3, ENABLE);                                                                  
}

void Timer_init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);


  /* Time base configuration */                 
  TIM_TimeBaseStructure.TIM_Period = 99;   
  TIM_TimeBaseStructure.TIM_Prescaler = 22;//3089;         
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel2 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;        
        //TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        
  TIM_OCInitStructure.TIM_Pulse  = 20;         
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);        
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);        

  /* PWM1 Mode configuration: Channel2 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            
        //TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse  = 20;         
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OC3Init(TIM1, &TIM_OCInitStructure);        
  TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);      

  TIM_ARRPreloadConfig(TIM1, ENABLE);      

  TIM_Cmd(TIM1, ENABLE);                  
  TIM_CtrlPWMOutputs(TIM1, ENABLE);  
}

void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        
         
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;         
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
        
        
    NVIC_InitStructure.NVIC_IRQChannel =  TIM1_UP_IRQn;         
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
        
        /*CAN--USB_LP_CAN1_RX0_IRQn*/
        NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;                 //ÏÈÕ¼ÓÅÏȼ¶0,´ÓÓÅÏȼ¶0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);        
        
        /*USART2*/
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;                 //ÏÈÕ¼ÓÅÏȼ¶0,´ÓÓÅÏȼ¶1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);                                          
                                                                  
}
renyaq 发表于 2021-8-14 12:24 | 显示全部楼层
不管是初始化1还是3都可以的;
没有先后的说法;
huangchui 发表于 2021-8-14 12:26 | 显示全部楼层
程序仿真下看看呗:监控相应的定时器寄存器有没有使能;
 楼主| yszong 发表于 2021-8-14 12:28 | 显示全部楼层
监控了是没问题了,但是没有输出
 楼主| yszong 发表于 2021-8-14 12:30 | 显示全部楼层
supernan 发表于 2021-8-14 12:39 | 显示全部楼层
ST官方例程关于定时器PWM输出的很多,也很完整。你参考下。
jiahy 发表于 2021-8-14 12:40 | 显示全部楼层
调试时,注意不用因为手动操作寄存器而忘写具体的程序代码。
lizye 发表于 2021-8-14 12:42 | 显示全部楼层
这样就会出现调试OK,下载重启后不正常。
wyjie 发表于 2021-8-14 12:45 | 显示全部楼层
楼主没下载F1CUBE?
 楼主| yszong 发表于 2021-8-14 12:46 | 显示全部楼层
没有下载啊,不过这也是一种办法了,谢谢
renyaq 发表于 2021-8-14 12:50 | 显示全部楼层
这个文件里面有很多例子。但是要注册ST网站的账号才可以下载。
dengdc 发表于 2021-8-14 12:52 | 显示全部楼层
基本可以确认 仅就他的问题,上面代码是看不出问题的。
yinxiangh 发表于 2021-8-14 12:54 | 显示全部楼层
问题可能出在别的地方。
wyjie 发表于 2021-8-14 12:56 | 显示全部楼层
比方相关中断里是否对定时器1的输出做了什么;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

830

主题

11379

帖子

4

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