我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 548|回复: 0

定时器的简单配置

[复制链接]

该用户从未签到

6

主题

0

回帖

0

积分

一级逆天

积分
0

终身成就奖

QQ
发表于 2018-4-20 12:16:29 | 显示全部楼层 |阅读模式
#include "bsp_GeneralTim.h"


///*
// * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
// * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
// * 另外三个成员是通用定时器和高级定时器才有.
// *-----------------------------------------------------------------------------
// *typedef struct
// *{ TIM_Prescaler            都有
// *    TIM_CounterMode                 TIMx,x[6,7]没有,其他都有
// *  TIM_Period               都有
// *  TIM_ClockDivision        TIMx,x[6,7]没有,其他都有
// *  TIM_RepetitionCounter    TIMx,x[1,8,15,16,17]才有
// *}TIM_TimeBaseInitTypeDef;
// *-----------------------------------------------------------------------------
// */

void TIM1_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;        
        // 开启定时器时钟,即内部时钟CK_INT=72M
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   
        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period=TIM1_Period;
      // 时钟预分频数
    TIM_TimeBaseStructure.TIM_Prescaler=TIM1_Prescaler;   
        // 时钟分频因子 ,没用到不用管
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
        // 计数器计数模式,设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;         
        // 重复计数器的值,没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;   
      // 初始化定时器
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
   
        // 清除计数器中断标志位
    TIM_ClearFlag(TIM1, TIM_FLAG_Update);
      
        // 开启计数器中断
    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
        
        // 使能计数器
    TIM_Cmd(TIM1, ENABLE);
   
        /********** 中断优先级配置**************/
    NVIC_InitTypeDef NVIC_InitStructure;
        // 设置中断组为1
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        
        // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn ;   
        // 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     
      // 设置抢占优先级为3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;   
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void TIM2_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;        
        // 开启定时器时钟,即内部时钟CK_INT=72M
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   
        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period=TIM2_Period;
      // 时钟预分频数
    TIM_TimeBaseStructure.TIM_Prescaler=TIM2_Prescaler;   
        // 时钟分频因子 ,没用到不用管
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
        // 计数器计数模式,设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;         
        // 重复计数器的值,没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;   
      // 初始化定时器
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
        // 清除计数器中断标志位
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
        // 开启计数器中断
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);   
        // 使能计数器
    TIM_Cmd(TIM2, ENABLE);
   
    /********** 中断优先级配置**************/
    NVIC_InitTypeDef NVIC_InitStructure;
        // 设置中断组为1
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        
        // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn ;   
        // 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     
      // 设置抢占优先级为3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;   
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}

void TIM3_PWM_Config(void)
{   
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
  // 开启定时器时钟,即内部时钟CK_INT=72M
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

      /* 输出比较通道1、2、3、4 GPIO 初始化*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
        
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
/*--------------------时基结构体初始化-------------------------*/
   
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period=TIM3_Period;   
    // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
    TIM_TimeBaseStructure.TIM_Prescaler=TIM3_Prescaler;   
    // 时钟分频因子 ,配置死区时间时需要用到
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
    // 计数器计数模式,设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        
    // 重复计数器的值,没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;   
    // 初始化定时器
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

    /*--------------------输出比较结构体初始化-------------------*/   
    // 配置为PWM模式1
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    // 输出使能
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    // 输出通道电平极性配置   
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   
    // 输出比较通道 1
    TIM_OCInitStructure.TIM_Pulse = 400;
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
   
    // 输出比较通道 2
    TIM_OCInitStructure.TIM_Pulse = 500;
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
   
    // 输出比较通道 3
    TIM_OCInitStructure.TIM_Pulse = 600;
    TIM_OC3Init(TIM3, &TIM_OCInitStructure);
    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
   
    // 输出比较通道 4
    TIM_OCInitStructure.TIM_Pulse = 700;
    TIM_OC4Init(TIM3, &TIM_OCInitStructure);
    TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
   
    // 使能计数器
    TIM_Cmd(TIM3, ENABLE);
}

void TIM5_CCx_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
  // 开启定时器时钟,即内部时钟CK_INT=72M
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);

    /*********** 输入捕获通道 GPIO 初始化*********/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
/*--------------------时基结构体初始化-------------------------*/   
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period=TIM5_Period;   
    // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
    TIM_TimeBaseStructure.TIM_Prescaler= TIM5_Prescaler;   
    // 时钟分频因子 ,配置死区时间时需要用到
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
    // 计数器计数模式,设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        
    // 重复计数器的值,没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;   
    // 初始化定时器
    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);

    /*--------------------输入捕获结构体初始化-------------------*/   
    TIM_ICInitTypeDef TIM_ICInitStructure;
    // 配置输入捕获的通道,需要根据具体的GPIO来配置
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    // 输入捕获信号的极性配置
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    // 输入通道和捕获通道的映射关系,有直连和非直连两种
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    // 输入的需要被捕获的信号的分频系数
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    // 输入的需要被捕获的信号的滤波系数
    TIM_ICInitStructure.TIM_ICFilter = 0;
    // 定时器输入捕获初始化
    TIM_ICInit(TIM5, &TIM_ICInitStructure);
   
    // 清除更新和捕获中断标志位
    TIM_ClearFlag(TIM5, TIM_FLAG_Update|TIM_IT_CC1);   
  // 开启更新和捕获中断  
    TIM_ITConfig (TIM5, TIM_IT_Update | TIM_IT_CC1, ENABLE );
    // 使能计数器
    TIM_Cmd(TIM5, ENABLE);
   
    /********** 中断优先级配置*********/
    NVIC_InitTypeDef NVIC_InitStructure;
    // 设置中断组为1
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        
        // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn ;   
        // 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     
      // 设置抢占优先级为3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   
}

void TIM6_Mode_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
   
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        
        // 开启定时器时钟,即内部时钟CK_INT=72M
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);   
   
        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period = TIM6_Period;   

      // 时钟预分频数为
    TIM_TimeBaseStructure.TIM_Prescaler= TIM6_Prescaler;
   
        // 时钟分频因子 ,基本定时器没有,不用管
    //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        
        // 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
    //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        
        // 重复计数器的值,基本定时器没有,不用管
        //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
   
      // 初始化定时器
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
        
        // 清除计数器中断标志位
    TIM_ClearFlag(TIM6, TIM_FLAG_Update);
      
        // 开启计数器中断
    TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
        
        // 使能计数器
    TIM_Cmd(TIM6, ENABLE);   
   
        /********** 中断优先级配置**************/
        // 设置中断组为0
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        
        // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn ;   
        // 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     
      // 设置抢占优先级为3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


/*********************************************END OF FILE**********************/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表