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

发布者:独行侠客最新更新时间:2019-08-21 来源: eefocus关键字:STM32F10x  TIM1  重映射  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


关键字:STM32F10x  TIM1  重映射  PWM输出 引用地址:STM32F10x TIM1 CH3/CH4 的重映射PWM输出

上一篇:stm32 TIM1PWM多通道捕获模式测速
下一篇:stm32f103在使用定时器1重映射引脚输出PWM

推荐阅读最新更新时间:2024-11-08 17:27

STM32输出PWM时,PWM1和PWM2的区别
首先,本人虽然初学STM32但极力反对一种误人子弟的观点:“对于STM32这样级别的MCU,有库函数就不用去看寄存器怎么操作的了!” 好了,言归正传,最近总看到很多朋友对于PWM这个实验有很多的疑惑,看到原子也在极力的回复也挺累的(体谅一下幸苦的原子大神,(*^__^*) ),所以我打算写这么一篇文字来阐述一下我个人对STM32的PWM的理解。 首先来说,你要使用PWM模式你得先选择用那个定时器来输出PWM吧!除了TIM6、TIM7这两个普通的定时器无法输出PWM外,其余的定时器都可以输出PWM,每个通用定时器可以输出4路PWM,高级定时器TIM1、TIM8每个可输出7路PWM,这里为了方便起见,我们选择与实验相同的TIM3的
[单片机]
stm8s 定时器1 延时_STM8S_库函数_定时器自动装载TIM1
这里说下使用库函数方式控制STM8S103F3P6片上的定时器1,也就是TIM1,这是个高级定时器。 首先,咱们看一下STM8S103F3P6上有几个定时器,打开数据手册,可以看到如下内容: 可以看到,咱们使用的单片机,有三个定时器:TIM1、TIM2、TIM4。而TIM1是一个高级控制定时器。具体有多高级,咱们看下介绍。由于内容比较多,我这里直接放数据手册里的截图: 可以看到,TIM1的功能是非常丰富的,从基本的定时、自动装载、PWM输出、输入捕获、输出比较、单脉冲输出到各种事件的中断,都有相应的功能。 稍后的几节内容,会依次展示三个例程: 1、自动装载计时 2、测量输入信号的脉冲宽度 3、输出PW
[单片机]
stm8s 定时器1 延时_STM8S_库函数_定时器自动装载<font color='red'>TIM1</font>
STM32 定时器输出 PWM
我们通过TIM3 输出PWM 去驱动 SG90电机 配置如下 1.GPIO结构体 2.配置通用定时器结构体 3.配置定时去输出PWM结构体 4.打开时钟 — GPIO时钟,TIM定时器时钟,部分重映射时钟 5.配置PWM比较值 一 我们使用定时器3 通道2 重映射之后为PB5 GPIO_InitTypeDef GPIO_motorstruct; GPIO_motorstruct.GPIO_Mode =GPIO_Mode_AF_PP; GPIO_motorstruct.GPIO_Pin = GPIO_Pin_5; GPIO_motorstruct.GPIO_Speed =GPIO_Speed_50M
[单片机]
我对STM32F10x NVIC中断优先级的理解
NVIC中断优先级的理解 CM3支持硬件中断嵌套,分为抢占式优先级和亚优先级,使用规则主要有,抢占优先级高级别的可以打断低级别的,同一级别的抢占优先级同时发生时,亚当优先级高的先发生中断,若是相同,则按硬件排列顺序发生。若是有一个亚优先级正在执行中断,同一级别的其它亚优先级发生时,则先挂起,等此中断执行完再执行! 从库函数中找到优先级分组模式: #define NVIC_PriorityGroup_0 ((uint32_t)0x700) /* 0 bits for pre-emption priority 4 bits for subpriori
[单片机]
stm32f407多个定时器产生PWMTIM1、TIM4、TIM9)
#include pwm.h u16 Right_Forward = 100; // PB7 TIM4_CH2 void TIM42_PWM_Init(u32 arr,u32 psc , u32 CCR2_Val ) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_PinAFConfig(GP
[单片机]
STM32输出PWM状态总结
输出极性(Polarity): 基于正逻辑,即高电平为1,低电平为0 1.输出极性高(Polarity_High):高电平1为有效状态(active),低电平0为无效状态(inactive) 2.输出极性低(Polarity_Low):低电平0为有效状态(active),高电平1为无效状态(inactive) PWM Mode: 分为边沿对齐和中心对齐模式 对应向上/下计数,中心对齐计数 PWM Mode 1: 向上计数:TIMx_CNT TIMx_CCR1 active ;TIMx_CNT =TIMx_CCR1 inactive 向下计数:TIMx_CNT TIMx_CCR1 inactive ;TIMx_CNT
[单片机]
STM32应用简章之PWM输出
① 使能定时器3和相关IO口时钟。 使能定时器3时钟:RCC_APB1PeriphClockCmd(); 使能GPIOB时钟:RCC_APB2PeriphClockCmd(); ② 初始化IO口为复用功能输出。函数:GPIO_Init(); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; ③这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置, 所以需要开启AFIO时钟。同时设置重映射。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
[单片机]
STM8定时器TIM1-TIM6使用详解与实验程序
STM8定时器概述 STM8S提供三种类型的 TIM定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器来设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。 16位高级控制定时器(TIM1) ● 16位向上、向下、向上/下自动装载计数器 ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 ● 同步电路,用于使用外部信号控制定时器以及定时器互联 (某些型号的芯片没有定时器互联功能) ●
[单片机]
STM8定时器TIM1-TIM6使用详解与实验程序
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved