1. 遇到的問題
static void PWM_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 基本定時器配置
TIM_DeInit(TIM3);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 開啟定時器時鐘,即內(nèi)部時鐘CK_INT=72M
TIM_TimeBaseStructure.TIM_Period = 49; // 自動重裝載寄存器的值,累計TIM_Period+1個頻率后產(chǎn)生一個更新或者中斷
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 時鐘預(yù)分頻數(shù)為
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 設(shè)置時鐘分頻系數(shù):不分頻(這里用不到)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上計數(shù)模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化定時器
TIM_ClearFlag(TIM3, TIM_FLAG_Update); // 清除計數(shù)器更新標(biāo)志位
// PWM模式配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 配置為PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能輸出
TIM_OCInitStructure.TIM_Pulse = 25; // 設(shè)置初始PWM脈沖寬度為25,實際上就是配置占空比(捕獲比較寄存器1,CCR1)
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; // 當(dāng)定時器計數(shù)值小于CCR1_Val時為低電平
TIM_OC2Init(TIM3, &TIM_OCInitStructure ); // 使能通道2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable ); // 使能預(yù)裝載(使能CCR1的預(yù)裝載)
TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能自動重載寄存器ARR的預(yù)裝載
// 開啟TIM3
TIM_Cmd(TIM3, ENABLE); // 使能定時器
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);// 使能定時器中斷
1.1 什么是清除標(biāo)志位
TIM_ClearFlag(TIM3, TIM_FLAG_Update); // 清除計數(shù)器更新標(biāo)志位
TIM_ClearFlag()
和函數(shù)
TIM_ClearITPendingBit()
有什么區(qū)別?其實重點在Flag和IT,前者是外設(shè)的狀態(tài)標(biāo)志,而后者是外設(shè)的中斷標(biāo)志。狀態(tài)標(biāo)志就是一個外設(shè)它有自身的一些標(biāo)志位(Flag),來表明它處于什么狀態(tài),下圖就是定時器的狀態(tài)標(biāo)記。中斷標(biāo)志就是使能外設(shè)的中斷后,每次發(fā)生一次中斷,它會表明發(fā)生了什么樣的中斷,同樣中斷也有相應(yīng)的標(biāo)記。兩者分別靠函數(shù)
TIM_GetFlagStatus()
和函數(shù)
TIM_GetITStatus()
來獲取。
1.2?模式1和模式2的區(qū)別
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 配置為PWM模式1
1.3 什么是自動重裝載和預(yù)裝載寄存器?
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable );// 使能預(yù)裝載(使能CCR1的預(yù)裝載)
TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能自動重載寄存器ARR的預(yù)裝載
2. PWM波產(chǎn)生的過程
作為類比,你可以把預(yù)裝載寄存器理解為內(nèi)存中的cache,數(shù)據(jù)寫入了cache,卻是不一定寫入內(nèi)存的。當(dāng)然你可以通過MMU設(shè)置為寫穿(write through)或?qū)懟?write back)模式。
TIM_ARRPreloadConfig(TIM3, ENABLE);
的含義。
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_TIM_ALL_PERIPH(TIMx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Set the ARR Preload Bit */
TIMx->CR1 |= TIM_CR1_ARPE;
}
else
{
/* Reset the ARR Preload Bit */
TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE);
}
}
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable ); // 使能預(yù)裝載(使能CCR1的預(yù)裝載)
TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能自動重載寄存器ARR的預(yù)裝載
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!