通用定时器定时
bsp_GeneralTim.h
#ifndef __BSP_GENERALTIME_H#define __BSP_GENERALTIME_H#include "stm32f10x.h"/**************通用定时器TIM参数定义,只限TIM2、3、4、5************/// 当需要哪个定时器的时候,只需要把下面的宏定义改成1即可#define GENERAL_TIM2 1#define GENERAL_TIM3 0#define GENERAL_TIM4 0#define GENERAL_TIM5 0#if GENERAL_TIM2#define GENERAL_TIM TIM2#define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd#define GENERAL_TIM_CLK RCC_APB1Periph_TIM2#define GENERAL_TIM_Period (1000-1)#define GENERAL_TIM_Prescaler 71#define GENERAL_TIM_IRQ TIM2_IRQn#define GENERAL_TIM_IRQHandler TIM2_IRQHandler#elif GENERAL_TIM3#define GENERAL_TIM TIM3#define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd#define GENERAL_TIM_CLK RCC_APB1Periph_TIM3#define GENERAL_TIM_Period (1000-1)#define GENERAL_TIM_Prescaler 71#define GENERAL_TIM_IRQ TIM3_IRQn#define GENERAL_TIM_IRQHandler TIM3_IRQHandler#elif GENERAL_TIM4#define GENERAL_TIM TIM4#define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd#define GENERAL_TIM_CLK RCC_APB1Periph_TIM4#define GENERAL_TIM_Period (1000-1)#define GENERAL_TIM_Prescaler 71#define GENERAL_TIM_IRQ TIM4_IRQn#define GENERAL_TIM_IRQHandler TIM4_IRQHandler#elif GENERAL_TIM5#define GENERAL_TIM TIM5#define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd#define GENERAL_TIM_CLK RCC_APB1Periph_TIM5#define GENERAL_TIM_Period (1000-1)#define GENERAL_TIM_Prescaler 71#define GENERAL_TIM_IRQ TIM5_IRQn#define GENERAL_TIM_IRQHandler TIM5_IRQHandler#endif/**************************函数声明********************************/void GENERAL_TIM_Init(void);#endif /* __BSP_GENERALTIME_H */
bsp_GeneralTim.c
#include "bsp_GeneralTim.h"// 中断优先级配置static void GENERAL_TIM_NVIC_Config(void){NVIC_InitTypeDef NVIC_InitStructure;// 设置中断组为0NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 设置中断来源NVIC_InitStructure.NVIC_IRQChannel = GENERAL_TIM_IRQ ;// 设置主优先级为 0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// 设置抢占优先级为3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}///*// * 注意: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;// *-----------------------------------------------------------------------------// */static void GENERAL_TIM_Mode_Config(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;// 开启定时器时钟,即内部时钟CK_INT=72MGENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK, ENABLE);// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;// 时钟预分频数TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;// 时钟分频因子 ,没用到不用管TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 计数器计数模式,设置为向上计数TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;// 重复计数器的值,没用到不用管TIM_TimeBaseStructure.TIM_RepetitionCounter=0;// 初始化定时器TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);// 清除计数器中断标志位TIM_ClearFlag(GENERAL_TIM, TIM_FLAG_Update);// 开启计数器中断TIM_ITConfig(GENERAL_TIM,TIM_IT_Update,ENABLE);// 使能计数器TIM_Cmd(GENERAL_TIM, ENABLE);}void GENERAL_TIM_Init(void){GENERAL_TIM_NVIC_Config();GENERAL_TIM_Mode_Config();}/*********************************************END OF FILE**********************/
main.c
// 高级定时器TIMx,x[2,3,4,5]定时应用#include "stm32f10x.h"#include "bsp_led.h"#include "bsp_GENERALTim.h"uint32_t time = 0; // ms 计时变量/*** @brief 主函数* @param 无* @retval 无*/int main(void){/* led 端口配置 */LED_GPIO_Config();GENERAL_TIM_Init();while(1){if ( time == 1000 ) /* 1000 * 1 ms = 1s 时间到 */{time = 0;/* LED1 取反 */LED1_TOGGLE;}}}/*********************************************END OF FILE**********************/
4路PWM输出
bsp_GeneralTim.h
#ifndef __BSP_GENERALTIME_H#define __BSP_GENERALTIME_H#include "stm32f10x.h"/************通用定时器TIM参数定义,只限TIM2、3、4、5************/// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意// 我们这里默认使用TIM3#define GENERAL_TIM TIM3#define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd#define GENERAL_TIM_CLK RCC_APB1Periph_TIM3#define GENERAL_TIM_Period 9#define GENERAL_TIM_Prescaler 71// TIM3 输出比较通道1#define GENERAL_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA#define GENERAL_TIM_CH1_PORT GPIOA#define GENERAL_TIM_CH1_PIN GPIO_Pin_6// TIM3 输出比较通道2#define GENERAL_TIM_CH2_GPIO_CLK RCC_APB2Periph_GPIOA#define GENERAL_TIM_CH2_PORT GPIOA#define GENERAL_TIM_CH2_PIN GPIO_Pin_7// TIM3 输出比较通道3#define GENERAL_TIM_CH3_GPIO_CLK RCC_APB2Periph_GPIOB#define GENERAL_TIM_CH3_PORT GPIOB#define GENERAL_TIM_CH3_PIN GPIO_Pin_0// TIM3 输出比较通道4#define GENERAL_TIM_CH4_GPIO_CLK RCC_APB2Periph_GPIOB#define GENERAL_TIM_CH4_PORT GPIOB#define GENERAL_TIM_CH4_PIN GPIO_Pin_1/**************************函数声明********************************/void GENERAL_TIM_Init(void);#endif /* __BSP_GENERALTIME_H */
bsp_GeneralTim.c
#include "bsp_GeneralTim.h"static void GENERAL_TIM_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;// 输出比较通道1 GPIO 初始化RCC_APB2PeriphClockCmd(GENERAL_TIM_CH1_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH1_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GENERAL_TIM_CH1_PORT, &GPIO_InitStructure);// 输出比较通道2 GPIO 初始化RCC_APB2PeriphClockCmd(GENERAL_TIM_CH2_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH2_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GENERAL_TIM_CH2_PORT, &GPIO_InitStructure);// 输出比较通道3 GPIO 初始化RCC_APB2PeriphClockCmd(GENERAL_TIM_CH3_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH3_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GENERAL_TIM_CH3_PORT, &GPIO_InitStructure);// 输出比较通道4 GPIO 初始化RCC_APB2PeriphClockCmd(GENERAL_TIM_CH4_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH4_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GENERAL_TIM_CH4_PORT, &GPIO_InitStructure);}///*// * 注意: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;// *-----------------------------------------------------------------------------// *//* ---------------- PWM信号 周期和占空比的计算--------------- */// ARR :自动重装载寄存器的值// CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)// PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M// 占空比P=CCR/(ARR+1)static void GENERAL_TIM_Mode_Config(void){// 开启定时器时钟,即内部时钟CK_INT=72MGENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);/*--------------------时基结构体初始化-------------------------*/// 配置周期,这里配置为100KTIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;// 驱动CNT计数器的时钟 = Fck_int/(psc+1)TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;// 时钟分频因子 ,配置死区时间时需要用到TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 计数器计数模式,设置为向上计数TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;// 重复计数器的值,没用到不用管TIM_TimeBaseStructure.TIM_RepetitionCounter=0;// 初始化定时器TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);/*--------------------输出比较结构体初始化-------------------*/// 占空比配置uint16_t CCR1_Val = 5;uint16_t CCR2_Val = 4;uint16_t CCR3_Val = 3;uint16_t CCR4_Val = 2;TIM_OCInitTypeDef TIM_OCInitStructure;// 配置为PWM模式1TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 输出使能TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;// 输出通道电平极性配置TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;// 输出比较通道 1TIM_OCInitStructure.TIM_Pulse = CCR1_Val;TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);// 输出比较通道 2TIM_OCInitStructure.TIM_Pulse = CCR2_Val;TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);// 输出比较通道 3TIM_OCInitStructure.TIM_Pulse = CCR3_Val;TIM_OC3Init(GENERAL_TIM, &TIM_OCInitStructure);TIM_OC3PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);// 输出比较通道 4TIM_OCInitStructure.TIM_Pulse = CCR4_Val;TIM_OC4Init(GENERAL_TIM, &TIM_OCInitStructure);TIM_OC4PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);// 使能计数器TIM_Cmd(GENERAL_TIM, ENABLE);}void GENERAL_TIM_Init(void){GENERAL_TIM_GPIO_Config();GENERAL_TIM_Mode_Config();}/*********************************************END OF FILE**********************/
main.c
// TIM—通用定时器-4路PWM输出应用#include "stm32f10x.h"#include "bsp_led.h"#include "bsp_GeneralTim.h"/*** @brief 主函数* @param 无* @retval 无*/int main(void){/* led 端口配置 */LED_GPIO_Config();/* 定时器初始化 */GENERAL_TIM_Init();while(1){}}/*********************************************END OF FILE**********************/
输入捕获-测量脉冲宽度
bsp_GeneralTim.h
#ifndef __BSP_GENERALTIME_H#define __BSP_GENERALTIME_H#include "stm32f10x.h"/************通用定时器TIM参数定义,只限TIM2、3、4、5************/// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意// 我们这里默认使用TIM5#define GENERAL_TIM TIM5#define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd#define GENERAL_TIM_CLK RCC_APB1Periph_TIM5#define GENERAL_TIM_PERIOD 0XFFFF#define GENERAL_TIM_PSC (72-1)// TIM 输入捕获通道GPIO相关宏定义#define GENERAL_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA#define GENERAL_TIM_CH1_PORT GPIOA#define GENERAL_TIM_CH1_PIN GPIO_Pin_0#define GENERAL_TIM_CHANNEL_x TIM_Channel_1// 中断相关宏定义#define GENERAL_TIM_IT_CCx TIM_IT_CC1#define GENERAL_TIM_IRQ TIM5_IRQn#define GENERAL_TIM_INT_FUN TIM5_IRQHandler// 获取捕获寄存器值函数宏定义#define GENERAL_TIM_GetCapturex_FUN TIM_GetCapture1// 捕获信号极性函数宏定义#define GENERAL_TIM_OCxPolarityConfig_FUN TIM_OC1PolarityConfig// 测量的起始边沿#define GENERAL_TIM_STRAT_ICPolarity TIM_ICPolarity_Rising// 测量的结束边沿#define GENERAL_TIM_END_ICPolarity TIM_ICPolarity_Falling// 定时器输入捕获用户自定义变量结构体声明typedef struct{uint8_t Capture_FinishFlag; // 捕获结束标志位uint8_t Capture_StartFlag; // 捕获开始标志位uint16_t Capture_CcrValue; // 捕获寄存器的值uint16_t Capture_Period; // 自动重装载寄存器更新标志}TIM_ICUserValueTypeDef;extern TIM_ICUserValueTypeDef TIM_ICUserValueStructure;/**************************函数声明********************************/void GENERAL_TIM_Init(void);#endif /* __BSP_GENERALTIME_H */
bsp_GeneralTim.h
#include "bsp_GeneralTim.h"// 定时器输入捕获用户自定义变量结构体定义TIM_ICUserValueTypeDef TIM_ICUserValueStructure = {0,0,0,0};// 中断优先级配置static void GENERAL_TIM_NVIC_Config(void){NVIC_InitTypeDef NVIC_InitStructure;// 设置中断组为0NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 设置中断来源NVIC_InitStructure.NVIC_IRQChannel = GENERAL_TIM_IRQ ;// 设置主优先级为 0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// 设置抢占优先级为3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}static void GENERAL_TIM_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;// 输入捕获通道 GPIO 初始化RCC_APB2PeriphClockCmd(GENERAL_TIM_CH1_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH1_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GENERAL_TIM_CH1_PORT, &GPIO_InitStructure);}///*// * 注意: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;// *-----------------------------------------------------------------------------// *//* ---------------- PWM信号 周期和占空比的计算--------------- */// ARR :自动重装载寄存器的值// CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)// PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M// 占空比P=CCR/(ARR+1)static void GENERAL_TIM_Mode_Config(void){// 开启定时器时钟,即内部时钟CK_INT=72MGENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);/*--------------------时基结构体初始化-------------------------*/TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_PERIOD;// 驱动CNT计数器的时钟 = Fck_int/(psc+1)TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_PSC;// 时钟分频因子 ,配置死区时间时需要用到TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 计数器计数模式,设置为向上计数TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;// 重复计数器的值,没用到不用管TIM_TimeBaseStructure.TIM_RepetitionCounter=0;// 初始化定时器TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);/*--------------------输入捕获结构体初始化-------------------*/TIM_ICInitTypeDef TIM_ICInitStructure;// 配置输入捕获的通道,需要根据具体的GPIO来配置TIM_ICInitStructure.TIM_Channel = GENERAL_TIM_CHANNEL_x;// 输入捕获信号的极性配置TIM_ICInitStructure.TIM_ICPolarity = GENERAL_TIM_STRAT_ICPolarity;// 输入通道和捕获通道的映射关系,有直连和非直连两种TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;// 输入的需要被捕获的信号的分频系数TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;// 输入的需要被捕获的信号的滤波系数TIM_ICInitStructure.TIM_ICFilter = 0;// 定时器输入捕获初始化TIM_ICInit(GENERAL_TIM, &TIM_ICInitStructure);// 清除更新和捕获中断标志位TIM_ClearFlag(GENERAL_TIM, TIM_FLAG_Update|GENERAL_TIM_IT_CCx);// 开启更新和捕获中断TIM_ITConfig (GENERAL_TIM, TIM_IT_Update | GENERAL_TIM_IT_CCx, ENABLE );// 使能计数器TIM_Cmd(GENERAL_TIM, ENABLE);}void GENERAL_TIM_Init(void){GENERAL_TIM_GPIO_Config();GENERAL_TIM_NVIC_Config();GENERAL_TIM_Mode_Config();}/*********************************************END OF FILE**********************/
main.c
// TIM—通用-捕获-测量脉宽 应用#include "stm32f10x.h"#include "bsp_led.h"#include "bsp_usart.h"#include "bsp_GeneralTim.h"/*** @brief 主函数* @param 无* @retval 无*/int main(void){uint32_t time;// TIM 计数器的驱动时钟uint32_t TIM_PscCLK = 72000000 / (GENERAL_TIM_PSC+1);/* 串口初始化 */USART_Config();/* 定时器初始化 */GENERAL_TIM_Init();printf ( "\r\n野火 STM32 输入捕获实验\r\n" );printf ( "\r\n按下K1,测试K1按下的时间\r\n" );while ( 1 ){if(TIM_ICUserValueStructure.Capture_FinishFlag == 1){// 计算高电平时间的计数器的值time = TIM_ICUserValueStructure.Capture_Period * (GENERAL_TIM_PERIOD+1) +(TIM_ICUserValueStructure.Capture_CcrValue+1);// 打印高电平脉宽时间printf ( "\r\n测得高电平脉宽时间:%d.%d s\r\n",time/TIM_PscCLK,time%TIM_PscCLK );TIM_ICUserValueStructure.Capture_FinishFlag = 0;}}}/*********************************************END OF FILE**********************/
1-TIM—通用定时器-定时.zip
2-TIM—通用定时器-4路PWM输出.zip
3-TIM—通用定时器-输入捕获-测量脉冲宽度.zip
