STM32103C8T6定時器1輸出兩路互補PWM
一、GPIO初始化
GPIO配置如下
GPIOA->CRH&=0XFFFFF000; //清除PA8,9,10配置
GPIOA->CRH|=0X00000BBB; //PA8,9,10推輓複用功能輸出 B=1011
GPIOB->CRH&=0X000FFFFF; //清除PB13,14,15配置
GPIOB->CRL|=0XBBB00000; //PB13,14,15推輓複用功能輸出
接下來是引腳複用
RCC->APB2ENR|=1<<0; //開啟輔助時鐘
AFIO->MAPR&=0XFFFFFF3F; //清除MAPR的[7:6]
//TIM1 無重映像,TIM1_CH1,2,3->PA8,9,10;TIM1_CHN1,2,3->PB13,14,15
二、定時器1初始化
TIM1->CCMR1|=6<<4; //CH1 PWM1模式
TIM1->CCMR1|=1<<3; //CH1預裝載使能
TIM1->CCMR1|=6<<12; //CH2 PWM1模式
TIM1->CCMR1|=1<<11; //CH2預裝載使能
TIM1->CCER|=5; //CH1,CH1N 輸出使能,高電平有效
TIM1->CCER|=5<<4; //CH2,CH2N 輸出使能,高電平有效
TIM1->ARR=arr; //設定計數器自動重灌值
TIM1->PSC=psc; //預分頻器分頻
TIM1->CCR1=400; //佔空比
TIM1->BDTR|=1<<15; // 剎車使能位置1,開啟所有輸出通道
TIM1->BDTR|=0xCD; // 死區時間設定
TIM1->CR1 |= 1; //開始計時
三 程式碼
/*定時器1,3路互補PWM輸出CH1,CH1N,CH2,CH2N,CH3,CH3N*/ void pwm_init(u16 arr,u16 psc) { RCC->APB2ENR|=1<<11; //TIM1時鐘使能 RCC->APB2ENR|=1<<2; //使能PORTA時鐘 RCC->APB2ENR|=1<<3; //使能PORTB時鐘 RCC->APB2ENR|=1<<0; //開啟輔助時鐘 GPIOA->CRH&=0XFFFFF000; //清除PA8,9,10配置 GPIOA->CRH|=0X00000BBB; //PA8,9,10推輓複用功能輸出 B=1011 GPIOB->CRH&=0X000FFFFF; //清除PB13,14,15配置 GPIOB->CRH|=0XBBB00000; //PB13,14,15推輓複用功能輸出 GPIOA->ODR|=1<<8; GPIOA->ODR|=1<<9;GPIOA->ODR|=1<<10; GPIOB->ODR|=1<<13; GPIOB->ODR|=1<<14;GPIOB->ODR|=1<<15; TIM1->CCR1=400; TIM1->CCR2=800; TIM1->CCR3=1200; TIM1->ARR=arr; //設定計數器自動重灌值 TIM1->PSC=psc; //預分頻器不分頻 TIM1->BDTR|=0xCD; // 死區時間設定 TIM1->CCER|=1<<0;//TIM1CH1通道開關使能 TIM1->CCER|=1<<2;//TIM1CH1N 通道開關 TIM1->CCER|=1<<4; TIM1->CCER|=1<<6; TIM1->CCER|=1<<8; TIM1->CCER|=1<<10; TIM1->CCMR1|=7<<4; //CH1 PWM2模式 TIM1->CCMR1|=1<<3; //CH1預裝載使能 TIM1->CCMR1|=7<<12; //CH2 PWM2模式 TIM1->CCMR1|=1<<11; //CH1預裝載使能 TIM1->CCMR2|=7<<4; //CH3 PWM2模式 TIM1->CCMR2|=1<<11; //CH3預裝載使能 TIM1->CR1|=0X80;// CR1 ARPE自動重灌載預裝載允許位使能 TIM1->BDTR|=1<<15; //剎車使能位置1,開啟所有輸出通道 TIM1->CR1|=0X01; //使能定時計數器1 }