使用高级定时器进行定时
stm32f10x_it.c
void ADVANCE_TIM_IRQHandler (void){if ( TIM_GetITStatus( ADVANCE_TIM, TIM_IT_Update) != RESET ){time++;TIM_ClearITPendingBit(ADVANCE_TIM , TIM_FLAG_Update);}}
bsp_AdvanceTim.h
#ifndef __BSP_ADVANCETIME_H#define __BSP_ADVANCETIME_H#include "stm32f10x.h"/********************高级定时器TIM参数定义,只限TIM1、8************/#define ADVANCE_TIM1 // 如果使用TIM8,注释掉这个宏即可#ifdef ADVANCE_TIM1 // 使用高级定时器TIM1#define ADVANCE_TIM TIM1#define ADVANCE_TIM_APBxClock_FUN RCC_APB2PeriphClockCmd#define ADVANCE_TIM_CLK RCC_APB2Periph_TIM1#define ADVANCE_TIM_Period (1000-1)#define ADVANCE_TIM_Prescaler 71#define ADVANCE_TIM_IRQ TIM1_UP_IRQn#define ADVANCE_TIM_IRQHandler TIM1_UP_IRQHandler#else // 使用高级定时器TIM8#define ADVANCE_TIM TIM8#define ADVANCE_TIM_APBxClock_FUN RCC_APB2PeriphClockCmd#define ADVANCE_TIM_CLK RCC_APB2Periph_TIM8#define ADVANCE_TIM_Period (1000-1)#define ADVANCE_TIM_Prescaler 71#define ADVANCE_TIM_IRQ TIM8_UP_IRQn#define ADVANCE_TIM_IRQHandler TIM8_UP_IRQHandler#endif/**************************函数声明********************************/void ADVANCE_TIM_Init(void);#endif /* __BSP_ADVANCETIME_H */
bsp_AdvanceTim.c
#include "bsp_AdvanceTim.h"// 中断优先级配置static void ADVANCE_TIM_NVIC_Config(void){NVIC_InitTypeDef NVIC_InitStructure;// 设置中断组为0NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 设置中断来源NVIC_InitStructure.NVIC_IRQChannel = ADVANCE_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 ADVANCE_TIM_Mode_Config(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;// 开启定时器时钟,即内部时钟CK_INT=72MADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK, ENABLE);// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_Period;// 时钟预分频数TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_TIM_Prescaler;// 时钟分频因子 ,没用到不用管TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 计数器计数模式,设置为向上计数TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;// 重复计数器的值,没用到不用管TIM_TimeBaseStructure.TIM_RepetitionCounter=0;// 初始化定时器TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);// 清除计数器中断标志位TIM_ClearFlag(ADVANCE_TIM, TIM_FLAG_Update);// 开启计数器中断TIM_ITConfig(ADVANCE_TIM,TIM_IT_Update,ENABLE);// 使能计数器TIM_Cmd(ADVANCE_TIM, ENABLE);}void ADVANCE_TIM_Init(void){ADVANCE_TIM_NVIC_Config();ADVANCE_TIM_Mode_Config();}/*********************************************END OF FILE**********************/
main.c
// 高级定时器TIMx,x[1,8]定时应用#include "stm32f10x.h"#include "bsp_led.h"#include "bsp_AdvanceTim.h"uint32_t time = 0; // ms 计时变量/*** @brief 主函数* @param 无* @retval 无*/int main(void){/* led 端口配置 */LED_GPIO_Config();ADVANCE_TIM_Init();while(1){if ( time == 1000 ) /* 1000 * 1 ms = 1s 时间到 */{time = 0;/* LED1 取反 */LED1_TOGGLE;}}}/*********************************************END OF FILE**********************/
PWM互补输出带死区时间
bsp_AdvanceTim.h
#ifndef __BSP_ADVANCETIME_H#define __BSP_ADVANCETIME_H#include "stm32f10x.h"/************高级定时器TIM参数定义,只限TIM1和TIM8************/// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意// 这里我们使用高级控制定时器TIM1#define ADVANCE_TIM TIM1#define ADVANCE_TIM_APBxClock_FUN RCC_APB2PeriphClockCmd#define ADVANCE_TIM_CLK RCC_APB2Periph_TIM1// PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}#define ADVANCE_TIM_PERIOD (8-1)#define ADVANCE_TIM_PSC (9-1)#define ADVANCE_TIM_PULSE 4#define ADVANCE_TIM_IRQ TIM1_UP_IRQn#define ADVANCE_TIM_IRQHandler TIM1_UP_IRQHandler// TIM1 输出比较通道#define ADVANCE_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA#define ADVANCE_TIM_CH1_PORT GPIOA#define ADVANCE_TIM_CH1_PIN GPIO_Pin_8// TIM1 输出比较通道的互补通道#define ADVANCE_TIM_CH1N_GPIO_CLK RCC_APB2Periph_GPIOB#define ADVANCE_TIM_CH1N_PORT GPIOB#define ADVANCE_TIM_CH1N_PIN GPIO_Pin_13// TIM1 输出比较通道的刹车通道#define ADVANCE_TIM_BKIN_GPIO_CLK RCC_APB2Periph_GPIOB#define ADVANCE_TIM_BKIN_PORT GPIOB#define ADVANCE_TIM_BKIN_PIN GPIO_Pin_12/**************************函数声明********************************/void ADVANCE_TIM_Init(void);#endif /* __BSP_ADVANCETIME_H */
bsp_AdvanceTim.c
#include "bsp_AdvanceTim.h"static void ADVANCE_TIM_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;// 输出比较通道 GPIO 初始化RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = ADVANCE_TIM_CH1_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(ADVANCE_TIM_CH1_PORT, &GPIO_InitStructure);// 输出比较通道互补通道 GPIO 初始化RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1N_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = ADVANCE_TIM_CH1N_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(ADVANCE_TIM_CH1N_PORT, &GPIO_InitStructure);// 输出比较通道刹车通道 GPIO 初始化RCC_APB2PeriphClockCmd(ADVANCE_TIM_BKIN_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = ADVANCE_TIM_BKIN_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(ADVANCE_TIM_BKIN_PORT, &GPIO_InitStructure);// BKIN引脚默认先输出低电平GPIO_ResetBits(ADVANCE_TIM_BKIN_PORT,ADVANCE_TIM_BKIN_PIN);}///*// * 注意: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) * (1/CLK_cnt) = (ARR+1)*(PSC+1) / 72M// 占空比P=CCR/(ARR+1)static void ADVANCE_TIM_Mode_Config(void){// 开启定时器时钟,即内部时钟CK_INT=72MADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK,ENABLE);/*--------------------时基结构体初始化-------------------------*/TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_PERIOD;// 驱动CNT计数器的时钟 = Fck_int/(psc+1)TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_TIM_PSC;// 时钟分频因子 ,配置死区时间时需要用到TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 计数器计数模式,设置为向上计数TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;// 重复计数器的值,没用到不用管TIM_TimeBaseStructure.TIM_RepetitionCounter=0;// 初始化定时器TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);/*--------------------输出比较结构体初始化-------------------*/TIM_OCInitTypeDef TIM_OCInitStructure;// 配置为PWM模式1TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 输出使能TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;// 互补输出使能TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;// 设置占空比大小TIM_OCInitStructure.TIM_Pulse = ADVANCE_TIM_PULSE;// 输出通道电平极性配置TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;// 互补输出通道电平极性配置TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;// 输出通道空闲电平极性配置TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;// 互补输出通道空闲电平极性配置TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);TIM_OC1PreloadConfig(ADVANCE_TIM, TIM_OCPreload_Enable);/*-------------------刹车和死区结构体初始化-------------------*/// 有关刹车和死区结构体的成员具体可参考BDTR寄存器的描述TIM_BDTRInitTypeDef TIM_BDTRInitStructure;TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;// 输出比较信号死区时间配置,具体如何计算可参考 BDTR:UTG[7:0]的描述// 这里配置的死区时间为152nsTIM_BDTRInitStructure.TIM_DeadTime = 11;TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;// 当BKIN引脚检测到高电平的时候,输出比较信号被禁止,就好像是刹车一样TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;TIM_BDTRConfig(ADVANCE_TIM, &TIM_BDTRInitStructure);// 使能计数器TIM_Cmd(ADVANCE_TIM, ENABLE);// 主输出使能,当使用的是通用定时器时,这句不需要TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);}void ADVANCE_TIM_Init(void){ADVANCE_TIM_GPIO_Config();ADVANCE_TIM_Mode_Config();}/*********************************************END OF FILE**********************/
main.c
// TIM—高级定时器-PWM互补输出带死区时间应用#include "stm32f10x.h"#include "bsp_led.h"#include "bsp_AdvanceTim.h"/*** @brief 主函数* @param 无* @retval 无*/int main(void){/* 高级定时器初始化 */ADVANCE_TIM_Init();while(1){}}/*********************************************END OF FILE**********************/
PWM输入捕获
bsp_AdvanceTim.h
#ifndef __BSP_ADVANCETIME_H#define __BSP_ADVANCETIME_H#include "stm32f10x.h"/************高级定时器TIM参数定义,只限TIM1和TIM8************/// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意// 这里我们使用高级控制定时器TIM1#define ADVANCE_TIM TIM1#define ADVANCE_TIM_APBxClock_FUN RCC_APB2PeriphClockCmd#define ADVANCE_TIM_CLK RCC_APB2Periph_TIM1// 输入捕获能捕获到的最小的频率为 72M/{ (ARR+1)*(PSC+1) }#define ADVANCE_TIM_PERIOD (1000-1)#define ADVANCE_TIM_PSC (72-1)// 中断相关宏定义#define ADVANCE_TIM_IRQ TIM1_CC_IRQn#define ADVANCE_TIM_IRQHandler TIM1_CC_IRQHandler// TIM1 输入捕获通道1#define ADVANCE_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA#define ADVANCE_TIM_CH1_PORT GPIOA#define ADVANCE_TIM_CH1_PIN GPIO_Pin_8#define ADVANCE_TIM_IC1PWM_CHANNEL TIM_Channel_1#define ADVANCE_TIM_IC2PWM_CHANNEL TIM_Channel_2/**************************函数声明********************************/void ADVANCE_TIM_Init(void);#endif /* __BSP_ADVANCETIME_H */
bsp_AdvanceTim.c
#include "bsp_AdvanceTim.h"/*** @brief 高级控制定时器 TIMx,x[1,8]中断优先级配置* @param 无* @retval 无*/static void ADVANCE_TIM_NVIC_Config(void){NVIC_InitTypeDef NVIC_InitStructure;// 设置中断组为0NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 设置中断来源NVIC_InitStructure.NVIC_IRQChannel = ADVANCE_TIM_IRQ;// 设置抢占优先级NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// 设置子优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}/*** @brief 高级定时器PWM输入用到的GPIO初始化* @param 无* @retval 无*/static void ADVANCE_TIM_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = ADVANCE_TIM_CH1_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(ADVANCE_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)/*** @brief 高级定时器PWM输入初始化和用到的GPIO初始化* @param 无* @retval 无*/static void ADVANCE_TIM_Mode_Config(void){// 开启定时器时钟,即内部时钟CK_INT=72MADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK,ENABLE);/*--------------------时基结构体初始化-------------------------*/TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_PERIOD;// 驱动CNT计数器的时钟 = Fck_int/(psc+1)TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_TIM_PSC;// 时钟分频因子 ,配置死区时间时需要用到TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 计数器计数模式,设置为向上计数TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;// 重复计数器的值,没用到不用管TIM_TimeBaseStructure.TIM_RepetitionCounter=0;// 初始化定时器TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);/*--------------------输入捕获结构体初始化-------------------*/// 使用PWM输入模式时,需要占用两个捕获寄存器,一个测周期,另外一个测占空比TIM_ICInitTypeDef TIM_ICInitStructure;// 捕获通道IC1配置// 选择捕获通道TIM_ICInitStructure.TIM_Channel = ADVANCE_TIM_IC1PWM_CHANNEL;// 设置捕获的边沿TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;// 设置捕获通道的信号来自于哪个输入通道,有直连和非直连两种TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;// 1分频,即捕获信号的每个有效边沿都捕获TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;// 不滤波TIM_ICInitStructure.TIM_ICFilter = 0x0;// 初始化PWM输入模式TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);// 当工作做PWM输入模式时,只需要设置触发信号的那一路即可(用于测量周期)// 另外一路(用于测量占空比)会由硬件自带设置,不需要再配置// 捕获通道IC2配置// TIM_ICInitStructure.TIM_Channel = ADVANCE_TIM_IC1PWM_CHANNEL;// TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;// TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;// TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;// TIM_ICInitStructure.TIM_ICFilter = 0x0;// TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);// 选择输入捕获的触发信号TIM_SelectInputTrigger(ADVANCE_TIM, TIM_TS_TI1FP1);// 选择从模式: 复位模式// PWM输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT会被复位TIM_SelectSlaveMode(ADVANCE_TIM, TIM_SlaveMode_Reset);TIM_SelectMasterSlaveMode(ADVANCE_TIM,TIM_MasterSlaveMode_Enable);// 使能捕获中断,这个中断针对的是主捕获通道(测量周期那个)TIM_ITConfig(ADVANCE_TIM, TIM_IT_CC1, ENABLE);// 清除中断标志位TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1);// 使能高级控制定时器,计数器开始计数TIM_Cmd(ADVANCE_TIM, ENABLE);}/*** @brief 高级定时器PWM输入初始化和用到的GPIO初始化* @param 无* @retval 无*/void ADVANCE_TIM_Init(void){ADVANCE_TIM_GPIO_Config();ADVANCE_TIM_NVIC_Config();ADVANCE_TIM_Mode_Config();}/*********************************************END OF FILE**********************/
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// 输出PWM的频率为 72M/{ (ARR+1)*(PSC+1) }#define GENERAL_TIM_PERIOD (10-1)#define GENERAL_TIM_PSC (72-1)#define GENERAL_TIM_CCR1 5#define GENERAL_TIM_CCR2 4#define GENERAL_TIM_CCR3 3#define GENERAL_TIM_CCR4 2// 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"/*** @brief 通用定时器PWM输出用到的GPIO初始化* @param 无* @retval 无*/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_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);}///*// * 注意: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)/*** @brief 通用定时器PWM输出初始化* @param 无* @retval 无* @note*/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_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_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 = GENERAL_TIM_CCR1;TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);// 输出比较通道 2TIM_OCInitStructure.TIM_Pulse = GENERAL_TIM_CCR2;TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);// 输出比较通道 3TIM_OCInitStructure.TIM_Pulse = GENERAL_TIM_CCR3;TIM_OC3Init(GENERAL_TIM, &TIM_OCInitStructure);TIM_OC3PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);// 输出比较通道 4TIM_OCInitStructure.TIM_Pulse = GENERAL_TIM_CCR4;TIM_OC4Init(GENERAL_TIM, &TIM_OCInitStructure);TIM_OC4PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);// 使能计数器TIM_Cmd(GENERAL_TIM, ENABLE);}/*** @brief 通用定时器PWM输出用到的GPIO和PWM模式初始化* @param 无* @retval 无*/void GENERAL_TIM_Init(void){GENERAL_TIM_GPIO_Config();GENERAL_TIM_Mode_Config();}/*********************************************END OF FILE**********************/
main.c
/* TIM—高级定时器-PWM输入捕获应用,通用定时器产生PWM波,高级定时器则捕获这个PWM,并测量周期和占空比*/#include "stm32f10x.h"#include "bsp_led.h"#include "bsp_AdvanceTim.h"#include "bsp_GeneralTim.h"#include "bsp_usart.h"/*** @brief 主函数* @param 无* @retval 无*/int main(void){/* 串口初始化 */USART_Config();/* 通用定时器初始化,用于生成PWM信号 */GENERAL_TIM_Init();/* 高级定时器初始化 ,用户捕获PWM信号*/ADVANCE_TIM_Init();while(1){}}/*********************************************END OF FILE**********************/
1-TIM—高级定时器-定时.zip
2-TIM—高级定时器-PWM互补输出带死区时间.zip3-TIM—高级定时器-PWM输入捕获.zip
