關於PWM輸出原理方面的文章:
嵌入式stm32 複習(工作用)— PWM輸出知識 2020.4.6
添加鏈接描述
教你手寫定時器精準延時(看完這篇你就會手動寫啦,保姆級講解)---- 2020.2.27
添加鏈接描述
先上完整PWM輸出部分代碼!!!
/**
* @brief PWM 初始化,是使用TIM3_CH2(映射到PB5),產生PWM實現呼吸燈效果
* @param arr: u16 ,自動重載值; psc:u16 ,時鐘頻率
* @retval None
*/
void PWM_Init(u16 arr,u16 psc)
{
//1.開啓時鐘
//開啓AFIO時鐘
RCC->APB2ENR|=1<<0;
//開啓GPIO時鐘
RCC->APB2ENR|=1<<3;
//開啓APB1下的TIM3的時鐘
RCC->APB1ENR|=1<<1;
//2.重映射,將TIM3_CH2映射到PB5
AFIO->MAPR|=0x02<<10;
//3.設置TIM3_CH2所對應的GPIO的輸出模式
GPIOB->CRL|=0x0B<<20; //設置PB5,爲複用推免輸出模式,輸出頻率50MHz
//4.設置TIM3
//4.1.使能定時器
TIM3->CR1|=1<<0;
//4.2.設置預分頻係數,目的是設置計數的“精度”
TIM3->PSC=psc-1; //表示不分頻,
//4.3.當ARPE寄存器=0,ARR寄存被寫值時,會立即更新到計數器中
TIM3->ARR=arr-1;
//5.設置與PWM功能相關的參數
//5.1設置PWM模式
TIM3->CCMR1|=0x07<<12; //設置PWM模式爲PWM模式2,根據實際PWM產生效果,設置PWM2模式較好,方便佔空比計算
//5.2設置極性
TIM3->CCER&=~(1<<5); //希望高電平爲有效狀態
//5.3使能OC
TIM3->CCER=1<<4;
//5.4設置OCxPE
TIM3->CCMR1|=1<<11;
//5.5使能ARPE
TIM3->CR1|=1<<7;
}
好!按照老樣子,接下來開始詳細講解每行代碼的用處,以及爲什麼這樣寫!
PWM初始化部分
//1.開啓時鐘
//開啓AFIO時鐘
RCC->APB2ENR|=1<<0;
//
//因爲我們本次實驗的目的就是通過PWM來控制LED的亮滅,所以我們通過原理圖可以知道LED0位於PB5端口,所以我們就需要找到PB5對應的PWM輸出通道。
//
//由上圖可知,PB5是可以由TIM3_CH2輸出PWM的,又因爲我們使用了複用功能,所以先開啓複用端口時鐘AFIO。
////由上圖可知,AFIO位於APB2總線下,那麼我們就可以使能APB2。
//
//開啓GPIO時鐘
RCC->APB2ENR|=1<<3;
//由前面可知,LED端口爲PB5,那麼我們需要先開啓GPIOB時鐘。
//
//
//開啓APB1下的TIM3的時鐘
RCC->APB1ENR|=1<<1;
//又因爲我們用的是TIM3的CH2通道來輸出PWM,那自然而然就應該開啓TIM3時鐘。
//
//
//2.重映射,將TIM3_CH2映射到PB5
AFIO->MAPR|=0x02<<10;
//
//
//3.設置TIM3_CH2所對應的GPIO的輸出模式
GPIOB->CRL|=0x0B<<20; //設置PB5,爲複用推免輸出模式,輸出頻率50MHz
//因爲我們這裏PB5是輸出引腳,是爲了驅動LED0這個外設的。
//這裏簡單提一下爲什麼這裏設置爲推輓輸出,而不是開漏輸出模式,那是因爲雖然開漏輸出模式適用於大電流模式,但是要產生高電平的話,我們必須在外界外加上拉電阻才能達到效果,但是推輓輸出則不需要這樣。
//
//
//4.設置TIM3
//4.1.使能定時器
TIM3->CR1|=1<<0;
//4.2.設置預分頻係數,目的是設置計數的“精度”
TIM3->PSC=psc-1; //表示不分頻,
//4.3.當ARPE寄存器=0,ARR寄存被寫值時,會立即更新到計數器中
TIM3->ARR=arr-1;
//這個部分我這裏就不在贅述了,在之前關於定時器部分已有講解~
//5.設置與PWM功能相關的參數
//5.1設置PWM模式
TIM3->CCMR1|=0x07<<12; //設置PWM模式爲PWM模式2,根據實際PWM產生效果,設置PWM2模式較好,方便佔空比計算
////這個模式1和模式2的配置方法一樣,由於我們想要默認是低電平,有效電平爲高電平,所以我們這裏就設置爲PWM模式2。
//
//
//5.2設置極性
TIM3->CCER&=~(1<<5); //希望高電平爲有效狀態
//
//
//由前面我們可以知道高電平有效,所以該位設置爲0。
//5.3使能OC
TIM3->CCER=1<<4;
////同上述,這裏使OCx輸出使能,所以該位爲1。
//
//5.4設置OCxPE
TIM3->CCMR1|=1<<11;
////
//5.5使能ARPE
TIM3->CR1|=1<<7;
//