AnsweredAssumed Answered

STM32F103 AHB1 divider setting not changing apparent speed of TIM2

Question asked by kcuzner on Aug 12, 2016
Latest reply on Sep 1, 2016 by Dowell.Sherman
I'm doing some for-fun bare metal programming on an STM32F103C8T6 in order to better understand how it works. Currently, I'm messing with the RCC module. However, I think I may have misread something in the reference manual since I'm not getting the expected behavior.

I've got the RCC set up to run the PLL from the HSI/2 with a multiplier of 6, theoretically giving a system clock speed of 24MHz I think. I have TIM2 with no prescaler set up to interrupt when it overflows. In my interrupt I have one of the GPIO bits being flipped. This GPIO is connected to my oscilloscope.

Here is what I am seeing that is confusing me:
- With the AHB1 divider at 0b000 my oscilloscope says that my GPIO is toggling at 183.00Hz, duty cycle 49.09%.
- With the AHB1 divider at 0b100 my oscilloscope says that my GPIO is toggling at 182.78Hz, duty cycle 50.91%.
- With the AHB1 divider at 0b101 my oscilloscope says that my GPIO is toggling at 91.383Hz, duty cycle 50.48%
- With the AHB1 divider at 0b110 my oscilloscope says that my GPIO is toggling at 45.691Hz, duty cycle 50.11%
- With the AHB1 divider at 0b111 my oscolloscope says that my GPIO is toggling at 45.700Hz, duty cycle 0.228% (it looks like a normally high line which goes low for 1.93uS).

What I see is problems at the extreme ends of the divider, especially with the div by 16 (0b111) at the end. The div by 1 and div by 2 appear to have very similar behavior to each other as well. Alternately, I have something horribly wrong with my timer and interrupt setup.

Here is my timer and interrupt setup:
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->DIER = TIM_DIER_UIE;
TIM2->CR1 = TIM_CR1_CEN;
  
NVIC_EnableIRQ(TIM2_IRQn);
 
...snip...
 
void TIM2_IRQHandler()
{
    static uint8_t on = 0;
    TIM2->SR = ~TIM_SR_UIF;
    if (on)
        GPIOB->BSRR = GPIO_BSRR_BS0;
    else
        GPIOB->BSRR = GPIO_BSRR_BR0;
 
 
    on ^= 0xFF;
}


Does anyone have any idea what could be going on here?

Outcomes