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

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


    

猜你喜欢

转载自blog.csdn.net/weixin_41094315/article/details/80145657