0% found this document useful (0 votes)
94 views

Timer stm32f4

The document configures a timer on a microcontroller to toggle 4 LEDs at different frequencies. It initializes Timer 3 to generate interrupts at specific time intervals by configuring compare registers. The timer interrupt service routine toggles the LEDs by comparing the current timer count to values stored in the compare registers.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
94 views

Timer stm32f4

The document configures a timer on a microcontroller to toggle 4 LEDs at different frequencies. It initializes Timer 3 to generate interrupts at specific time intervals by configuring compare registers. The timer interrupt service routine toggles the LEDs by comparing the current timer count to values stored in the compare registers.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 4

/**

******************************************************************************
* @file main.c
* @author Francesco Rinaldi & Tommaso Bambagiotti
* @version V1.0
* @date 19-Apr-2017
* @brief Timer example
******************************************************************************
*/

/* -----------------------------------------------------------------------
TIM3 Configuration: Output Compare Timing Mode:

In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1),
since APB1 prescaler is different from 1.
TIM3CLK = 2 * PCLK1
PCLK1 = HCLK / 4
=> TIM3CLK = HCLK / 2 = SystemCoreClock/2

To get TIM3 counter clock at 50 KHz, the prescaler is computed as follows:


Prescaler = (TIM3CLK / TIM3 counter clock) - 1
Prescaler = ((SystemCoreClock/2) /50000) - 1

CC1 update rate = TIM3 counter clock / CCR1_Val = 1 Hz


----------------------------------------------------------------------- */

/*********** Includes ****************/


#include "stm32f4xx.h"
#include "stm32f4_discovery.h"

/*********** Defines *****************/


#define TIM3_CK_CNT 50000

/*********** Declarations *************/


/*------ Function prototypes ---------*/
void TimerConfiguration(void);

/* ----- Global variables ----------- */


volatile uint16_t CCR1_Val = 50000;
volatile uint16_t CCR2_Val = 40000;
volatile uint16_t CCR3_Val = 30000;
volatile uint16_t CCR4_Val = 20000;

/************ Main *********************/


int main(void)
{

// LED initialization
STM_EVAL_LEDInit(LED3); // Orange
STM_EVAL_LEDInit(LED4); // Green
STM_EVAL_LEDInit(LED5); // Red
STM_EVAL_LEDInit(LED6); // Blue
/* TIM3 Configuration */
TimerConfiguration();

// Turn ON Green LED


STM_EVAL_LEDOn(LED4);

while (1);
}

/*********** Functions *****************/

/**
* @brief Configure the TIM3 TIMER.
* @param None
* @retval None
*/
void TimerConfiguration(void)
{
uint16_t PrescalerValue = 0;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* TIM3 clock enable */


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

/* Time base configuration */


TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

/* Prescaler configuration */
PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / TIM3_CK_CNT) - 1;
TIM_PrescalerConfig(TIM3, PrescalerValue, TIM_PSCReloadMode_Immediate);

/* Output Compare Timing Mode configuration: Channel1 */


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);

/* Output Compare Timing Mode configuration: Channel2 */


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);

/* Output Compare Timing Mode configuration: Channel3 */


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);

/* Output Compare Timing Mode configuration: Channel4 */


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);

/* Configure the TIM3 gloabal Interrupt */


NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* TIM Interrupts enable */


TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);

/* TIM3 counter enable */


TIM_Cmd(TIM3, ENABLE);

/************ Interrupt Handlers *************/

/**
* @brief This function handles TIM3 global interrupt request.
* @param None
* @retval None
*/
void TIM3_IRQHandler(void)
{
uint16_t capture = 0;

/** The Blue Led blinks every 1s


* CC1 update rate = TIM3 counter clock / CCR1_Val = 1 Hz
*/

if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)


{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);

/* LED4 toggling */
STM_EVAL_LEDToggle(LED6);

/* Update CH1 OCR */


capture = TIM_GetCapture1(TIM3);
TIM_SetCompare1(TIM3, capture + CCR1_Val);
}
/** The Orange Led blinks every 1.25 s
* CC2 update rate = TIM3 counter clock / CCR2_Val = 50000 / 40000 = 1.25 Hz
*/
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);

/* LED4 toggling */
STM_EVAL_LEDToggle(LED3);

/* Update CH2 OCR */


capture = TIM_GetCapture2(TIM3);
TIM_SetCompare2(TIM3, capture + CCR2_Val);
}

/** The Green Led blinks every 1.66 s


* CC3 update rate = TIM3 counter clock / CCR3_Val = 50000 / 30000 = 1.66 Hz
*/

if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)


{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);

/* LED4 toggling */
STM_EVAL_LEDToggle(LED4);

/* Update CH3 OCR */


capture = TIM_GetCapture3(TIM3);
TIM_SetCompare3(TIM3, capture + CCR3_Val);
}

/** The Red Led blinks every 2.5 s


* CC4 update rate = TIM3 counter clock / CCR4_Val = 50000 / 20000 = 2.5 Hz
*/
if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);

/* LED4 toggling */
STM_EVAL_LEDToggle(LED5);

/* Update CH4 OCR */


capture = TIM_GetCapture4(TIM3);
TIM_SetCompare4(TIM3, capture + CCR4_Val);
}
}

You might also like