STM32 PWM

一,初始化(PWM1模式,基本功能)

1,基本功能:

1)模塊時鐘初始化:

/*TIM ENABLE*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 |RCC_APB1Periph_TIM3 |RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM5 | RCC_APB1Periph_TIM6 | RCC_APB1Periph_TIM7, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_TIM8, ENABLE);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC , ENABLE);//注意開啓管腳複用時鐘及輸出通道的remap

注意:定時器1、8是在APB2上,其他在APB1上。

2)設置管腳

3)定時器配置

/* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = period;//脈衝週期即填入自動重裝載寄存器(TIMx_ARR)的值
  TIM_TimeBaseStructure.TIM_Prescaler =10;//預分頻對應預分頻寄存器:TIMx_PSC
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//對應TIMx_CR1寄存器中的CKD位:時鐘分頻因子 (Clock division);與PWM輸出無關,是設置定時器時鐘(CK_INT)頻率與數字濾波器(ETR,TIx)所使用的採樣頻率之間的分頻比例(與輸入捕獲相關),0表示濾波器的頻率和定時器的頻率是一樣。
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上累加;對應TIMx_CR1中的DIR位與CMS位:選擇中央對齊模式 (Center-aligned mode selection);
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//定時器基礎參數配置


  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//對應CCMRx的OCxM位(ccmr1對應OC1與OC2;其中4:6位對應OC1,12:14位對應OC2) 
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//捕獲/比較使能寄存器(TIMx_CCER)相應CC1E: 輸入/捕獲1輸出使能 (Capture/Compare 1 output enable)
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//捕獲/比較寄存器 1(TIMx_CCRy)
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//捕獲/比較使能寄存器(TIMx_CCER)相應CC1P:輸入/捕獲1輸出極性 (Capture/Compare 1 output polarity)
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);//輸出通道初始化:捕獲/比較使能寄存器(TIMx_CCER)

  TIM_Cmd(TIM2, ENABLE);

2,動態更改PWM波頻率及佔空比

1)首先打開影子寄存器

 TIM_ARRPreloadConfig(TIM2, DISABLE);//ARR預裝載功能使能,對應TIMX_CR1的ARPE:自動重裝載預裝載允許位 (Auto-reload preload enable);
  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//ccr預裝載功能使能,對應TIMx_CCMRx寄存器的OCxPE:輸出比較1預裝載使能 (Output Compare 1 preload enable);

2)允許事件更新

    TIM_UpdateDisableConfig(TIM2,DISABLE);//允許UEV事件的產生及影子寄存器更新。

3)如果想在定時器中更改,打開中斷

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

  TIM_ClearFlag(TIM2,TIM_FLAG_Update);
  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

4)更改ARR及CCR的值

注意更改函數的可重入性!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章