打印
[STM32F1]

TIM1的PWM输出时有时没有

[复制链接]
1600|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 HAORANAN123 于 2018-3-28 11:26 编辑

使用的是STM32F103C8T6,使用的TIM1的PWM输出,还有TIM3的PWM输出,程序下载完后,TIM1的pwm一直没有输出,tim3的pwm一直有输出,后来查找论坛有人说了需要在主函数里面先初始化tim1再初始化tim3,然后试了试果然tim1有了pwm输出,但是重新上电后tim1又没有PWM输出了,又重新烧写tim1又可以输出PWM了,但是重新上电依然没有,请问这是什么原因呢?
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);                                          
                                                                  
}


沙发
mmuuss586| | 2018-3-28 13:50 | 只看该作者
不管是初始化1还是3都可以的;
没有先后的说法;

程序仿真下看看呗:监控相应的定时器寄存器有没有使能;

使用特权

评论回复
板凳
HAORANAN123|  楼主 | 2018-3-28 15:23 | 只看该作者
本帖最后由 HAORANAN123 于 2018-3-28 15:24 编辑
mmuuss586 发表于 2018-3-28 13:50
不管是初始化1还是3都可以的;
没有先后的说法;

监控了是没问题了,但是没有输出

{29A1E979-C694-4080-A27E-32B0008E6CC0}.bmp (1.55 MB )

{29A1E979-C694-4080-A27E-32B0008E6CC0}.bmp

使用特权

评论回复
地板
香水城| | 2018-3-28 21:50 | 只看该作者
ST官方例程关于定时器PWM输出的很多,也很完整。你参考下。

调试时,注意不用因为手动操作寄存器而忘写具体的程序代码。

这样就会出现调试OK,下载重启后不正常。

另外,也注意硬件,尤其电源部分。

使用特权

评论回复
5
HAORANAN123|  楼主 | 2018-4-12 10:27 | 只看该作者
香水城 发表于 2018-3-28 21:50
ST官方例程关于定时器PWM输出的很多,也很完整。你参考下。

调试时,注意不用因为手动操作寄存器而忘写具 ...

香主,st官方例程在哪里啊,没有看到啊,有没有连接地址了

使用特权

评论回复
6
antusheng| | 2018-4-13 15:02 | 只看该作者
楼主没下载F1CUBE?

使用特权

评论回复
7
HAORANAN123|  楼主 | 2018-4-13 17:27 | 只看该作者
antusheng 发表于 2018-4-13 15:02
楼主没下载F1CUBE?

没有下载啊,不过这也是一种办法了,谢谢

使用特权

评论回复
8
antusheng| | 2018-4-13 17:28 | 只看该作者
HAORANAN123 发表于 2018-4-13 17:27
没有下载啊,不过这也是一种办法了,谢谢

这个文件里面有很多例子。但是要注册ST网站的账号才可以下载。

使用特权

评论回复
9
laidaihua| | 2018-11-19 18:51 | 只看该作者
说了一大堆废话的蛮多,有用回答没有啊!!!

使用特权

评论回复
10
香水城| | 2018-11-21 14:25 | 只看该作者
laidaihua 发表于 2018-11-19 18:51
说了一大堆废话的蛮多,有用回答没有啊!!!

基本可以确认 仅就他的问题,上面代码是看不出问题的。
问题可能出在别的地方。
比方相关中断里是否对定时器1的输出做了什么;
对于TIM1来讲,是否使能并触发了刹车信号;

其实,配置TIMER的PWM输出很简单的,也有足够
的现存代码。

使用特权

评论回复
11
laidaihua| | 2019-9-21 17:14 | 只看该作者
香水城 发表于 2018-11-21 14:25
基本可以确认 仅就他的问题,上面代码是看不出问题的。
问题可能出在别的地方。
比方相关中断里是否对定 ...

就是因为足够简单,所以才说前面都说的是废话啊。
我今天调试倒是发现一个问题,不知道算不算是STM32的一个Bug??
就是我发现我以前用得好好的一段代码,里面有用到TIM1、TIM2、TIM3、TIM4,以前都是依次顺序初始化的,用得好好地没啥问题。今天把顺序改了一下,先初始化TIM3,再依次初始化TIM1、2、4,结果TIM3的PWM输出就没了(用了OC1、OC2两路PWM输出)。初始化顺序调回去,就都好了。。

使用特权

评论回复
12
laidaihua| | 2019-9-21 17:15 | 只看该作者
laidaihua 发表于 2019-9-21 17:14
就是因为足够简单,所以才说前面都说的是废话啊。
我今天调试倒是发现一个问题,不知道算不算是STM32的一 ...

仿真监控TIM3的各个寄存器状态,都正常,就是没有PWM输出波形。。

使用特权

评论回复
13
香水城| | 2019-9-23 09:57 | 只看该作者
HAORANAN123 发表于 2018-4-12 10:27
香主,st官方例程在哪里啊,没有看到啊,有没有连接地址了

STM32各个系列都有丰富的例程在固件包里。
你去官网搜索stm32Cube,会发现各个系列的固件包。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

328

帖子

1

粉丝