OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4458|回复: 1

跪求?一直不知道,高级定时器TIM1怎么没有波形输出。SPWM配置

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-4-16
在线时间
0 小时
发表于 2015-5-15 17:25:49 | 显示全部楼层 |阅读模式
5金钱
void RCC_Configuration()
{
   ErrorStatus HSEStartUpStatus;//定义外部高速晶体启动状态枚举变量

   RCC_DeInit();//复位RCC外部设备寄存器到默认值
   RCC_HSEConfig(RCC_HSE_ON);//打开外部高速晶振
   HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待外部高速时钟准备好
   if(HSEStartUpStatus==SUCCESS)//外部高速时钟已经准备好
   {
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  FLASH_SetLatency(FLASH_Latency_2);
  RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB(HCLK)时钟=SYSCLK
  RCC_PCLK2Config(RCC_HCLK_Div1);//配置APB2(PCLK2)时钟=AHB时钟
  RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1(PCLK1)时钟=AHB 1/2时钟
  RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//配置PLL时钟=外部高速晶体时钟*9
  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  RCC_PLLCmd(ENABLE);//使能PLL时钟
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL时钟就绪
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟=PLL时钟
  while(RCC_GetSYSCLKSource()!=0x08);//检查PLL时钟是否作为系统时钟
   }

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);   
//   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); 
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);    
}

void GPIO_Configuration()

   //TIM3的channel2对应PA7
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;     //A8
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOA,&GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;  //13//TIM1_CH1N 
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOB,&GPIO_InitStructure);

//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_Init(GPIOA, &GPIO_InitStructure);
//
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //TIM1_CH1N
//GPIO_Init(GPIOB, &GPIO_InitStructure);




void TIM_Configuration(void)
{
TIM_TimeBaseStructure.TIM_Period =6000;                    /*TIM3_ARR = 2879,12.5Khz*/  
    TIM_TimeBaseStructure.TIM_Prescaler =1;  
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;  
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  

// TIM_PrescalerConfig(TIM1,)
  
    /* Channel 1, 2,3 and 4 Configuration in PWM mode */  
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //打开互补输出    
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    TIM_OCInitStructure.TIM_Pulse =2000;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);   
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;  
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set;    
  
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable); //这句的功能是让改变CCR1之后马上有效
// TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Disable); //这句的功能是让改变CCR2之后马上有效  
// TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Disable); //这句的功能是让改变CCR3之后马上有效  
      
    TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE); 

 
TIM_Cmd(TIM1, ENABLE);    
    /* TIM1 Main Output Enable */  
    TIM_CtrlPWMOutputs(TIM1, ENABLE);   //TIM1需要加上这句,貌似低级定时器不需要  
}


void NVIC_Configuration()
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
    NVIC_InitStructure.NVIC_IRQChannel =TIM1_CC_IRQChannel;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
    NVIC_Init(&NVIC_InitStructure);      

}

void delayms(u16 T)
{
   u16 x,y;
   for(x=0;x<T;x++)
   for(y=0;y<10280;y++);
}

main()
{  
   #ifdef DEBUG
   debug();
   #endif

   RCC_Configuration();
   GPIO_Configuration();  
   NVIC_Configuration();
   TIM_Configuration();
   while(1)
   {

   }
}


void TIM1_CC_IRQHandler(void)  
{  
  if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)  
  {  
    TIM1->SR = (u16)~TIM_IT_CC1;  
    TIM1->CCR1 = Duty0[count0];
TIM1->CCR2 = Duty0[count0];   
TIM1->CCR3 = Duty0[count0];
    count0++;  
    if(count0==256)  
    {  
        count0=0;  
    }  
  }  
}  

最佳答案

查看完整内容[请看2#楼]

参考mini开发板  pwm输出例程   也是用的TIM1
只为做最好
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-5-15 17:25:50 | 显示全部楼层
参考mini开发板  pwm输出例程   也是用的TIM1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 14:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表