这里写目录标题

  • 0. 声明
  • 1.定时器时钟树
  • 2.定时器中结构体分析
    • 2.1TIM时基初始化结构定义
    • 2.2TIM输出比较初始化结构定义
    • 2.3TIM输入捕获初始化结构定义
    • 2.4BDTR结构定义
  • 3.定时器溢出中断
  • 4.定时器PWM输出分析
  • 5.定时器比较输出分析

0. 声明

需要先学习的基础内容:1.请在时钟树的基础上进行定时器的学习,不然会知其然不知其所以然。2.GPIO配置基础  3.NVIC中断优先级配置基础    4.串口通信基础(可有可无,主要用于查看调试信息)5.可以先进行基本定时器和通用定时器的学习

1.定时器时钟树

2.定时器中结构体分析

2.1TIM时基初始化结构定义

/** * @brief  TIM Time Base Init structure definition  * @note   This structure is used with all TIMx except for TIM6 and TIM7.  */typedef struct
{uint16_t TIM_Prescaler;         /*!< Specifies the prescaler value used to divide the TIM clock.This parameter can be a number between 0x0000 and 0xFFFF */uint16_t TIM_CounterMode;       /*!< Specifies the counter mode.This parameter can be a value of @ref TIM_Counter_Mode */uint32_t TIM_Period;            /*!< Specifies the period value to be loaded into the activeAuto-Reload Register at the next update event.This parameter must be a number between 0x0000 and 0xFFFF.  */ uint16_t TIM_ClockDivision;     /*!< Specifies the clock division.This parameter can be a value of @ref TIM_Clock_Division_CKD */uint8_t TIM_RepetitionCounter;  /*!< Specifies the repetition counter value. Each time the RCR downcounterreaches zero, an update event is generated and counting restartsfrom the RCR value (N).This means in PWM mode that (N+1) corresponds to:- the number of PWM periods in edge-aligned mode- the number of half PWM period in center-aligned modeThis parameter must be a number between 0x00 and 0xFF. @note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef; 

2.2TIM输出比较初始化结构定义

/** * @brief  TIM Output Compare Init structure definition  */typedef struct
{uint16_t TIM_OCMode;        /*!< Specifies the TIM mode.This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */uint16_t TIM_OutputState;   /*!< Specifies the TIM Output Compare state.This parameter can be a value of @ref TIM_Output_Compare_State */uint16_t TIM_OutputNState;  /*!< Specifies the TIM complementary Output Compare state.This parameter can be a value of @ref TIM_Output_Compare_N_State@note This parameter is valid only for TIM1 and TIM8. */uint32_t TIM_Pulse;         /*!< Specifies the pulse value to be loaded into the Capture Compare Register. This parameter can be a number between 0x0000 and 0xFFFF */uint16_t TIM_OCPolarity;    /*!< Specifies the output polarity.This parameter can be a value of @ref TIM_Output_Compare_Polarity */uint16_t TIM_OCNPolarity;   /*!< Specifies the complementary output polarity.This parameter can be a value of @ref TIM_Output_Compare_N_Polarity@note This parameter is valid only for TIM1 and TIM8. */uint16_t TIM_OCIdleState;   /*!< Specifies the TIM Output Compare pin state during Idle state.This parameter can be a value of @ref TIM_Output_Compare_Idle_State@note This parameter is valid only for TIM1 and TIM8. */uint16_t TIM_OCNIdleState;  /*!< Specifies the TIM Output Compare pin state during Idle state.This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State@note This parameter is valid only for TIM1 and TIM8. */
} TIM_OCInitTypeDef;

2.3TIM输入捕获初始化结构定义


/** * @brief  TIM Input Capture Init structure definition  */typedef struct
{uint16_t TIM_Channel;      /*!< Specifies the TIM channel.This parameter can be a value of @ref TIM_Channel */uint16_t TIM_ICPolarity;   /*!< Specifies the active edge of the input signal.This parameter can be a value of @ref TIM_Input_Capture_Polarity */uint16_t TIM_ICSelection;  /*!< Specifies the input.This parameter can be a value of @ref TIM_Input_Capture_Selection */uint16_t TIM_ICPrescaler;  /*!< Specifies the Input Capture Prescaler.This parameter can be a value of @ref TIM_Input_Capture_Prescaler */uint16_t TIM_ICFilter;     /*!< Specifies the input capture filter.This parameter can be a number between 0x0 and 0xF */
} TIM_ICInitTypeDef;

2.4BDTR结构定义

(此结构仅与TIM1和TIM8一起使用。)

/** * @brief  BDTR structure definition * @note   This structure is used only with TIM1 and TIM8.    */typedef struct
{uint16_t TIM_OSSRState;        /*!< Specifies the Off-State selection used in Run mode.This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */uint16_t TIM_OSSIState;        /*!< Specifies the Off-State used in Idle state.This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */uint16_t TIM_LOCKLevel;        /*!< Specifies the LOCK level parameters.This parameter can be a value of @ref TIM_Lock_level */ uint16_t TIM_DeadTime;         /*!< Specifies the delay time between the switching-off and theswitching-on of the outputs.This parameter can be a number between 0x00 and 0xFF  */uint16_t TIM_Break;            /*!< Specifies whether the TIM Break input is enabled or not. This parameter can be a value of @ref TIM_Break_Input_enable_disable */uint16_t TIM_BreakPolarity;    /*!< Specifies the TIM Break Input pin polarity.This parameter can be a value of @ref TIM_Break_Polarity */uint16_t TIM_AutomaticOutput;  /*!< Specifies whether the TIM Automatic Output feature is enabled or not. This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */
} TIM_BDTRInitTypeDef;

3.定时器溢出中断


/*函数名:void Timer1_Init(u16 arr,u16 psc) 函数功能: TIM1定时器溢出中断初始化传入参数:arr:计数值psc:预分频数值
*/void Timer1_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef   TIM_TimeBaseInitStrecture;     //定时器时基初始化结构体NVIC_InitTypeDef   NVIC_InitStructure;   //中断优先级配置结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);  /*使能定时器1的时钟*/TIM_TimeBaseInitStrecture.TIM_Period = arr;  /*重装载寄存器数值*/TIM_TimeBaseInitStrecture.TIM_Prescaler = psc-1; /*预分配数值*/TIM_TimeBaseInitStrecture.TIM_ClockDivision = TIM_CKD_DIV1; /*时钟分频*/TIM_TimeBaseInitStrecture.TIM_CounterMode = TIM_CounterMode_Up; /*向上计数*/TIM_TimeBaseInitStrecture.TIM_RepetitionCounter = 0; /*重复计数寄存器*/TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStrecture); /*初始化*/TIM_ClearFlag(TIM1,TIM_FLAG_Update); /*清更新标志位*/TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); /*使能中断*/TIM_Cmd(TIM1,ENABLE); /*使能计数*/NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn;/*定时器1的中断通道使能*/NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/*定时器1的中断通道使能*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;/*抢占优先级*/NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;/*响应优先级*/NVIC_Init(&NVIC_InitStructure);/*配置中断分组,并使能中断*/
}//函数名: void TIM1_UP_TIM10_IRQHandler(void)
//函数功能: TIM1定时器溢出中断,中断服务函数。
void TIM1_UP_TIM10_IRQHandler(void)
{if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)//检查指定的TIM中断发生与否:TIM 中断源 {   LED1=~LED1;   TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除TIMx的中断待处理位:TIM 中断源  }
}

4.定时器PWM输出分析

5.定时器比较输出分析

目前遇到一个小的BUG ,就是在自动重装载值,比较小的时候,反转输出会出现各种问题哟!!!
目前先理解到这里,先不向后面继续理解了!!!
// 第一步: 进行引脚的配置-->   把TIM1高级定时器的通道1,  复用到GPIOE_9上面。
void  STEPMOTOR_TIM1_Init_GPIO()
{GPIO_InitTypeDef    GPIO_InitStructure;         //基本定时器结构体RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);   //引脚时钟结构体初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;        //引脚 PE9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;     //复用到TIM1 通道1上面。GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   //推挽输出  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //翻转速度100MGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  //上拉GPIO_Init(GPIOE, &GPIO_InitStructure);        //初始化GPIO GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1);   //复用配置
}//第二步 :进行定时器的基本时基部分的配置 比较输出使能的配置 还有关于中断的优先级配置
void  STEPMOTOR_TIM1_Init(void)
{TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;   //定时器基本结构体TIM_OCInitTypeDef   TIM_OCInitStructure;           //定时器比较输出结构体NVIC_InitTypeDef    NVIC_InitStructure;            //中断配置结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);     //开定时器时钟(高速时钟)STEPMOTOR_TIM1_Init_GPIO();    //调用引脚函数。 TIM_TimeBaseStructure.TIM_Period = 0XFFFF;    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  TIM_TimeBaseStructure.TIM_Prescaler =168-1;   //设置用来作为TIMx时钟频率除数的预分频值  不分频   168MTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;     // 比较输出模式:反转输出TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;   //比较输出使能TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Disable;   //互补比较使能TIM_OCInitStructure.TIM_Pulse=1000;  //指定要加载到捕获/比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;    //输出极性为高TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;   //指定空闲状态下的TIM输出比较pin状态TIM_OC1Init(TIM1, &TIM_OCInitStructure);     //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_OC1FastConfig(TIM1,TIM_OCFast_Enable);TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Disable);    //禁止TIM1在CCR上的预装载寄存器,这里很重要不要使能啊TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);TIM_ITConfig(TIM1, TIM_IT_CC1,ENABLE); //中断使能NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_ClearFlag(TIM1, TIM_FLAG_CC1);TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);TIM_CtrlPWMOutputs(TIM1,ENABLE);TIM_Cmd(TIM1, ENABLE);  //使能TIM1
}int tim_count = 0;
void TIM1_CC_IRQHandler(void)
{if(  TIM_GetITStatus( TIM1 , TIM_IT_CC1) != RESET){TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);LED1=~LED1;tim_count=TIM_GetCapture1(TIM1);           //得到通道1的计数数值。TIM_SetCompare1(TIM1,tim_count+1000);     //设置新的CCR 值,新的比较数值。}
}

STM32F407_高级定时器_TIM1_TIM8相关推荐

  1. GD32通用定时器、高级定时器PWM输出例程

    通用定时器 /********************************************************************************************* ...

  2. stm32 高级定时器产生PWM

    用stm32的高级定时器TIM1和TIM8产生PWM,需要注意: 1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8 2.高级定时器相对于通用定时器,多了TIM_CtrlPW ...

  3. stm32高级定时器 基础知识

    stm32高级定时器 高级定时器时基单元: 包含一个16位自动重装载寄存器 ARR 一个16位的计数器CNT,可向上/下计数 一个16位可编程预分频器PSC,预分频器时钟源有多种可选,有内部的时钟.外 ...

  4. 高级定时器的各种框图和HAL库重要结构

    高级定时器的各种框图和HAL库重要结构 死区控制其实就是让高电平延迟输出

  5. 【STM32】高级定时器、通用定时器和基本定时器---配置寄存器产生PWM

    文章目录 1.高级定时器和通用定时器 2.配置产生PWM 1.高级定时器和通用定时器   高级定时器:TIM1.TIM8   Tips:黄色词条为高级定时器相对于通用定时器的功能.   通用定时器:T ...

  6. STM32学习——高级定时器

    高级定时器简介 1.输入捕获模式,可用来测频率或脉宽(原理:捕获到信号的跳变沿的时候,把计数器CNT的值锁存到捕获寄存器CCR中,把前后两次捕获到的CCR寄存器中的值相减,就可以算出脉宽或者频率.如果 ...

  7. STM32F103高级定时器使用

      STM32F103单片机中定时器分为3种,高级定时器.通用定时器.基本定时器.   高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动.它适合多种用 ...

  8. STM32 TIM高级定时器死区时间的计算

    STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间. 文章目录 什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什 ...

  9. STM32F103高级定时器死区时间计算

    官方数据手册的说明不容易看懂,举的例子与我的应用场合也不一致,我使用的是72MHz的晶振,讲一讲我的死区时间是怎么算出来的. DT死区时间: TDTS为系统时钟周期时长: TDTG为系统周期时长乘以倍 ...

最新文章

  1. 【 C 】结构的自引用
  2. java循环练习:水仙花数
  3. python画蝴蝶_python画蝴蝶曲线图的实例
  4. 【HDOJ】2732 Leapin' Lizards
  5. Android 多状态加载布局的开发 Tips
  6. 南水北调真相 林凌刘世庆范晓做客四川新闻网
  7. 在场景中添加光线——给光线添加更高的细节:逐像素光照
  8. 3. beeGo 自己写Controller 和 请求数据处理
  9. linux simhei 字体下载,Linux CentOS 7 安装 字体库文件(simsun.ttf、simheittf.ttf)
  10. loadrunner11 下载路径+安装+破解+汉化
  11. LFW database
  12. yang模型中rpc_RPC原理篇
  13. 安装计算机一级出现appcrash,电脑appcrash的问题怎么修复
  14. Excel图表—超级好用的Bullet图(KPI考核图)
  15. Android studio中使用NumCpp最新开源库
  16. 混战多年,K12在线教育的故事讲到哪了?
  17. 微信小程序如何添加业务域名
  18. word题注的大写变成小写
  19. cocos2d-x基本面试题
  20. 24个javascript最佳实践

热门文章

  1. FPGA丨高斯滤波算法实现
  2. Codeforces Round #262 (Div. 2) 460C. Present(二分)
  3. cocos creator慢镜头
  4. oracle记录合并,Oracle多行记录合并处理
  5. 原生js实现问卷调查
  6. EMQ X 联手万为,打造基于 AIoT 的物联网视频接入解决方案
  7. Glide 缓存策略 内存缓存和磁盘缓存
  8. golang list 删除添加元素
  9. [ZT]Linux非常好的一些技巧
  10. 人人代码生成器中读取配置文件中文乱码解决