TIMER

TIMx TypeDef

#include stm32f11xe.h

``

/*!< APB2 peripherals */
#define TIM1_BASE           (APB2PERIPH_BASE + 0x0000UL)
#define TIM1                ((TIM_TypeDef *) TIM1_BASE)

/*!< APB1 peripherals */
#define TIM2_BASE           (APB1PERIPH_BASE + 0x0000UL)
#define TIM2                ((TIM_TypeDef *) TIM2_BASE)

typedef struct
{
  __IO uint32_t CR1;         /*!< TIM control register 1,              Address offset: 0x00 */
  __IO uint32_t CR2;         /*!< TIM control register 2,              Address offset: 0x04 */
  __IO uint32_t SMCR;        /*!< TIM slave mode control register,     Address offset: 0x08 */
  __IO uint32_t DIER;        /*!< TIM DMA/interrupt enable register,   Address offset: 0x0C */
  __IO uint32_t SR;          /*!< TIM status register,                 Address offset: 0x10 */
  __IO uint32_t EGR;         /*!< TIM event generation register,       Address offset: 0x14 */
  __IO uint32_t CCMR1;       /*!< TIM capture/compare mode register 1, Address offset: 0x18 */
  __IO uint32_t CCMR2;       /*!< TIM capture/compare mode register 2, Address offset: 0x1C */
  __IO uint32_t CCER;        /*!< TIM capture/compare enable register, Address offset: 0x20 */
  __IO uint32_t CNT;         /*!< TIM counter register,                Address offset: 0x24 */
  __IO uint32_t PSC;         /*!< TIM prescaler,                       Address offset: 0x28 */
  __IO uint32_t ARR;         /*!< TIM auto-reload register,            Address offset: 0x2C */
  __IO uint32_t RCR;         /*!< TIM repetition counter register,     Address offset: 0x30 */
  __IO uint32_t CCR1;        /*!< TIM capture/compare register 1,      Address offset: 0x34 */
  __IO uint32_t CCR2;        /*!< TIM capture/compare register 2,      Address offset: 0x38 */
  __IO uint32_t CCR3;        /*!< TIM capture/compare register 3,      Address offset: 0x3C */
  __IO uint32_t CCR4;        /*!< TIM capture/compare register 4,      Address offset: 0x40 */
  __IO uint32_t BDTR;        /*!< TIM break and dead-time register,    Address offset: 0x44 */
  __IO uint32_t DCR;         /*!< TIM DMA control register,            Address offset: 0x48 */
  __IO uint32_t DMAR;        /*!< TIM DMA address for full transfer,   Address offset: 0x4C */
  __IO uint32_t OR;          /*!< TIM option register,                 Address offset: 0x50 */
} TIM_TypeDef;

Example Code for Tutorial

Tutorial: TIMER Initiation

// Some code
/**
******************************************************************************
* @author  SSSLAB
* @Mod		 2021-8-12 by YKKIM  	
* @brief   Embedded Controller:  Tutorial ___
*					 - _________________________________
* 
******************************************************************************
*/

#include "stm32f411xe.h"
#include "ecGPIO.h"
#include "ecRCC.h"
//#include "ecTIM.h"

uint32_t _count=0;

#define LED_PIN 5

void setup(void);
	
int main(void) { 
	// Initialiization --------------------------------------------------------
	setup();
	TIM_TypeDef* timerx;
	timerx = TIM2;
	RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
	
	timerx->PSC = 83;							// Timer counter clock: 1MHz(1us)
	timerx->ARR = 999;							// Set auto reload register to maximum (count up to 65535)
	timerx->DIER |= TIM_DIER_UIE;
	timerx->CR1 |= TIM_CR1_CEN;	
	
	NVIC_EnableIRQ(TIM2_IRQn);				
	NVIC_SetPriority(TIM2_IRQn ,2);
	
	// Inifinite Loop ----------------------------------------------------------
	while(1){}
}

// Initialiization 
void setup(void)
{	
	RCC_PLL_init();                         // System Clock = 84MHz
	GPIO_init(GPIOA, LED_PIN, OUTPUT);    // calls RCC_GPIOA_enable()	
}

void TIM2_IRQHandler(void){
	if((TIM2->SR & TIM_SR_UIF) == TIM_SR_UIF){// update interrupt flag
		_count++;
		if (_count >1000) {
			LED_toggle();
			_count=0;}
		TIM2->SR &= ~TIM_SR_UIF;// clear by writing 0
	}
	
}

EC_TIM.h example

TIMER Initialization and Timer Update Event Interrupt


/* Timer Counter Configuration */
//// Step 1: Initialize Timer
//TIM_init(TIMx);			// default:  TIM_period_ms(TIM2, 1 msec) with Counter_Clk 100kHz / PSC=840-1, ARR=100-1

//// Step 2: Choose Timer Update Period  (a) msec or  (b) usec
//TIM_period_ms(TIMx, msec);  // Timer-Update-Period: msec< 600  with 100 kHz Counter / PSC=840 / ARR = 100 * msec 
//TIM_period_us(TIMx, usec);  // Timer-Update-Period: usec< 6000  with 1 MHz Counter / PSC=84 / ARR = 1 * usec

/////  Example Code 1:  
// Configure TIM2 with 10 usec.  
// Configure TIM3 with 100 msec.  
 void setup(){
   TIM_init(TIM2);	
   TIM_period_us(TIM2, 10); 
   
   TIM_init(TIM3);
   TIM_period_ms(TIM3, 100);
 }



/* Timer UI Interrupt Configuration */
///////  Step1:   Initialize TIM_UI with TIMERx
// void TIM_UI_init(TIM_TypeDef* TIMx, uint32_t msec); 

///////  Step2:   Start by Enabling TIM_UI 
// void TIM_UI_enable(TIM_TypeDef* TIMx);
// void TIM_UI_disable(TIM_TypeDef* TIMx);

 
 /////  Example Code 2:  
 //  Configure TIM2 Update-Interrupt with 10 msec. Note: it uses CounterCLK=100kHz 
 void setup(){
   TIM_UI_init(TIM2,10);	
   TIM_UI_enable(TIM2);    
 }


Tutorial: PWM Configuration

/**
******************************************************************************
* @author  SSSLAB
* @Mod		 2021-8-12 by YKKIM  	
* @brief   Embedded Controller:  Tutorial ___
*					 - _________________________________
* 
******************************************************************************
*/
#include "stm32f411xe.h"
#include "ecGPIO.h"
#include "ecRCC.h"
#include "ecPWM.h"
#include "ecSysTick.h"
#include "ecEXTI.h"


uint32_t _count=0;

#define LED_PIN 	5
#define BUTTON_PIN 13

void setup(void);
	
int main(void) { 
	// Initialiization --------------------------------------------------------
	
	RCC_PLL_init();                         // System Clock = 84MHz
	SysTick_init();                         // for delay_ms()
	GPIO_init(GPIOA, LED_PIN, EC_ALTE);     // GPIOA 5 ALTERNATE function
	GPIO_ospeed(GPIOA, LED_PIN, EC_HIGH);   // GPIOA 5 HIGH SPEED
	
	// TEMP: TIMER Register Initialiization --------------------------------------------------------		
	TIM_TypeDef *TIMx;
	TIMx = TIM2;
	
	// GPIO: ALTERNATIVE function setting
	GPIOA->AFR[0]	 = 1<<(4*LED_PIN);          // AF1 at PA5 = TIM2_CH1 (p.150)

	// TIMER: PWM setting
	RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;			// Enable TIMER clock
	
	TIMx->CR1 &= ~TIM_CR1_DIR;					// Direction Up-count
	
	uint32_t prescaler = 839;
	TIMx->PSC = prescaler;						// Set Timer CLK: (PSC+1)= 84Mhz/0.1MHz --> PSC= 840-1
	
	TIMx->ARR = 99;								// Set ARR:  (ARR+1) = 100kHz/1kHz  --> ARR=100-1.    
	
	TIMx->CCMR1 &= ~TIM_CCMR1_OC1M;                     // Clear ouput compare mode bits for channel 1
	TIMx->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // OC1M = 110 for PWM Mode 1 output on ch1. #define TIM_CCMR1_OC1M_1          (0x2UL << TIM_CCMR1_OC1M_Pos)
	TIMx->CCMR1	|= TIM_CCMR1_OC1PE;                     // Output 1 preload enable (make CCR1 value changable)
			
	TIMx->CCER &= ~TIM_CCER_CC1P;                       // select output polarity: active high	
	TIMx->CCER  |= TIM_CCER_CC1E;						// Enable output for ch1
	TIMx->CCR1  = 99/2; 								// Output Compare Register for channel 1 (default duty ratio = 50%)
	
	TIMx->CR1  |= TIM_CR1_CEN;							// Enable counter

	

	// Inifinite Loop ----------------------------------------------------------
	while(1){
		for (int i=0;i<3;i++){
		TIM2->CCR1 = 99*i/2;
		delay_ms(100);
		}
	}
}

EC_PWM.h example

Configuring PWM output pins


 /////  Example Code 1:  Configure PWM outputs
 void setup() {
	 // Configure TIM2_CH1 as PWM of msec period
	 PWM_init(PA_5);				// TIM2_CH1 PWM
	 PWM_period_ms(PA_5, msec);			// PWM period: 0.01 msec ~ 655 msec
	 PWM_pulsewidth_ms(PA_5, pulse_width_ms);	// PWM pulsewidth: 0.01 msec ~ 655 msec

	 // Configure TIM3_CH1 as PWM of usec period 
	 PWM_init(PA_6);				// TIM3_CH1 PWM
	 PWM_period_us(PA_6, usec);			// PWM period: 1 usec ~65,536 usec  
	 PWM_pulsewidth_us(PA_6, pulse_width_us);	// PWM pulsewidth: 1 usec ~65,536 usec  
 }

Last updated