事情经过
最近做项目,由于板子的布局以及芯片资源紧缺的原因,不得不想办法把偏僻的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
上一篇:stm32 TIM1PWM多通道捕获模式测速
下一篇:stm32f103在使用定时器1重映射引脚输出PWM
推荐阅读最新更新时间:2024-11-08 17:27
设计资源 培训 开发板 精华推荐
- AD9736-EB,使用 AD9736、14 位、1.2 GSPS 串行电压输出数模转换器的评估板
- 使用 Analog Devices 的 ADR435B 的参考设计
- 【训练营_进阶班】基于阿里云智能的插座-699720A-贾金鹏
- 用于便携式的 16 位、250KSPS、2CH DAC
- ADA4075-2ARZ-R7 低功耗运算放大器的典型 DAC 输出滤波器电路(差分)
- LM3886 双声道 双电源
- 使用 Analog Devices 的 ADR443A 的参考设计
- 使用 Analog Devices 的 ADP2105ACPZ 的参考设计
- LT1506IR-3.3 SYNC 双路输出 SEPIC 转换器的典型应用电路
- MPC55xxADAPTERS: MPC55xx适配器