This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Need help with code for Timers in ARM CORTEX M3(STM32F103RB)

I am trying to write code for toggling a pin(Pin 15) of a port (PORTC) using timers(specifically TIM2). I have to use the prescale registers to divide the clock frequency such that I obtain the required delay for toggling the pin.
So I wrote some code after 3 hrs of going through Reference Manual of the STM32F103RB. I checked what is wrong with my program and noticed that the Counter register is not updating even though in enabled the counter. 
Could anyone tell where I am going wrong? I have attached my code for reference.

#include "stm32f10x.h"


void Q2() {
int step = 0;
RCC->APB2ENR |= (1<<4); //To enable the PORTC
RCC->APB1ENR |= (1<<0); // Enable Timer 2
GPIOC->CRH &= (0<<30); // setting CNF
GPIOC->CRH |= (1<<28); // Setting mode to get general purpose Output push pull

TIM2->PSC = 0xD2F0; // Prescalar value set such that the 0.5ms is over till overflow
TIM2->CR1 |= 1<<7; // Auto reload preload enable is buffered
TIM2->ARR = 0x0000; // Auto reload value is 0
TIM2->CR1 |= 1<<0; //Counter enabled

while (1)
{
TIM2->PSC = 0xD2F0; // Prescalar value set such that the 0.5ms is over till overflow
TIM2->CR1 |= 1<<7; // Auto reload preload enable is buffered
TIM2->ARR = 0x0000; // Auto reload value is 0
TIM2->CR1 |= 1<<0; //Counter enabled
TIM2->SR &= 0<<0;
while(step!=2) {
if((TIM2->SR && 0x0001) == 0x0001) {

step++;
}
}
step = 0;
GPIOC->BSRR |= (1<<15); // set pin 15 of port C
TIM2->PSC = 0xD2F0; // Prescalar value set such that the 0.5ms is over till overflow
TIM2->CR1 |= 1<<7; // Auto reload preload enable is buffered
TIM2->ARR = 0x0000; // Auto reload value is 0
TIM2->CR1 |= 1<<0; //Counter enabled
TIM2->SR &= 0<<0;
while(step!=2) {
if((TIM2->SR && 0x0001) == 0x0001) {

step++;
}
}
step = 0;

GPIOC->BSRR |= (1<<31); // reset pin 15 of Port C
}

}
int main ()
{
SystemInit ();
Q2();
}

Thank you