打印
[STM32F1]

stm32f103rct6 定时器TIM1输出PWM问题

[复制链接]
8490|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kqslid|  楼主 | 2014-5-6 11:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下
void Timer_Configuration(void)                                     
{
        TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
    //  TIMER1 定时器 PWM输出
        RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
//        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
       
   /************************************
    频率 F = 16.384M / ( (1023+1)(15+1) )
   *********************************/                                       
        TIM_TimeBaseStructure.TIM_Period = 1023;                          //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler = 15;                          //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                  //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;          //向上计数模式
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                                  //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位



        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;                      //pwm模式一输出
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//反向通道使能
        TIM_OCInitStructure.TIM_Pulse = 512;                                              //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      //输出极性
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;    //互补端的极性
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);                           //使能tim4在ccr3上的预装载寄存器
       
        TIM_OCInitStructure.TIM_Pulse = 512;
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);
        //清中断
     TIM_ClearFlag(TIM1, TIM_FLAG_CC1);
     //TIM1中断源设置,开启相应通道的捕捉比较中断
     TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
         //通道输出使能
     TIM_CtrlPWMOutputs(TIM1, ENABLE);
         
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

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

        //TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);                                          //使能tim1中断

        TIM_Cmd(TIM1, ENABLE);   //使能定时器
       
}
引脚不输出PWM信号
沙发
mmuuss586| | 2014-5-6 12:33 | 只看该作者
加上这句试下:
GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);       

使用特权

评论回复
板凳
kqslid|  楼主 | 2014-5-6 12:50 | 只看该作者
mmuuss586 发表于 2014-5-6 12:33
加上这句试下:
GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);

加了也没输出pwm信号:(

使用特权

评论回复
地板
mmuuss586| | 2014-5-6 13:26 | 只看该作者
kqslid 发表于 2014-5-6 12:50
加了也没输出pwm信号

RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
改成
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);

使用特权

评论回复
5
kqslid|  楼主 | 2014-5-6 13:58 | 只看该作者
mmuuss586 发表于 2014-5-6 13:26
RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
改成
RCC_APB2PeriphClockCmd(RCC_APB2Periph_T ...

就是不输出,真是愁死了

使用特权

评论回复
6
yang4469| | 2014-5-6 14:12 | 只看该作者
先普通的IO输出,在设置时钟PWM输出试试,这样容易发现问题出在那里

使用特权

评论回复
7
kqslid|  楼主 | 2014-5-6 14:29 | 只看该作者
yang4469 发表于 2014-5-6 14:12
先普通的IO输出,在设置时钟PWM输出试试,这样容易发现问题出在那里 ...

这个是程序的一部分,其他的部分(io口,串口等)调试都没问题,应该是这部分配置的问题

使用特权

评论回复
8
yang4469| | 2014-5-7 14:57 | 只看该作者
本帖最后由 yang4469 于 2014-5-7 15:04 编辑
kqslid 发表于 2014-5-6 14:29
这个是程序的一部分,其他的部分(io口,串口等)调试都没问题,应该是这部分配置的问题 ...

IO口配置的模式要对,stm32f103ve的PWM输出需要配置为复用推免模式才会有输出,开漏或者其他的都不行

使用特权

评论回复
9
usst_mcclane| | 2014-5-7 18:13 | 只看该作者
你的时钟分配的都不对怎么可能会有输出呢

使用特权

评论回复
10
usst_mcclane| | 2014-5-7 18:14 | 只看该作者
赶紧再看看时钟树

使用特权

评论回复
11
guet_new_man| | 2014-5-7 22:12 | 只看该作者
         //通道输出使能
     TIM_CtrlPWMOutputs(TIM1, ENABLE);

把这句话放到最后,即 “TIM_Cmd(TIM1, ENABLE);   //使能定时器”之后。

使用特权

评论回复
12
kqslid|  楼主 | 2014-5-8 08:46 | 只看该作者
usst_mcclane 发表于 2014-5-7 18:14
赶紧再看看时钟树

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |        RCC_APB2Periph_ADC1|
                         RCC_APB2Periph_GPIOB  | RCC_APB2Periph_GPIOC |        RCC_APB2Periph_TIM1|
                         RCC_APB2Periph_GPIOD  | RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO, ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_USART3|RCC_APB1Periph_UART4|
                          RCC_APB1Periph_UART5|RCC_APB1Periph_TIM4  |RCC_APB1Periph_SPI2, ENABLE);
哪里有问题啊,看不出来啊

使用特权

评论回复
13
usst_mcclane| | 2014-5-8 09:21 | 只看该作者
RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |        RCC_APB2Periph_ADC1|
                         RCC_APB2Periph_GPIOB  | RCC_APB2Periph_GPIOC |        RCC_APB2Periph_TIM1|
                         RCC_APB2Periph_GPIOD  | RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO, ENABLE);

使用特权

评论回复
14
usst_mcclane| | 2014-5-8 09:24 | 只看该作者
kqslid 发表于 2014-5-8 08:46
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |        RCC_APB2Periph_ADC1|
        ...

TIM1是APB2的外设,你写的是RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
你自己的时钟树里面写的有RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |        RCC_APB2Periph_ADC1|
                         RCC_APB2Periph_GPIOB  | RCC_APB2Periph_GPIOC |        RCC_APB2Periph_TIM1|
                         RCC_APB2Periph_GPIOD  | RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO, ENABLE);

使用特权

评论回复
15
kqslid|  楼主 | 2014-5-8 10:08 | 只看该作者
usst_mcclane 发表于 2014-5-8 09:24
TIM1是APB2的外设,你写的是RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
你自己的时钟树里面 ...

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |        RCC_APB2Periph_ADC1|
                         RCC_APB2Periph_GPIOB  | RCC_APB2Periph_GPIOC |        RCC_APB2Periph_TIM1|
                         RCC_APB2Periph_GPIOD  | RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO, ENABLE);
是APB2啊

使用特权

评论回复
16
usst_mcclane| | 2014-5-8 11:53 | 只看该作者
kqslid 发表于 2014-5-8 10:08
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |        RCC_APB2Periph_ADC1|
...

你时钟树里面写的是APB2,那里你是设置了,但是你后来的程序中写的是TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
    //  TIMER1 定时器 PWM输出
        RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
程序会以你后面这个为准的

使用特权

评论回复
17
kqslid|  楼主 | 2014-5-8 12:10 | 只看该作者
usst_mcclane 发表于 2014-5-8 11:53
你时钟树里面写的是APB2,那里你是设置了,但是你后来的程序中写的是TIM_TimeBaseInitTypeDef    TIM_Tim ...

我一直在调试,这条语句已经被我注释掉了,也没有输出

使用特权

评论回复
18
kqslid|  楼主 | 2014-5-8 12:12 | 只看该作者
usst_mcclane 发表于 2014-5-8 11:53
你时钟树里面写的是APB2,那里你是设置了,但是你后来的程序中写的是TIM_TimeBaseInitTypeDef    TIM_Tim ...

把这段代码用我的开发板调试就有输出,但是这个pcb板我看了也没发现有什么问题

使用特权

评论回复
19
风儿flying| | 2015-8-14 10:20 | 只看该作者
找到原因了吗?

使用特权

评论回复
20
风儿flying| | 2015-8-14 10:20 | 只看该作者
sihuochubulai

使用特权

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

本版积分规则

5

主题

17

帖子

0

粉丝