STM32除TIM6和TIM7外都可以產生PWM輸出。高級定時器TIM1和TIM8可以同時產生7路PWM,通用定時器可以產生4路PWM輸出。 1.TIM1 CH1輸出PWM配置步驟 ①開啟TIM1時鐘,配置PA8為復用輸出 APB2外設時鐘使能寄存器(RCC_APB2ENR) APB1外設複位寄存器 ...
STM32除TIM6和TIM7外都可以產生PWM輸出。高級定時器TIM1和TIM8可以同時產生7路PWM,通用定時器可以產生4路PWM輸出。
1.TIM1 CH1輸出PWM配置步驟
①開啟TIM1時鐘,配置PA8為復用輸出
APB2外設時鐘使能寄存器(RCC_APB2ENR)
APB1外設複位寄存器 (RCC_APB1RSTR)
置1開啟。清0關閉。
Eg:RCC->APB2ENR|=1<<11; //使能TIM1時鐘
配置I/O口: 參見stm32寄存器版學習筆記01 GPIO口的配置。
Eg:GPIOA->CRH&=0XFFFFFFF0; //PA8清除之前的設置
GPIOA->CRH|=0X0000000B; //PA8復用功能輸出
②設置TIM1的ARR和PSC
自動重裝載寄存器(TIMx_ARR)
TIM1和TIM8預分頻器(TIMx_PSC)
③設置TIM1_CH1的PWM模式及通道方向
TIM1和TIM8捕獲/比較模式寄存器1(TIMx_CCMR1)
Eg:TIM1->CCMR1|= 7<<4; //CH1 PWM2模式
TIM1->CCMR1|= 1<<3; //CH1預裝載使能
CH1為輸出,CC1S[1:0] 預設為00.
④使能TIM1的CH1輸出,使能TIM1
設置TIM1_CCER來開啟TIM1的通道1的輸出。設置TIM1_CR1來開啟TIM1的時鐘。
TIM1和TIM8捕獲/比較使能寄存器(TIMx_CCER)
Eg:TIM1->CCER|= 1<<3; //OC1輸出使能
TIM1和TIM8控制寄存器1(TIMx_CR1)
ARPE:自動重裝載預裝載允許位 0:TIMx_ARR寄存器沒有緩衝; 1:TIMx_ARR寄存器被裝入緩衝器。
CEN:使能計數器 位0 0:禁止計數器; 1:使能計數器。
Eg:TIM1->CR1=0x0080; //ARPE使能
TIM1->CR1|=0X01; //使能定時器1
⑤設置MOE輸出,使能PWM輸出
普通定時器在完成以上設置後可以輸出PWM,但高級定時器要使能剎車和死區寄存器。
TIM1和TIM8剎車和死區寄存器(TIMx_BDTR)
Eg:TIM1->BDTR|=1<<15; //MOE主輸出使能
⑥修改TIM1_CCR1來控制占空比
Eg:#define PWM_VAL TIM1->CCR1 (可以直接設置)
2.TIMx復用功能重印象
……
3.高級定時器TIM1輸出PWM應用
1 //timer.c 2 //TIM1_CH1 PWM輸出初始化 3 //arr:自動重裝值 4 //psc:時鐘預分頻數 5 void TIM1_PWM_Init(u16 arr,u16 psc) 6 { 7 //此部分需手動修改IO口設置 8 RCC->APB2ENR|=1<<11; //TIM1時鐘使能 9 GPIOA->CRH&=0XFFFFFFF0; //PA8清除之前的設置 10 GPIOA->CRH|=0X0000000B; //復用功能輸出 11 12 TIM1->ARR=arr; //設定計數器自動重裝值 13 TIM1->PSC=psc; //預分頻器設置 14 15 TIM1->CCMR1|=7<<4; //CH1 PWM2模式 16 TIM1->CCMR1|=1<<3; //CH1預裝載使能 17 TIM1->CCER|=1<<0; //OC1 輸出使能 18 TIM1->BDTR|=1<<15; //MOE 主輸出使能 19 20 TIM1->CR1=0x0080; //ARPE使能 21 TIM1->CR1|=0x01; //使能定時器1 22 }
1 //timer.h 2 #ifndef __TIMER_H 3 #define __TIMER_H 4 #include "sys.h" 5 //通過改變TIM1->CCR1的值來改變占空比,從而控制LED0的亮度 6 #define LED0_PWM_VAL TIM1->CCR1 7 8 void TIM1_PWM_Init(u16 arr,u16 psc); 9 #endif
4.普通定時器TIM2輸出2路PWM 應用
1 //TIM2_CH3~4 PWM輸出初始化 2 //arr:自動重裝值 3 //psc:時鐘預分頻數 4 void TIM2_PWM_Init(u16 arr,u16 psc) 5 { 6 //此部分需手動修改IO口設置 7 RCC->APB1ENR|=1<<0; //TIM2時鐘使能 8 GPIOA->CRL&=0XFFFF00FF; //PA2-3清除之前的設置 9 GPIOA->CRL|=0X0000BB00; //復用功能輸出 10 11 TIM2->ARR=arr; //設定計數器自動重裝值 12 TIM2->PSC=psc; //預分頻器設置 13 14 15 TIM2->CCMR2|=7<<4; //CH3 PWM2模式(輸出) 16 TIM2->CCMR2|=1<<3; //CH3預裝載使能 17 TIM2->CCER|=1<<8; //OC3 輸出使能 18 19 TIM2->CCMR2|=7<<12; //CH4 PWM2模式(輸出) 20 TIM2->CCMR2|=1<<11; //CH4預裝載使能 21 TIM2->CCER|=1<<12; //OC4 輸出使能 22 23 TIM2->CR1=0x0080; //ARPE使能 24 TIM2->CR1|=0x01; //使能定時器2 25 } 26 27 28 //設定占空比 duty<899 29 //設置多少就是多少低的 30 void pwm_duty1(u16 duty) 31 { 32 33 TIM2->CCR3=duty; 34 } 35 36 void pwm_duty2(u16 duty) 37 { 38 TIM2->CCR4=duty; 39 }
5.普通定時器TIM3輸出2路PWM 應用
1 //timer.c 2 //TIM3_CH1~2 PWM輸出初始化 3 //arr:自動重裝值 4 //psc:時鐘預分頻數 5 void TIM3_PWM_Init(u16 arr,u16 psc) 6 { 7 //此部分需手動修改IO口設置 8 RCC->APB1ENR|=1<<1; //TIM3時鐘使能 9 GPIOA->CRL&=0X00FFFFFF; //PA6-7清除之前的設置 10 GPIOA->CRL|=0XBB000000; //復用功能輸出 11 12 TIM3->ARR=arr; //設定計數器自動重裝值 13 TIM3->PSC=psc; //預分頻器設置 14 15 TIM3->CCMR1|=7<<4; //CH1 PWM2模式(輸出) 16 TIM3->CCMR1|=1<<3; //CH1預裝載使能 17 TIM3->CCER|=1<<0; //OC1 輸出使能 18 19 TIM3->CCMR1|=7<<12; //CH2 PWM2模式(輸出) 20 TIM3->CCMR1|=1<<11; //CH2預裝載使能 21 TIM3->CCER|=1<<4; //OC2 輸出使能 22 23 TIM3->CR1=0x0080; //ARPE使能 24 TIM3->CR1|=0x01; //使能定時器3 25 } 26 void pwm_duty3(u16 duty) 27 { 28 29 PWM3_PWM_VAL=duty; 30 } 31 32 void pwm_duty4(u16 duty) 33 { 34 PWM4_PWM_VAL=duty; 35 } 36 37 //timer.h 38 #define PWM3_PWM_VAL TIM3->CCR1 39 #define PWM4_PWM_VAL TIM3->CCR2
切記在主函數前添加輸出化函數!
Eg:TIM2_PWM_Init(899,0);//不分頻。PWM頻率=72000/(899+1)=80Khz