else { RCC->APB1RSTR &= ~RCC_APB1Periph; } } */
case TIM3_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE); break;
case TIM4_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); break;
case TIM5_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE); break;
case TIM6_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE); break;
case TIM7_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE); break;
case TIM8_BASE:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE); break;
default: break; } }
19.2.2 函数TIM_TimeBaseInit
Table 460. 函数TIM_TimeBaseInit 函数名 TIM_TimeBaseInit void TIM_TimeBaseInit(TIM_TypeDef* TIMx, 函数原形 TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) 功能描述 根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 输入参数1 TIMx:x可以是1,2,3,4,5,8来选择TIM外设 TIMTimeBase_InitStruct:指向结构TIM_TimeBaseInitTypeDef的指针,输入参数2 包含TIMx时间基数单位的配置信息 输出参数 无 返回值 无 先决条件 无 被调用函数 无 TIM_TimeBaseInitTypeDef structure TIM_TimeBaseInitTypeDef定义于文件:
typedef struct {
u16 TIM_Period; u16 TIM_Prescaler;
u16 TIM_ClockDivision; u16 TIM_CounterMode;
u8 TIM_RepetitionCounter; }TIM_TimeBaseInitTypeDef;
1.TIM_Period:设置在下一个更新事件装入活动的[TIMx_ARR]的周期的值。其值在0x0000-0xFFFF之间。 2.TIM_Prescaler:设置用来作为TIMx时钟频率除数的预分频值[TIMx_PSC]。其值在 0x0000-0xFFFF之间。 3.TIM_ClockDivision :设置了时钟分割。该参数取值见下表。
Table 461. TIM_ClockDivision值 TIM_ClockDivision TIM_CKD_DIV1 描述 TDTS = Tck_tim #define值 0x0000 备注 TIMx_CR1.CKD[1:0] TIM_CKD_DIV2 TIM_CKD_DIV4 TDTS = 2Tck_tim TDTS = 4Tck_tim 0x0100 0x0200 Bit8-9 4.TIM_CounterMode:选择了计数器模式。该参数取值见下表。 Table 462. TIM_CounterMode值 TIM_CounterMode TIM_CounterMode_Up TIM_CounterMode_Down TIM_CounterMode_CenterAligned1 TIM_CounterMode_CenterAligned2 TIM_CounterMode_CenterAligned3 描述 TIM向上计数模式 TIM向下计数模式 TIM中央对齐模式1计数模式 TIM中央对齐模式2计数模式 TIM中央对齐模式3计数模式 #define值 0x0000 0x0010 0x0020 0x0040 0x0060 在TIMx_CR1的位置 bit6-5 CMS[1:0]=00 CMS[1:0]=01 CMS[1:0]=10 CMS[1:0]=11 bit4 DIR=0 DIR=1 与DIR无关 (DIR=0) 5. TIM_RepetitionCounter:设置CCy的更新速率。 例:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period=0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0xF;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
函数原型如下:
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) {
/* Check the parameters */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode)); assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));
/* Select the Counter Mode and set the clock division */ TIMx->CR1 &= CR1_CKD_Mask & CR1_CounterMode_Mask;//=0x008F //#define CR1_CounterMode_Mask ((u16)0x038F) //#define CR1_CKD_Mask ((u16)0x00FF)
TIMx->CR1 |= (u32)TIM_TimeBaseInitStruct->TIM_ClockDivision | TIM_TimeBaseInitStruct->TIM_CounterMode;//要求在函数之外初始化。
/* Set the Autoreload value */
TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
/* Set the Prescaler value */
TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;
/* Generate an update event to reload the Prescaler value immediatly */ TIMx->EGR = TIM_PSCReloadMode_Immediate;
//#define TIM_PSCReloadMode_Immediate ((u16)0x0001)// TIMx_EGR.UG (Bit0)
if (((*(u32*)&TIMx) == TIM1_BASE) || ((*(u32*)&TIMx) == TIM8_BASE)) //RCR寄存器,只有T1/T8才有
{ TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; } /* Set the Repetition Counter value */ }
19.2.3 函数TIM_OCInit
Table 463.函数TIM_OCInit 函数名 TIM_OCInit void TIM_OCInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* 函数原形 TIM_OCInitStruct) 功能描述 根据TIM_OCInitStruct中指定的参数初始化外设TIMx 输入参数1 TIMx:x可以是2,3, 4,来选择TIM外设 TIM_OCInitStruct:指向结构TIM_OCInitTypeDef的指针,包输入参数2 含了TIMx时间基数单位的配置信息 输出参数 无 返回值 无 先决条件 无 被调用函数 无 TIM_OCInitTypeDef structure
TIM_OCInitTypeDef 定义于文件:
typedef struct
{ u16 TIM_OCMode; u16 TIM_Channel; u16 TIM_Pulse;
u16 TIM_OCPolarity; }TIM_OCInitTypeDef;
1.TIM_OCMode :选择定时器模式。该参数取值见下表。
Table 464. TIM_OCMode定义 TIM_OCMode TIM_OCMode_Timing TIM_OCMode_Active TIM_OCMode_Inactive TIM_OCMode_Toggle TIM_OCMode_PWM1 TIM_OCMode_PWM2 描述 #define值 0x0000 0x0010 0x0020 0x0030 0x0060 0x0070 备注
TIM输出比较时间模式 TIM输出比较主动模式 TIM输出比较非主动模式 TIM输出比较触发模式 TIM脉冲宽度调制模式1 TIM脉冲宽度调制模式2 TIMx_CCMRy.OCzM[2:0] 2.TIM_Channel :选择通道。该参数取值见下表。 Table 465. TIM_Channel值 TIM_Channel TIM_Channel_1 TIM_Channel_2 TIM_Channel_3 TIM_Channel_4 描述 使用TIM通道1 使用TIM通道2 使用TIM通道3 使用TIM通道4 #define值 0x0000 0x0004 0x0008 0x000C 3.TIM_Pulse :设置了待装入捕获比较寄存器的脉冲值。其值为0x0000~0xFFFF。 4.TIM_OCPolarity :输出极性。该参数取值见下表。
Table 466. TIM_OCPolarity值 TIM_OCPolarity TIM_OCPolarity_High TIM_OCPolarity_Low 描述 TIM输出比较极性高 TIM输出比较极性低 #define值 0x0000 0x0002 例:
/* Configures the TIM2 Channel1 in PWM Mode */ TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_Channel = TIM_Channel_1; TIM_OCInitStructure.TIM_Pulse = 0x3FFF;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInit(TIM2, & TIM_OCInitStructure); 举例:OC3Init函数原型如下(OC1-OC4):
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) {
u16 tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
/* Check the parameters */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));
assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));
TIMx->CCER &= CCER_CC3E_Reset; /* Disable the Channel 2: Reset the CC2E Bit */ /* CCER的设置 #define值 备注 #define CCER_CC3E_Set ((u16)0x0100) CCER.CC3E(Bit8) #define CCER_CC3E_Reset ((u16)0xFEFF) 使能位 */
tmpccer = TIMx->CCER; /* Get the TIMx CCER register value */
tmpcr2 = TIMx->CR2; /* Get the TIMx CR2 register value */
tmpccmrx = TIMx->CCMR2; /* Get the TIMx CCMR2 register value */
tmpccmrx &= CCMR_OC13M_Mask; /* Reset the Output Compare Mode Bits */ //#define CCMR_CC13S_Mask ((u16)0xFFFC)//清除Bit1-0
tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; /* Select the Output Compare Mode */ //TIM_OCMode在函数外已经被初始化【见结构体】
tmpccer &= CCER_CC3P_Reset; /* Reset the Output Polarity level */
/* CCER的设置 #define值 备注 #define CCER_CC3P_Set ((u16) 0x0200) CCER.CC3P(Bit9) #define CCER_CC3P_Reset ((u16) 0xFDFF) 使能位 */
tmpccer |= (u16)(TIM_OCInitStruct->TIM_OCPolarity << 8); /* Set the Output Compare Polarity */
tmpccer |= (u16)(TIM_OCInitStruct->TIM_OutputState << 8); /* Set the Output State */
TIMx->CCR3 = TIM_OCInitStruct->TIM_Pulse; /* Set the Capture Compare Register value */
if((*(u32*)&TIMx == TIM1_BASE) || (*(u32*)&TIMx == TIM8_BASE)) {
assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState));
tmpccer &= CCER_CC3NP_Reset; /* Reset the Output N Polarity level */
tmpccer |= (u16)(TIM_OCInitStruct->TIM_OCNPolarity << 8); /* Set the Output N Polarity */
tmpccer &= CCER_CC3NE_Reset; /* Reset the Output N State */ /* CCER的设置 #define值 备注 #define CCER_CC3NE_Set ((u16) 0x0400) CCER.CC3P(Bit9) 使能位 #define CCER_CC3NE_Reset ((u16) 0xFCFF) */
tmpccer |= (u16)(TIM_OCInitStruct->TIM_OutputNState << 8); /* Set the Output N State */
tmpcr2 &= CR2_OIS3_Reset; /* Reset the Ouput Compare and Output Compare N IDLE State */ tmpcr2 &= CR2_OIS3N_Reset;
tmpcr2 |= (u16)(TIM_OCInitStruct->TIM_OCIdleState << 4); /* Set the Output Idle state */
tmpcr2 |= (u16)(TIM_OCInitStruct->TIM_OCNIdleState << 4); /* Set the Output N Idle state */ }
TIMx->CR2 = tmpcr2; /* Write to TIMx CR2 */
TIMx->CCMR2 = tmpccmrx; /* Write to TIMx CCMR2 */
TIMx->CCER = tmpccer; /* Write to TIMx CCER */ }
19.2.4 函数TIM_ICInit
Table 467. 函数TIM_ICInit 函数名 TIM_OCInit 函数原形 void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) 功能描述 根据TIM_ICInitStruct中指定的参数初始化外设TIMx 输入参数1 TIMx:x可以是1,2,3,4,5,8来选择TIM外设 输入参数2 TIM_ICInitStruct:指向结构TIM_ICInitTypeDef的指针,包含了TIMx的配置信息 输出参数 无 返回值 无 先决条件 无 被调用函数 无 TIM_ICInitTypeDef structure :定义于文件“stm2f10x_tim.h:
typedef struct {
u16 TIM_ICMode; u16 TIM_Channel; u16 TIM_ICPolarity; u16 TIM_ICSelection; u16 TIM_ICPrescaler; u16 TIM_ICFilter; }TIM_ICInitTypeDef;
1.TIM_ICMode:选择了TIM输入捕获模式。该参数取值见下表。
Table 468. TIM_ICMode定义 TIM_ICMode TIM_ICMode_ICAP TIM_ICMode_PWMI 描述 TIM使用输入捕获模式 TIM使用输入PWM模式 #define值 2.TIM_Channel:选择通道。该参数取值见下表。 Table 469. TIM_Channel值 TIM_Channel TIM_Channel_1 TIM_Channel_2 TIM_Channel_3 TIM_Channel_4 描述 使用TIM通道1 使用TIM通道2 使用TIM通道3 使用TIM通道4 #define值 (u16)0x0000 (u16)0x0004 (u16)0x0008 (u16)0x000C 3.TIM_ICPolarity :输入活动沿。该参数取值见下表。
Table 470. TIM_Channel值 TIM_ICPolarity TIM_ICPolarity_Rising 描述CCER.Bit1/5/9/13 TIM输入捕获上升沿 #define值 (u16)0x0000 (u16)0x0002 CC1 bit1 CC2 5 CC3 9 CC4 11 TIM_ICPolarity_Falling TIM输入捕获下降沿 4.TIM_ICSelection :选择输入。该参数取值见下表。 Table 471. TIM_ICSelection值 TIM_ICSelection -- TIM_ICSelection_DirectTI TIM_ICSelection_IndirectTI TIM_ICSelection_TRC 描述/CCMR1/2.bit1-0或<<8 -- TIM输入2,3,4选择对应地与IC1或IC2或IC3或IC4相连 TIM输入2,3,4选择对应地与IC2或IC1或IC4或IC3相连 TIM输入2,3,4选择与TRC相连 #define值 (u16)0x0000 (u16)0x0001 (u16)0x0002 (u16)0x0003 备注 输出模式 输入:1234 输入:2143 输入:TRC 5.TIM_ICPrescaler :设置输入捕获预分频器。该参数取值见下表。 Table 472. TIM_ICPrescaler值 TIM_ICPrescaler TIM_ICPSC_DIV1 TIM_ICPSC_DIV2 TIM_ICPSC_DIV3 TIM_ICPSC_DIV4 描述/CCMR1/2.bit4-3或<<8 TIM捕获在捕获输入上每探测到一个边沿执行一次 TIM捕获每2个事件执行一次 TIM捕获每3个事件执行一次 TIM捕获每4个事件执行一次 #define值 (u16)0x0000 (u16)0x0004 (u16)0x0008 (u16)0x000C 备注 8位对应一个CC通道,该值以CC1/3位参照,对于CC2/4要左移8位[不是10]处理。 6.TIM_ICFilter :选择输入比较滤波器。其值在0x0-0xF之间。 例:
/* The following example illustrates how to configure the TIM2 in PWM Input mode : The external signal is connected to TIM2 CH1 pin, the Rising edge is used as active edge, the TIM2 CCR1 is used to compute the frequency value the TIM2 CCR2 is used to compute the duty cycle value */ TIM_DeInit(TIM2);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_PWMI; 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 = 0x0; TIM_ICInit(TIM2, &TIM_ICInitStructure); 函数原型如下:
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) {
/* Check the parameters */
assert_param(IS_TIM_123458_PERIPH(TIMx));//T1-5、T8取地址 assert_param(IS_TIM_CHANNEL(TIM_ICInitStruct->TIM_Channel));
assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); assert_param(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection)); assert_param(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler)); assert_param(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter));
if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) {
/* TI1 Configuration */