2014-05-27 03:04 AM
Hi all,
at the moment I am trying to configure the update interrupt of timer 2 like this. The update interrupt should occur every 4ms. With the following code everything is fine, the pin is toggling every 4 ms.TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// TIM clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// Time base configuration
TIM_TimeBaseStructure.TIM_Prescaler = 9;
// (9+1) * 1/84MHz = 119ns
TIM_TimeBaseStructure.TIM_Period = 33600;
// 119ns * 33600 = 4ms
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// Enable the TIM Interrupt
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// enable it and timer
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
...
void
TIM2_IRQHandler(
void
){
GPIOD->ODR ^= GPIO_Pin_15;
//toggle
// tim update
if
((TIM2->SR & TIM_IT_Update) != (uint16_t)RESET){
TIM2->SR = (uint16_t)~TIM_IT_Update;
}
}
but if I try to do the same with timer 1, the frequency is not as expected but veeeeery slow (600ms)
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// TIM clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM1, ENABLE);
// Time base configuration
TIM_TimeBaseStructure.TIM_Prescaler = 19;
// (19+1) * 1/168MHz = 119ns
TIM_TimeBaseStructure.TIM_Period = 33600;
// 119ns * 33600 = 4ms
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
// Enable the TIM Interrupt
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// enable it and timer
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM1, ENABLE);
...
void
TIM1_UP_TIM10_IRQHandler(
void
){
GPIOD->ODR ^= GPIO_Pin_15;
//toggle
// tim update
if
((TIM1->SR & TIM_IT_Update) != (uint16_t)RESET){
TIM1->SR = (uint16_t)~TIM_IT_Update;
}
}
Does somebody has an explanation for this behavior?
2014-05-28 06:23 AM
DAMN. That exactly was the problem!
The library is not bad, but undocumented. And if I am not using the library, I think I would have more problems because I do not know which parameters/registers I have to set for a particular function. But also with using the library its not perfect.2014-05-28 06:48 AM
> The library is not bad, but undocumented.
It may be not bad, but in my opinion it is simply superfluous. And it *is* sort of documented, but that documentation has its shortcomings - stressing the need to fully (or appropriately) init the init_structs is one of those. > And if I am not using the library, I think I would have more problems because I do not know which parameters/registers I have to set for a particular function. That should be clear from reading the chips' basic documentation (mainly manual, but also datasheet,appnotes,examples - all of which have issues too, but that's another story) - and using the ''library'' won't eliminate the need for that anyway. JW