STM32F10x TIM1 CH3/CH4 的重映射PWM输出

事情经过

      最近做项目,由于板子的布局以及芯片资源紧缺的原因,不得不想办法把偏僻的PE口的 高级定时器TIM1的PWM利用起来,我做的是TIM1_CH3、 TIM1_CH4 的 重映射 两路PWM输出(PE13,PE14) ,TIM1是高级定时器,与一般的普通定时器配置略有不同,所以起初的时候我是上网查了TIM1的重映射PWM配置的,也查到一些别人可以用的代码,但是由于我想让配置过程接近正点原子的例程,也方便规范些就自己写了。
            下面将会分享 1.基础版源码 和 2.应用版源码(+占空比调节+pwm周期客观初始化)大笑
            偷笑偷笑是索曲期结束,贡献期到来的时候啦!废话不多说!贴代码!


1.基础版源码

    .c文件
#include "timer.h"
#include "led.h"
   	  
//TIM1 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	TIM_DeInit(TIM1);//初始化TIM1寄存器
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);	//使能定时器1时钟
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);  //使能GPIO外设
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  //AFIO复用功能模块时钟

	GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE); //Timer1部分重映射  TIM1_CH3->PE13    TIM1_CH4->PE14  
 
  //设置该引脚为复用输出功能,输出TIM1 CH3的PWM脉冲波形	GPIOE.13
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //TIM_CH3
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO
	
		/*******************************<加入此段则为双pwm输出>**************************************/
			//设置该引脚为复用输出功能,输出TIM1 CH4的PWM脉冲波形	GPIOE.14
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //TIM_CH4
			GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO
		/*********************************************************************/
 
   //初始化TIM1
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	//初始化TIM1 Channel 2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	
	TIM_OC3Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 OC3
	TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR3上的预装载寄存器
	
			/*******************************<加入此段则为双pwm输出>**************************************/
			TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 OC4
			TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR4上的预装载寄存器
			/*******************************<加入此段则为双pwm输出>**************************************/
 
  TIM_ARRPreloadConfig(TIM1, ENABLE);                //使能TIMx在ARR上的预装载寄存器
  TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能,高级定时器必须开启这个 
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1	

}

     .H文件

#ifndef __TIMER_H
#define __TIMER_H
#include "stm32f10x.h" 

void TIM1_PWM_Init(u16 arr,u16 psc);

#endif

2.应用版源码

    .c文件
#include "time1ch34pwm.h"
#include "led.h"
#include "usart.h"
 
u16 the_arr=0;

/*********************************************************************************
函数名称:TIM1_PWM3_4_Init_control
函数功能:初始化tim1的 通道3 和 通道4 的PWM输出,并且提供更加客观的 
					-> 中断时间间隔+计数器周期时间 的tim1时钟初始值设定
入口参数:xms 			计数器3的中断时间间隔 x ms 
				 unit_ms 	计数器一个周期的时间 y ms(注意y<=0.91ms) 	 
返回值:无
*********************************************************************************/
void TIM1_PWM3_4_Init_control(float xms,float unit_ms)
{
	u16 psc;
	u16 arr;
	psc=unit_ms*72000000/1000-1;
	arr=xms/unit_ms-1;
	the_arr=arr;
	TIM1_PWM3_PWM4_Init(arr,psc);
}

/*********************************************************************************
函数名称:TIM1_PWM3_PWM4_Init
函数功能:初始化tim1的 通道3 和 通道4 的PWM输出
入口参数:arr:自动重装值
				 psc:时钟预分频数 	 
返回值:无
*********************************************************************************/
void TIM1_PWM3_PWM4_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	TIM_DeInit(TIM1);//初始化TIM1寄存器
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);	//使能定时器1时钟
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);  //使能GPIO外设
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  //AFIO复用功能模块时钟

	GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE); //Timer1部分重映射  TIM1_CH3->PE13    TIM1_CH4->PE14  
 
   //设置该引脚为复用输出功能,输出TIM1 CH3的PWM脉冲波形	GPIOE.13
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //TIM_CH3
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO
	
				//设置该引脚为复用输出功能,输出TIM1 CH4的PWM脉冲波形	GPIOE.14
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //TIM_CH4
			GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM1
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	//初始化TIM1 Channel 2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
	
	TIM_OC3Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 OC3
	TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR3上的预装载寄存器
	
			TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 OC4
			TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR4上的预装载寄存器
 
  TIM_ARRPreloadConfig(TIM1, ENABLE);                //使能TIMx在ARR上的预装载寄存器
  TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能,高级定时器必须开启这个 
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1	

}

/*********************************************************************************
函数名称:TIM1_PWM3_DutyRatio
函数功能:设置tim1的 通道3 的PWM输出的 占空比(DutyRatio)
入口参数:DutyRatio 设置占空比 (应为 0.0->1.0 的小数)	 
返回值:无
*********************************************************************************/
void TIM1_PWM3_DutyRatio(float DutyRatio)
{
	u16 temp;
	temp=(float)(the_arr)*DutyRatio+0.5;
	TIM_SetCompare3(TIM1,temp);
}

/*********************************************************************************
函数名称:TIM1_PWM4_DutyRatio
函数功能:设置tim1的 通道4 的PWM输出的 占空比(DutyRatio)
入口参数:DutyRatio 设置占空比 (应为 0.0->1.0 的小数)	 
返回值:无
*********************************************************************************/
void TIM1_PWM4_DutyRatio(float DutyRatio)
{
	u16 temp;
	temp=(float)(the_arr)*DutyRatio+0.5;
	TIM_SetCompare4(TIM1,temp);
}

    .H文件

#ifndef __TIME1CH34PWM_H
#define __TIME1CH34PWM_H
#include "sys.h"

void TIM1_PWM3_PWM4_Init(u16 arr,u16 psc); 							// 初始化tim1的 通道3 和 通道4 的PWM输出,并且提供更加客观的 -> 中断时间间隔+计数器周期时间 的tim1时钟初始值设定
void TIM1_PWM3_4_Init_control(float xms,float unit_ms); // 初始化tim1的 通道3 和 通道4 的PWM输出
void TIM1_PWM3_DutyRatio(float DutyRatio); 							// 设置tim1的 通道3 的PWM输出的 占空比(DutyRatio)
void TIM1_PWM4_DutyRatio(float DutyRatio); 							// 设置tim1的 通道4 的PWM输出的 占空比(DutyRatio)

#endif

    
    以上就是这些啦!如果觉得好的话,别忘点个赞。老铁!关注一波哈! 生气


    
  • 22
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
PA11引脚是STM32微控制器中的一个GPIO引脚,可以用于多种功能,并且具备输出PWM信号的能力。在使用TIM1CH4通道进行PWM输出时,我们需要进行一些设置和配置。 首先,我们需要将PA11引脚配置为复用功能。这可以通过设置GPIO端口模式控制寄存器(GPIOx_MODER)中的相应位来实现。具体来说,我们需要将PA11引脚配置为“复用功能”模式,即设置其MODE[1:0]位为“10”。 然后,我们需要选择相应的复用功能。这可以通过设置GPIO复用功能高位寄存器(GPIOx_AFRL或GPIOx_AFRH)中的相应位来实现。对于PA11引脚,我们需要选择TIM1作为其复用功能。因此,我们需要在GPIOx_AFRL或GPIOx_AFRH中相应的位置上设置TIM1的编号。具体来说,我们需要将PA11引脚的AF[7:0]位设置为“00000001”,表示选择TIM1。 接下来,我们需要对TIM1进行配置,使其能够生成PWM信号并输出到PA11引脚。具体的配置包括设置TIM1的时钟源、预分频因子和周期等参数,以及在CH4通道上启用PWM输出和设置脉冲宽度。这些配置可以通过对TIM1相关寄存器进行适当的设置来完成,具体的设置步骤可以参考STM32的技术手册和参考资料。 最后,我们需要将TIM1使能,以便开始生成PWM信号并输出到PA11引脚。这可以通过设置TIM1的使能位来实现。通过配置相关的TIM1使能位后,PWM信号就会根据我们之前的设置进行生成,并通过PA11引脚输出到外部电路中。 总结起来,要使用PA11进行PWM输出,我们需要先进行相应的引脚配置,然后对TIM1进行详细的配置,最后使能TIM1,才能实现PWM信号的生成和输出。通过这些步骤的操作,我们就能够在PA11引脚上实现所需的PWM输出功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值