一,初始化(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的值
注意更改函數的可重入性!