STM32F407_高级定时器_TIM1_TIM8
这里写目录标题
- 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相关推荐
- GD32通用定时器、高级定时器PWM输出例程
通用定时器 /********************************************************************************************* ...
- stm32 高级定时器产生PWM
用stm32的高级定时器TIM1和TIM8产生PWM,需要注意: 1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8 2.高级定时器相对于通用定时器,多了TIM_CtrlPW ...
- stm32高级定时器 基础知识
stm32高级定时器 高级定时器时基单元: 包含一个16位自动重装载寄存器 ARR 一个16位的计数器CNT,可向上/下计数 一个16位可编程预分频器PSC,预分频器时钟源有多种可选,有内部的时钟.外 ...
- 高级定时器的各种框图和HAL库重要结构
高级定时器的各种框图和HAL库重要结构 死区控制其实就是让高电平延迟输出
- 【STM32】高级定时器、通用定时器和基本定时器---配置寄存器产生PWM
文章目录 1.高级定时器和通用定时器 2.配置产生PWM 1.高级定时器和通用定时器 高级定时器:TIM1.TIM8 Tips:黄色词条为高级定时器相对于通用定时器的功能. 通用定时器:T ...
- STM32学习——高级定时器
高级定时器简介 1.输入捕获模式,可用来测频率或脉宽(原理:捕获到信号的跳变沿的时候,把计数器CNT的值锁存到捕获寄存器CCR中,把前后两次捕获到的CCR寄存器中的值相减,就可以算出脉宽或者频率.如果 ...
- STM32F103高级定时器使用
STM32F103单片机中定时器分为3种,高级定时器.通用定时器.基本定时器. 高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动.它适合多种用 ...
- STM32 TIM高级定时器死区时间的计算
STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间. 文章目录 什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什 ...
- STM32F103高级定时器死区时间计算
官方数据手册的说明不容易看懂,举的例子与我的应用场合也不一致,我使用的是72MHz的晶振,讲一讲我的死区时间是怎么算出来的. DT死区时间: TDTS为系统时钟周期时长: TDTG为系统周期时长乘以倍 ...
最新文章
- 【 C 】结构的自引用
- java循环练习:水仙花数
- python画蝴蝶_python画蝴蝶曲线图的实例
- 【HDOJ】2732 Leapin' Lizards
- Android 多状态加载布局的开发 Tips
- 南水北调真相 林凌刘世庆范晓做客四川新闻网
- 在场景中添加光线——给光线添加更高的细节:逐像素光照
- 3. beeGo 自己写Controller 和 请求数据处理
- linux simhei 字体下载,Linux CentOS 7 安装 字体库文件(simsun.ttf、simheittf.ttf)
- loadrunner11 下载路径+安装+破解+汉化
- LFW database
- yang模型中rpc_RPC原理篇
- 安装计算机一级出现appcrash,电脑appcrash的问题怎么修复
- Excel图表—超级好用的Bullet图(KPI考核图)
- Android studio中使用NumCpp最新开源库
- 混战多年,K12在线教育的故事讲到哪了?
- 微信小程序如何添加业务域名
- word题注的大写变成小写
- cocos2d-x基本面试题
- 24个javascript最佳实践