您的位置 首页 基础

STM32 通用定时器的几种装备方法

1、普通定时使用includestm32f10xhincludetimehstaticTime_NVIC_Config(void){NVIC_InitTypeDefNVIC_InitStructure

1、一般守时运用

#include”stm32f10x.h”
#include”time.h”

static Time_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);
}

static void Time_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE);
//TIM_DeInit(TIM2);

TIM_TimeBaseInitStructure.TIM_Prescaler =(10000-1); //时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period =(7200-1); //主动重装寄存器
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上计数形式
TIM_TimeBaseInitStructure.TIM_ClockDivision =0; //时钟切割,这儿不触及
#if 0
TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
#endif

TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure); //装备参数
TIM_ClearITPendingBit(TIMx,TIM_IT_Update); //铲除中止标明位
TIM_ITConfig(TIMx,TIM_IT_Update,ENABLE); //中止装备
TIM_Cmd(TIMx,ENABLE); //发动守时器
}

void Time_Init(void)
{
Time_Config(); //守时器装备
Time_NVIC_Config(); //嵌套中止向量初始化

}

2、PWM输出

#include”stm32f10x.h”
#include”time.h”

#if 0

static Time_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);
}
#endif

void Time_OUT_PWM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(TIMx_OUT_GPIO_RCC,ENABLE);

GPIO_InitStructure.GPIO_Pin =TIMx_OUT_Pin;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP; //复用推免式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(TIMx_OUT_Port, &GPIO_InitStructure);
}

static void Time_OUT_PWM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE); //敞开时钟
TIM_DeInit(TIM2);

TIM_TimeBaseInitStructure.TIM_Prescaler =(100-1); //时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period =(1000-1); //主动重装寄存器 PWM频率:72M/100/1000=720Hz
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上计数形式
TIM_TimeBaseInitStructure.TIM_ClockDivision =0; //时钟分频,这儿不触及
#ifdef Time1
TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
#endif

TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure); //装备参数
TIM_ClearITPendingBit(TIMx,TIM_IT_Update); //铲除中止标明位

TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM1; //PWM1形式 OCx电平依据ARR与CCRx比较成果产生回转
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //输出使能通道1
#ifdef Time1
TIM_OCInitStructure.TIM_OutputNState =;
#endif
TIM_OCInitStructure.TIM_Pulse =CCR1_VAL; //占空比800/1000
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_Low; //计数器值小于CCR值时输出高电平
#ifdef Time1
TIM_OCInitStructure.TIM_OCNPolarity =;
TIM_OCInitStructure.TIM_OCIdleState =;
TIM_OCInitStructure.TIM_OCNIdleState =;
#endif

TIM_OC1Init(TIMx,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIMx,TIM_OCPreload_Enable); //使能CCR1预装载

TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //输出使能通道2
TIM_OCInitStructure.TIM_Pulse =CCR2_VAL;

TIM_OC2Init(TIMx,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIMx,TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //输出使能通道3
TIM_OCInitStructure.TIM_Pulse =CCR3_VAL;
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;

TIM_OC3Init(TIMx,&TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIMx,TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //输出使能通道4
TIM_OCInitStructure.TIM_Pulse =CCR4_VAL;

TIM_OC4Init(TIMx,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIMx,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIMx,ENABLE); //敞开ARR预装载
TIM_Cmd(TIMx,ENABLE); //发动守时器
}

void Time_OUT_PWM_Init(void)
{
Time_OUT_PWM_GPIO_Config();
Time_OUT_PWM_Config(); //守时器装备
}

3、输出比较形式

#include”stm32f10x.h”
#include”time.h”

static Time_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);
}

static void Time_OUT_PWM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(TIMx_OUT_GPIO_RCC,ENABLE);

GPIO_InitStructure.GPIO_Pin =TIMx_OUT_Pin;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP; //复用推免式输出
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

GPIO_Init(TIMx_OUT_Port, &GPIO_InitStructure);
}

static void Time_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; //通用推免式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);
}

static void Time_OUT_PWM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE); //敞开时钟
TIM_DeInit(TIM2);

TIM_TimeBaseInitStructure.TIM_Prescaler =(100-1); //时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period =(1000-1); //主动重装寄存器 PWM频率:72M/100/1000=720Hz
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上计数形式
TIM_TimeBaseInitStructure.TIM_ClockDivision =0; //时钟分频,这儿不触及
#ifdef Time1
TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
#endif

TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure); //装备参数
TIM_ClearITPendingBit(TIMx,TIM_IT_Update); //铲除中止标明位

TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Inactive; //ARR与CCRx相一起强制OCxREF为低
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //输出使能通道1
#ifdef Time1
TIM_OCInitStructure.TIM_OutputNState =;
#endif
TIM_OCInitStructure.TIM_Pulse =CCR1_VAL;
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; //OCx=!OCxREF _High OCx=OCxREF
#ifdef Time1
TIM_OCInitStructure.TIM_OCNPolarity =;
TIM_OCInitStructure.TIM_OCIdleState =;
TIM_OCInitStructure.TIM_OCNIdleState =;
#endif

TIM_OC1Init(TIMx,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIMx,TIM_OCPreload_Enable); //使能CCR1预装载
TIM_ITConfig(TIMx,TIM_IT_CC1,ENABLE); //使能OC1比较中止

TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Active; //ARR与CCRx相一起强制OCxREF为高
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //输出使能通道2
TIM_OCInitStructure.TIM_Pulse =CCR2_VAL;
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_Low; //OCx=!OCxREF _High OCx=OCxREF

TIM_OC2Init(TIMx,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIMx,TIM_OCPreload_Enable);
TIM_ITConfig(TIMx,TIM_IT_CC2,ENABLE);

TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Timing; //ARR与CCRx比较成果对OCxREF无效
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //输出使能通道3
TIM_OCInitStructure.TIM_Pulse =CCR3_VAL;
TIM_ITConfig(TIMx,TIM_IT_CC3,ENABLE);

TIM_OC3Init(TIMx,&TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIMx,TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM1; //ARR与CCRx比较成果对OCxREF选用PWM1形式
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //输出使能通道4
TIM_OCInitStructure.TIM_Pulse =CCR4_VAL;
//TIM_ITConfig(TIMx,TIM_IT_CC4,ENABLE); //PWM就没有必要设置中止 当然也能够在中止里边改动占空比

TIM_OC4Init(TIMx,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIMx,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIMx,ENABLE); //敞开ARR预装载
TIM_Cmd(TIMx,ENABLE); //发动守时器
}

void Time_OUT_PWM_Init(void)
{
Time_OUT_PWM_GPIO_Config();
Time_GPIO_Config();
Time_NVIC_Config();
Time_OUT_PWM_Config(); //守时器装备
}

4、PWMI形式

#include”stm32f10x.h”
#include”time.h”

static Time_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/259161.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部