STM32一个定时器最多可以定几个不同的时间?
想用TIME4定四个不同的时间
[mw_shl_code=c,true]void TIM4_Configuration(void)
{
/* ------------------------- System Clocks Configuration ------------------------------*/
/* TIM4 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
/* ---------------------------------------------------------------
TIM4 Configuration:
The objective is to get TIM4 counter clock at 1 KHz:
- Prescaler = (TIM4CLK / TIM4 counter clock) - 1
And generate 4 signals with 4 different delays:
TIM4_CH1 delay = CCR1_Val/TIM4 counter clock = 1000 ms
TIM4_CH2 delay = CCR2_Val/TIM4 counter clock = 500 ms
TIM4_CH3 delay = CCR3_Val/TIM4 counter clock = 250 ms
TIM4_CH4 delay = CCR4_Val/TIM4 counter clock = 125 ms
--------------------------------------------------------------- */
PrescalerValue = (uint16_t) (SystemCoreClock / 10000) - 1;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //10000-1;//
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;//7200-1;//
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
// TIM_PrescalerConfig(TIM4, 35999, TIM_PSCReloadMode_Immediate);
/* Output Compare Timing Mode configuration: Channel1 */
// TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;//TIM_OCMode_Inactive;//
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //极性为正
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Disable);
TIM_ARRPreloadConfig(TIM4, DISABLE);
/* Output Compare Timing Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Disable);
/* Output Compare Timing Mode configuration: Channel3 */
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Disable);
/* Output Compare Timing Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Disable);
// /*预先清除所有中断位*/
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4);//|TIM_IT_Update);
// /* 4个通道和溢出都配置中断*/
TIM_ITConfig(TIM4, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);//|TIM_IT_Update, ENABLE);
// TIM_ARRPreloadConfig(TIM4, ENABLE);
// /* ------------------------- NVIC Configuration ------------------------------ */
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* TIM enable counter */
TIM_Cmd(TIM4, ENABLE);
}[/mw_shl_code]
[mw_shl_code=c,true]void TIM4_IRQHandler(void)
{
u16 capture=0;
if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
capture = TIM_GetCapture1(TIM4);
TIM_SetCompare1(TIM4, capture + CCR1_Val);
Dis_Time++;
}
if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
capture = TIM_GetCapture1(TIM4);
TIM_SetCompare1(TIM4, capture + CCR2_Val);
Dis_Time1++;
//可添加功能块......
}
if (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
//可添加功能块......
}
if (TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);
}
// else if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
// {
// TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
//
// }
}
[/mw_shl_code]
程序如上,CC1的时间应该是CC2的两倍,但是
TIME4用比较模块,始终调不出几个不同的时间。
原子和各位看看,哪错了 ? |