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

本文介绍如何在STM32上配置高级定时器TIM1,实现双PWM输出功能。通过重映射将TIM1_CH3和TIM1_CH4连接到PE13和PE14引脚,并提供了两种版本的源码示例:基础版和应用版。应用版源码还支持占空比调节和更直观的初始化参数设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事情经过

      最近做项目,由于板子的布局以及芯片资源紧缺的原因,不得不想办法把偏僻的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

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


    
#include "stm32f10x.h" // Device header void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //使能定时器TIM4时钟,注意TIM4时钟为APB1 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能PWM输出GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//定时器TIM4PWM输出通道1,TIM4_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//定时器TIM4PWM输出通道2,TIM4_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//定时器TIM4PWM输出通道3,TIM4_CH3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//定时器TIM4PWM输出通道4,TIM4_CH4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO TIM_TimeBaseStructure.TIM_Period = 100 - 1;//arr;//自动重装值 TIM_TimeBaseStructure.TIM_Prescaler =718 - 1;//psc; //时钟预分频数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //初始化TIM4 //初始化TIM4_CH1PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//??PWM??1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//?????? TIM_OCInitStructure.TIM_Pulse = 90; // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//?????? TIM_OC1Init(TIM4, &TIM_OCInitStructure);//???TIM4_CH1 //初始化TIM4_CH2的PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 90; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //TIM4_CH2初始化,OC2 TIM_OC2Init(TIM4, &TIM_OCInitStructure); //初始化TIM4_CH3PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 90; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM4, &TIM_OCInitStructure); //初始化TIM4_CH4PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 90; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC4Init(TIM4, &TIM_OCInitStructure); //使能4个通道的预装载寄存器 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC1 TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC2 TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC3 TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC4 TIM_ARRPreloadConfig(TIM4, ENABLE); //使能重装寄存器 TIM_Cmd(TIM4, ENABLE);//使能定时器TIM4,准备工作 }
03-26
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值