PWM输出例程 输出IO口为什么要初始化两次?

2019-08-09 16:30发布

led输入tim1的pwm做呼吸灯的,我把led里的io口初始化删掉了,tim1通道1初始化的函数还在,然后tim1通道1出的就是杂波了。我想既然是设置复用了,那原来的功能(普通io)应该可以不用了吧,为什么还要再初始化led?想了很久没明白。(工程里我加了一点捕获和oled)




这是在led.c里
void LED_Init(void)
{

GPIO_InitTypeDef  GPIO_InitStructure;
  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);  //ʹÄ&UumlA,PD¶Ë¿ÚʱÖÓ

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;     //LED0-->A.8 ¶Ë¿ÚÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO¿ÚËÙ¶ÈΪ50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);      //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOA.8
GPIO_SetBits(GPIOA,GPIO_Pin_8);       //PA.8 Êä³ö¸ß

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;        //LED1-->D.2 ¶Ë¿ÚÅäÖÃ, ÍÆÍìÊä³ö
GPIO_Init(GPIOD, &GPIO_InitStructure);        //ÍÆÍìÊä³ö £¬IO¿ÚËÙ¶ÈΪ50MHz
GPIO_SetBits(GPIOD,GPIO_Pin_2);        //PD.2 Êä³ö¸ß
}




这是在tim1 init里。
void TIM1_PWM_Init(u16 arr,u16 psc)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //ʹÄÜGPIOÍâÉèʱÖÓʹÄÜ
                                                                       
   //ÉèÖøÃÒý½ÅΪ¸´ÓÃÊä³ö¹¦ÄÜ,Êä³öTIM1 CH1µ&AumlWMÂö³å²¨ÐÎ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //¸´ÓÃÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);


TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ  80K
TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ  ²»·ÖƵ
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_Pulse = 0; //ÉèÖôý×°È벶»ñ±È½Ï¼Ä´æÆ÷µÄÂö³åÖµ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx
  TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE Ö÷Êä³öʹÄÜ
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1ԤװÔØʹÄÜ  

TIM_ARRPreloadConfig(TIM1, ENABLE); //ʹÄÜTIMxÔÚARRÉϵÄԤװÔؼĴæÆ÷

TIM_Cmd(TIM1, ENABLE);  //ʹÄÜTIM1

}




这是在主函数里
int main(void)
{
  
u32 temp=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// ÉèÖÃÖжÏÓÅÏȼ¶·Ö×é2
delay_init();       //ÑÓʱº¯Êý³õʼ»¯
uart_init(9600);     //9600  
OLED_Init();   //³õʼ»¯OLED  
OLED_Clear();
//LED_Init();     //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
  TIM3_PWM_Init(899,0);
  //TIM2_Cap_Init(0XFFFF,72-1);  //ÒÔ1MhzµÄƵÂʼÆÊý
    while(1)
{
//   delay_ms(10);
  TIM_SetCompare1(TIM3,499);   
//  if(TIM2CH1_CAPTURE_STA&0X80)//³É¹¦²¶»ñµ½ÁËÒ»´Î¸ßµçƽ
//  {
//   temp=TIM2CH1_CAPTURE_STA&0X3F;
//   temp*=65536;     //Òç³öʱ¼ä×ܺÍ
//   temp+=TIM2CH1_CAPTURE_VAL;  //µÃµ½×ܵĸߵçƽʱ¼ä
//   printf("HIGH:%d us ",temp); //´òÓ¡×ܵĸߵãƽʱ¼ä
//    TIM2CH1_CAPTURE_STA=0;   //¿ªÆôÏÂÒ»´Î²¶»ñ
//   }
//  OLED_ShowNum(40,5,65,3,16);
}
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。