For a detailed Timer configuration, refer previous post
Program:
/***************
Blinking LED connected to PC13 with interrupt created using Timer 2
SysClk = 72 MHz 
Prescaler = 10000
f = 72000000 / 10000 = 7200 Hz clock for Timer 2
Auto_reloader = 36000
so, Timer counts till: 1 / f * Auto_reload 
= 1 / 7200 * 36000 = 5 sec
#include "stm32f10x.h"
void TIM2_IRQHandler(void);
void RCC_config(void);
void RCC_config() // RCC clock configuration
{
  RCC -> CR |= RCC_CR_HSEON;                               // HSE ON
  RCC -> CFGR |= (RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9);    
  // Setting PLL - HSE * 9
  RCC -> CFGR |= RCC_CFGR_SW_1;                            // SysClk = PLLCLK
  RCC -> CR |= RCC_CR_PLLON;          
  // Turn ON PLL after above PLL configurations, making SysClk = HSE * 9 = 8 * 9 = 72 MHz
  RCC -> CFGR |= RCC_CFGR_PPRE1_DIV2;                      
  // APB1 = AHB / 2 = 72 / 2 = 36 MHz (max)
}
void TIM2_IRQHandler()
{
  TIM2 -> SR &= ~TIM_SR_UIF;            // UIF - clear timer interrupt flag
  GPIOC -> ODR ^= GPIO_ODR_ODR13;       // Toggle PC13 LED pin
}
int main()
{ 
  RCC_config();
  /* Port C - pin 13 settings for LED*/
  RCC -> APB2ENR |= RCC_APB2ENR_IOPCEN;     // Enable PortC Clock
  /* Select PortC_Pin 13 as output @2MHZ
   * Configure Pin 13 with open-drain */
  GPIOC -> CRH |= GPIO_CRH_MODE13_1 | GPIO_CRH_CNF13_0;
  GPIOC -> BSRR = GPIO_BSRR_BS13;         // Initialize PC13 LED - OFF
  /* Timer 2 settings 
     TIM2 -> CR1 &= ~ TIM_CR1_DIR  - by default - UP counter */
  RCC -> APB1ENR |= RCC_APB1ENR_TIM2EN;  // Enable clock for Timer 2
  TIM2 -> CR1 &= ~TIM_CR1_CEN;           // CEN = 0 - Counter disable
  TIM2 -> PSC = (10000 - 1);             // Prescaler 
  TIM2 -> ARR = 36000;                    // Auto reload value - counts upto 5 sec
  NVIC_EnableIRQ(TIM2_IRQn);             // Enable specific interrupt in NVIC
  TIM2 -> DIER |= TIM_DIER_UIE;          // Timer interrupt enable
  TIM2 -> CNT = 0;                       // Counter initialized to 0    
  TIM2 -> CR1 |= TIM_CR1_CEN;            // CEN = 1 - Counter enable
  while(1)
  {
    // Do nothing   
  }
  return 0; 
}
Timer Interrupt:
Get the ISR name from Startup code in KEIL or just add _IRQHandler to the peripheral name to get the interrupt function name.
In STM32, the respective interrupt (IRQ - Interrupt Request) should be enabled in NVIC (Nested Vectored Interrupt Controller) -> NVIC_EnableIRQ()
To create PWM using Timer, see next post
Comments
Post a Comment