void TIM2_Configuration(void)
{
TIM_DeInit(TIM2);//将TIM2寄存器值重设为默认值
TIM_TimeBaseStructInit(&TIM_HALLTimeBaseInitStructure);//为TIM_HALLTimeBaseInitStructure内每个参数填入默认值
// Set full 16-bit working range
TIM_HALLTimeBaseInitStructure.TIM_Period = 0xFFFF;//自动装载寄存器为最大值
TIM_HALLTimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
TIM_TimeBaseInit(TIM2,&TIM_HALLTimeBaseInitStructure);//TIM2时基单元配置
TIM_ICStructInit(&TIM_HALLICInitStructure);//为TIM_HALLICInitStructure内每个参数填入默认值
TIM_HALLICInitStructure.TIM_Channel = TIM_Channel_1; //通道CH1
TIM_HALLICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获
TIM_HALLICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC; //增加TRC的选择
TIM_HALLICInitStructure.TIM_ICFilter = 0x0B; //指定输入捕获过滤器
TIM_ICInit(TIM2,&TIM_HALLICInitStructure);//以上设置应用到TIM2的输入捕获
TIM_OCStructInit(&TIM_HALLOCInitStructure);//为TIM_HALLOCInitStructure内每个参数填入默认值
TIM_HALLOCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//PWM模式2
TIM_HALLOCInitStructure.TIM_Pulse = 10;
TIM_HALLOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_HALLOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性选择
TIM_OC2Init(TIM2,&TIM_HALLOCInitStructure); //TIM2的OC2通道配置
// Force the HALL_TIMER prescaler with immediate access (no need of an update event)
//注意!!!TIM2的时钟来自于APB1的一个倍频器
//如果APB1预分频系数为1时,TIMx_CLK= APB1_CLK。否则TIMx_CLK= 2*APB1_CLK
//本程序RCC配置部分,APB1的预分频系数为2,因此TIM2的时钟为2*APB1_CLK=2*36MHz=72MHz
TIM_PrescalerConfig(TIM2, (u16) 0xfffe,TIM_PSCReloadMode_Immediate);//计数器时钟CK_CNT为CK_PSC/(0xfffe+1),即k
TIM_InternalClockConfig(TIM2);//关闭从模式,TIM2由内部时钟CK_INT驱动
//Enables the XOR of channel 1, channel2 and channel3
TIM_SelectHallSensor(TIM2, ENABLE);//启用TIM2的霍尔传感器接口。
TIM_SelectInputTrigger(TIM2, TIM_TS_ITR1); //TIM2_SMCR 输入触发方式改为TI1的边沿检测器TI1F_ED,即异或信号
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_OC2Ref);//OC2REF信号用作触发输出(TRGO)
TIM_ARRPreloadConfig(TIM2, ENABLE); //启用ARR预加载 TIM4?
TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);//TIM_SlaveMode_External1从模式:复位模式,由选定的触发输入上升沿重新初始化计数器
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //synchronization between the current timer and its slaves (through TRGO)
TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Regular);//只有计数器溢出或下溢才产生更新中断
TIM_ClearFlag(TIM2, TIM_FLAG_Update + TIM_FLAG_CC1 + TIM_FLAG_CC2 + \
TIM_FLAG_CC3 + TIM_FLAG_CC4 + TIM_FLAG_Trigger + TIM_FLAG_CC1OF + \
TIM_FLAG_CC2OF + TIM_FLAG_CC3OF + TIM_FLAG_CC4OF);// 清除标志位
// Selected input capture and Update (overflow) events generate interrupt
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);//允许TIM2捕获1中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//允许TIM2更新中断
TIM_SetCounter(TIM2,0); //TIM2计数器清零
TIM_Cmd(TIM2, ENABLE);//启动TIM2
}
{
TIM_DeInit(TIM2);//将TIM2寄存器值重设为默认值
TIM_TimeBaseStructInit(&TIM_HALLTimeBaseInitStructure);//为TIM_HALLTimeBaseInitStructure内每个参数填入默认值
// Set full 16-bit working range
TIM_HALLTimeBaseInitStructure.TIM_Period = 0xFFFF;//自动装载寄存器为最大值
TIM_HALLTimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
TIM_TimeBaseInit(TIM2,&TIM_HALLTimeBaseInitStructure);//TIM2时基单元配置
TIM_ICStructInit(&TIM_HALLICInitStructure);//为TIM_HALLICInitStructure内每个参数填入默认值
TIM_HALLICInitStructure.TIM_Channel = TIM_Channel_1; //通道CH1
TIM_HALLICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获
TIM_HALLICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC; //增加TRC的选择
TIM_HALLICInitStructure.TIM_ICFilter = 0x0B; //指定输入捕获过滤器
TIM_ICInit(TIM2,&TIM_HALLICInitStructure);//以上设置应用到TIM2的输入捕获
TIM_OCStructInit(&TIM_HALLOCInitStructure);//为TIM_HALLOCInitStructure内每个参数填入默认值
TIM_HALLOCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//PWM模式2
TIM_HALLOCInitStructure.TIM_Pulse = 10;
TIM_HALLOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_HALLOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性选择
TIM_OC2Init(TIM2,&TIM_HALLOCInitStructure); //TIM2的OC2通道配置
// Force the HALL_TIMER prescaler with immediate access (no need of an update event)
//注意!!!TIM2的时钟来自于APB1的一个倍频器
//如果APB1预分频系数为1时,TIMx_CLK= APB1_CLK。否则TIMx_CLK= 2*APB1_CLK
//本程序RCC配置部分,APB1的预分频系数为2,因此TIM2的时钟为2*APB1_CLK=2*36MHz=72MHz
TIM_PrescalerConfig(TIM2, (u16) 0xfffe,TIM_PSCReloadMode_Immediate);//计数器时钟CK_CNT为CK_PSC/(0xfffe+1),即k
TIM_InternalClockConfig(TIM2);//关闭从模式,TIM2由内部时钟CK_INT驱动
//Enables the XOR of channel 1, channel2 and channel3
TIM_SelectHallSensor(TIM2, ENABLE);//启用TIM2的霍尔传感器接口。
TIM_SelectInputTrigger(TIM2, TIM_TS_ITR1); //TIM2_SMCR 输入触发方式改为TI1的边沿检测器TI1F_ED,即异或信号
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_OC2Ref);//OC2REF信号用作触发输出(TRGO)
TIM_ARRPreloadConfig(TIM2, ENABLE); //启用ARR预加载 TIM4?
TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);//TIM_SlaveMode_External1从模式:复位模式,由选定的触发输入上升沿重新初始化计数器
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //synchronization between the current timer and its slaves (through TRGO)
TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Regular);//只有计数器溢出或下溢才产生更新中断
TIM_ClearFlag(TIM2, TIM_FLAG_Update + TIM_FLAG_CC1 + TIM_FLAG_CC2 + \
TIM_FLAG_CC3 + TIM_FLAG_CC4 + TIM_FLAG_Trigger + TIM_FLAG_CC1OF + \
TIM_FLAG_CC2OF + TIM_FLAG_CC3OF + TIM_FLAG_CC4OF);// 清除标志位
// Selected input capture and Update (overflow) events generate interrupt
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);//允许TIM2捕获1中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//允许TIM2更新中断
TIM_SetCounter(TIM2,0); //TIM2计数器清零
TIM_Cmd(TIM2, ENABLE);//启动TIM2
}