教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6

关于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输出通道。
//
教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第1张图片//由上图可知,PB5是可以由TIM3_CH2输出PWM的,又因为我们使用了复用功能,所以先开启复用端口时钟AFIO。
//教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第2张图片//由上图可知,AFIO位于APB2总线下,那么我们就可以使能APB2。
//在这里插入图片描述

//开启GPIO时钟
RCC->APB2ENR|=1<<3;

//由前面可知,LED端口为PB5,那么我们需要先开启GPIOB时钟。
//
教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第3张图片//
在这里插入图片描述

//开启APB1下的TIM3的时钟
RCC->APB1ENR|=1<<1;

//又因为我们用的是TIM3的CH2通道来输出PWM,那自然而然就应该开启TIM3时钟。
//
教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第4张图片//
在这里插入图片描述

//2.重映射,将TIM3_CH2映射到PB5
AFIO->MAPR|=0x02<<10;

//
教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第5张图片//
教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第6张图片

//3.设置TIM3_CH2所对应的GPIO的输出模式
GPIOB->CRL|=0x0B<<20;	//设置PB5,为复用推免输出模式,输出频率50MHz

//因为我们这里PB5是输出引脚,是为了驱动LED0这个外设的。
//这里简单提一下为什么这里设置为推挽输出,而不是开漏输出模式,那是因为虽然开漏输出模式适用于大电流模式,但是要产生高电平的话,我们必须在外界外加上拉电阻才能达到效果,但是推挽输出则不需要这样。
//
教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第7张图片//教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第8张图片

//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模式较好,方便占空比计算

//教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第9张图片//这个模式1和模式2的配置方法一样,由于我们想要默认是低电平,有效电平为高电平,所以我们这里就设置为PWM模式2。
//
在这里插入图片描述//教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第10张图片

//5.2设置极性
TIM3->CCER&=~(1<<5);	//希望高电平为有效状态

//
教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第11张图片//
在这里插入图片描述//由前面我们可以知道高电平有效,所以该位设置为0。

//5.3使能OC
TIM3->CCER=1<<4;

//教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第12张图片//同上述,这里使OCx输出使能,所以该位为1。
//
在这里插入图片描述

//5.4设置OCxPE
TIM3->CCMR1|=1<<11;

//教你手写PWM输出(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.6_第13张图片//
在这里插入图片描述

//5.5使能ARPE
TIM3->CR1|=1<<7;

//
在这里插入图片描述

你可能感兴趣的:(嵌入式(stm32))