废话就不多说了,开始。。。
一、stm32的pwm输出引脚是使用的IO口的复用功能。
二、T2~T5这4个通用定时器都可输出4路PWM——CH1~CH4。
三、我们以tim3的CH1路pwm输出为例来停止图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。
步调如下:
1、使能TIM3时钟
RCC->APB1ENR |= 1 << 1;
2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL &= 0XF0FFFFFF;//PA6清0 GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出) GPIOA->ODR |= 1 << 6;//PA6上拉
3、设定计数器主动重装值及是不是分频
TIM3->ARR = arr;//设定计数器主动重装值(决定PWM的频率) TIM3->PSC = psc;//预分频器,0为不分频
4、设置PWM的模式(有1和2两种模式,区分在于输出电平极性相反),根据需求选一种便可
注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。
//TIM3->CCMR1 |= 6 << 4;//CH1 PWM1模式
TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式 TIM3->CCMR1 |= 1 << 3;//CH1预装载使能
5、输出使能设置
TIM3->CCER |= 1 << 0;//输入/捕获1输出使能
6、主动重装载预装载允许位(ARPE) 及 定时器 使能
TIM3->CR1 = 0X0080;//ARPE使能(此句不配置也行) TIM3->CR1 |= 0X01;//使能定时器3
下面给出TIM3_CH1及TIM3_CH2的PWM输出代码:
void PWM_Init_TIM3_CH1(u16 arr, u16 psc)
{//1、使能TIM3时钟
RCC->APB1ENR |= 1 << 1;//使能TIM3时钟
//2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出) GPIOA->ODR |= 1 << 6;//PA6上拉//3、设定计数器主动重装值及是不是分频
TIM3->ARR = arr;//设定计数器主动重装值(决定PWM的频率)
TIM3->PSC = psc;//预分频器 0为不分频 //4、设置PWM的模式 TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式 TIM3->CCMR1 |= 1 << 3;//CH1预装载使能 //5、输出使能设置TIM3->CCER |= 1 << 0;//输入/捕获1输出使能
//6、主动重装载预装载允许位(ARPE) 及 定时器 使能
TIM3->CR1 = 0X0080;//ARPE使能
TIM3->CR1 |= 0X01;//使能定时器3 }void PWM_Init_TIM3_CH2(u16 arr, u16 psc)
{ RCC->APB1ENR |= 1 << 1;//使能TIM3时钟 GPIOA->CRL &= 0X0FFFFFFF;//PA7清0 GPIOA->CRL |= 0XB0000000;//复用功能输出(推挽50MHz输出) GPIOA->ODR |= 1 << 7;//PA7上拉TIM3->ARR = arr;//设定计数器主动重装值(决定PWM的频率)
TIM3->PSC = psc;//预分频器 不分频TIM3->CCMR1 |= 7 << 12;//CH2 PWM2模式
TIM3->CCMR1 |= 1 << 11;//CH2预装载使能TIM3->CCER |= 1 << 4;//输入/捕获2输出使能
TIM3->CR1 = 0X0080;//ARPE使能 TIM3->CR1 |= 0X01;//使能定时器3 }
文章结束给大家分享下程序员的一些笑话语录: 马云喜欢把自己包装成教主,张朝阳喜欢把自己包装成明星,李彦宏喜欢把自己包装成的很知性,丁磊喜欢把自己包装的有创意,李开复总摆出一副叫兽的样子。看来的。其实我想说,缺啥补啥,人之常情。
--------------------------------- 原创文章 By
配置和模式---------------------------------