STM32F4 Discovery-Board

Timerinterrupt im Sekundentakt generieren

In diesem Beispiel wird mit dem Timer2 ein Timerinterrupt generiert, welcher im Sekundentakt eine LED an PD15 toggelt.

/* This example shows how you can use a timer interrupt.
 * In this case, the timer2 count up to 1000 and generate an IRQ which toggles a LED every second.
 * The clock frequency of the internal oscillator = 16MHz
 */

#include <stm32f4xx.h>

void TIM2_IRQHandler(void)			// IRQ-Handler timer2
{
	if (TIM2->SR & TIM_SR_UIF)   	// flash on update event
		GPIOD->ODR ^= (1 << 15);	// Turn GPIOD pin15 (blue LED) ON in GPIO port output data register

	TIM2->SR = 0x0; 				// reset the status register
}

int main(void)
{
	RCC -> AHB1ENR |= RCC_AHB1ENR_GPIODEN;		// Enable CLK for PortD in peripheral clock register (RCC_AHB1ENR)
	RCC -> APB1ENR |= RCC_APB1ENR_TIM2EN; 		// enable TIM2 clock

    GPIOD -> MODER |= (1<<30);  				// Set pin 15 (blue LED)to be general purpose output in GPIO port mode register

    NVIC -> ISER[0] |= 1<< (TIM2_IRQn); 		// enable the TIM2 IRQ

    TIM2 -> PSC = 16000; 						// prescaler = 16000 (timer2 clock = 16MHz clock / 16000 = 1000Hz)
    TIM2 -> DIER |= TIM_DIER_UIE; 				// enable update interrupt
    TIM2 -> ARR = 1000; 						// count to 1000 (autoreload value 1000) --> overflow every 1 second
    TIM2 -> CR1 |= TIM_CR1_ARPE | TIM_CR1_CEN; 	// autoreload on, counter enabled
    TIM2 -> EGR = 1; 							// trigger update event to reload timer registers

    while(1)
    {
    }
}