打印

香兄请指点一下:TIM1不能翻转管脚。

[复制链接]
3303|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lidawei|  楼主 | 2008-7-30 11:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原固件库中的例子FWLibexamplesTIMOCToggle使用TIM2,无问题。将其中的TIM2改为TIM1,并修改了相应的设置(如下),发现可进中断,但各输出管脚(pin8、9、10、11)一直为低电平,不能翻转,不知何故?请指教。

改为tim1后的main.c
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name          : main.c
* Author             : MCD Application Team
* Version            : V2.0.1
* Date               : 06/13/2008
* Description        : Main program body
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
vu16 CCR1_Val = 32768;
vu16 CCR2_Val = 16384;
vu16 CCR3_Val = 8192;
vu16 CCR4_Val = 4096;
ErrorStatus HSEStartUpStatus;

/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);


/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{

  /* System Clocks Configuration */
  RCC_Configuration();

  /* NVIC Configuration */
  NVIC_Configuration();

  /* GPIO Configuration */
  GPIO_Configuration();

  /* ---------------------------------------------------------------
    TIM2 Configuration: Output Compare Toggle Mode:
    TIM2CLK = 36 MHz, Prescaler = 0x2, TIM2 counter clock = 12 MHz
    CC1 update rate = TIM2 counter clock / CCR1_Val = 366.2 Hz
    CC2 update rate = TIM2 counter clock / CCR2_Val = 732.4 Hz
    CC3 update rate = TIM2 counter clock / CCR3_Val = 1464.8 Hz
    CC4 update rate = TIM2 counter clock / CCR4_Val =  2929.6 Hz
  --------------------------------------------------------------- */

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_Prescaler = 2;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);


  /* Output Compare Toggle Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);

  /* Output Compare Toggle Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Disable);

  /* Output Compare Toggle Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Disable);

  /* Output Compare Toggle Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

  TIM_OC4Init(TIM1, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Disable);
  /* TIM enable counter */
  TIM_Cmd(TIM1, ENABLE);

//TIM_CtrlPWMOutputs(TIM1, ENABLE);
//TIM_CCxCmd(TIM1, TIM_Channel_3, ENABLE);
//TIM_CCxNCmd(TIM1, TIM_Channel_3, DISABLE);
//TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_Toggle);






/* TIM IT enable */
  TIM_ITConfig(TIM1, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);

  while (1)
  {}
}

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/4 */
    RCC_PCLK1Config(RCC_HCLK_Div4);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while (RCC_GetSYSCLKSource() != 0x08)
    {}
  }

  /* TIM2 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  /* GPIOA clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configure the TIM2 Pins.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* GPIOA Configuration:TIM2 Channel1, 2, 3 and 4 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configure the nested vectored interrupt controller.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

  /* Enable the TIM2 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

stm32f10x_it.c中的tim1中断处理过程:
void TIM1_CC_IRQHandler(void)
{
  /* TIM2_CH1 toggling with frequency = 183.1 Hz */
  if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1 );
    capture = TIM_GetCapture1(TIM1);
    TIM_SetCompare1(TIM1, capture + CCR1_Val );
  }

  /* TIM2_CH2 toggling with frequency = 366.2 Hz */
  if (TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM1);
    TIM_SetCompare2(TIM1, capture + CCR2_Val);
  }

  /* TIM2_CH3 toggling with frequency = 732.4 Hz */
  if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC3);
    capture = TIM_GetCapture3(TIM1);
    TIM_SetCompare3(TIM1, capture + CCR3_Val);
  }

  /* TIM2_CH4 toggling with frequency = 1464.8 Hz */
  if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET)
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC4);
    capture = TIM_GetCapture4(TIM1);
    TIM_SetCompare4(TIM1, capture + CCR4_Val);
  }
}



沙发
lianshumou| | 2008-7-30 11:15 | 只看该作者

肯定是你的程序问题,我已经输出过了!

使用特权

评论回复
板凳
lidawei|  楼主 | 2008-7-30 11:18 | 只看该作者

是。

我也可以肯定是程序有问题,但到底是哪里有问题呢?TIM2可正常输出。

使用特权

评论回复
地板
香水城| | 2008-7-30 11:24 | 只看该作者

查查电路

使用特权

评论回复
5
lidawei|  楼主 | 2008-7-30 11:29 | 只看该作者

香兄能否说得明白一点?

各个输出口设置为GPIO_Mode_Out_PP时可正常通过GPIO_SetBits设置为高电平及用GPIO_ResetBits设置为低电平,即外部电路是没有问题的。

使用特权

评论回复
6
香水城| | 2008-7-30 11:41 | 只看该作者

如果电路上没有问题,那还是需要在程序上找原因了

看看时钟的配置,TIM2是PCLK1供时钟,而TIM1是PCLK2供时钟。

使用特权

评论回复
7
lidawei|  楼主 | 2008-7-30 11:45 | 只看该作者

TIM1时钟无问题,就是不能输出。

TIM1时钟肯定是无问题的,连中断都进去了,且是周期性的进中断,说明输出比较在起作用,但就是不能翻转相应的管脚,不知哪一步没设置好?

使用特权

评论回复
8
zyok| | 2008-7-30 12:13 | 只看该作者

单不调试看看...

使用特权

评论回复
9
lianshumou| | 2008-7-30 12:30 | 只看该作者

我的初始化

    Time->CR1.W = 0;
    Time->CR2.W &= 0xc000;
    Time->SMCR.W = 0;
    Time->DIER.W = 0;
    Time->CCMR1.W = 0;
    Time->CCMR2.W &= 0xff00;

    Time->CR1.B.UDIS = 1;            //允许更新
    Time->CR1.B.URS = 1;            //更新请求源
    Time->CR1.B.OPM = 0;            //禁止单脉冲模式
    Time->CR1.B.CMS    = 3;            //中心对称PWM模式,比较匹配中断标志在上沿和下沿均设置
    Time->CR1.B.ARPE = 1;            //允许ARR寄存器的自动重载缓冲寄存器
    Time->CR1.B.CKD = 0;            //时钟为最快

    Time->CR2.B.CCPC = 1;            //预装载使能
    Time->CR2.B.CCUS = 1;            //更新源选择
    Time->CR2.B.CCDS = 0;            //申请DMA方式
    Time->CR2.B.MMS = 0;            //同步输出源选择

    Time->PSC = 0;                                        //预分频器设置
    Time->ARR = (F_Time1 >> 1)/PWM_Modle->PWM_F;        //重载寄存器,设定计数器周期,根据PWM频率设置
    Time->RCR.W = 1;                                    //重载同期计数器

    Time->CCMR1.W = 0x6c6c;
    Time->CCMR2.W |= 0x6c;

    switch((PWM_Modle->PWM_Gate)&0x3)                   //根据有效电平去设置PWM输了方式,有效电平
    {
        case 0:     //低有效
            Time->CCER.W |= 0xfff;
            Time->CR2.W |= 0x3f00;
        break;
        case 1:     //上低下高有效
            Time->CCER.W |= 0x777;
            Time->CR2.W |= 0x1500;
        break;
        case 2:     //上高下低有效
            Time->CCER.W |= 0xddd;
            Time->CR2.W |= 0x2a00;
        break;
        case 3:     //高有效
            Time->CCER.W |= 0x555;
        break;
    }   

    Time->BDTR.W = 0x8c00;

    Time->CCR1 = PWM_Modle->PWM1_CMP;           //占空比设置初始化
    Time->CCR2 = PWM_Modle->PWM2_CMP;
    Time->CCR3 = PWM_Modle->PWM3_CMP;
    Time->CR1.B.UDIS = 0;            //允许更新
    Time->EGR.B.UG = 1;                //选择更新源
    Time->EGR.B.COMG = 1;
    Time->SR.W = 0;                    //清所有中断标志
    Time->DIER.B.UIE = 1;            //使能更新中断
//    TIM1->CR1.B.CEN    = 1;             //启定时器

    NVIC->ISER1.B.TIM1_UP = 1;         //中断初始化,使能定时器1的更新中断

使用特权

评论回复
10
lidawei|  楼主 | 2008-7-30 14:53 | 只看该作者

我的输出模式是TIM_OCMode_Toggle,不是PWM。

使用特权

评论回复
11
袁嘉甫| | 2009-11-21 21:49 | 只看该作者
解决了吗?

使用特权

评论回复
12
gxgclg| | 2009-11-22 18:19 | 只看该作者
不懂,这么长的程序,先学习

使用特权

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

本版积分规则

2

主题

9

帖子

0

粉丝