viernes, 23 de agosto de 2013

Interrupciones en la STM32F0Discovery

En esta ocasión os voy a contar como utilizar las interrupciones en los microcontroladores STM32F0. En el blog ya he hablado de las interrupciones en los microcontroladores PIC de Microchip y de como se activan y configuran, pues ahora vamos a hacer lo mismo pero esta vez con el ARM Cortex M0 que monta la placa STM32F0Discovery.
En el ejemplo que he desarrollado en el vídeo vais a ver que es bastante fácil, tan solo tenemos que activar la interrupción mediante el bit correspondiente del registro DIER.
TIM3->DIER |= TIM_DIER_UIE;

Una vez activado, lo siguiente es habilitar el vector de interrupción, es decir, decirle al procesador que en el caso de que se produzca la interrupción, a que posición de memoria debe ir, para eso ejecutamos la siguiente instrucción:
NVIC_EnableIRQ(TIM3_IRQn);

Una vez hecho esto, la interrupción ya está lista, tan solo tenemos que escribir el código que debe ejecutarse en caso de que se produzca la interrupción:
void TIM3_IRQHandler(void){

     // Código de la interrupción 

}

A contiuación teneis un vídeo explicativo.

Por último aquí teneis el código completo del vídeo.
//=============================================================================
// Autor: P.Trujillo
// mipsandchips.blogspot.com.es
// Parpadeo de los leds de la placa discovery alternativamente con interrupciones
//=============================================================================
 
#include "stm32f0xx.h"
 
//=============================================================================
// aux functions
//=============================================================================


//=============================================================================
// global vars
//=============================================================================
char led_stat = 0;

//=============================================================================
// main function
//=============================================================================
int main(void)
{ 
   
  RCC->AHBENR |= RCC_AHBENR_GPIOCEN ; //Habilitamos el reloj para el puerto C
 RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; //Habilitamos el reloj para el timer 3
  
  GPIOC->MODER = GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0; //Puerto C8 y C9 como salida
  GPIOC->ODR = !GPIO_ODR_8|GPIO_ODR_9;
 
 TIM3->PSC = 47999;
 TIM3->ARR = 1000;
 TIM3->DIER |= TIM_DIER_UIE;
 TIM3->CR1 |= TIM_CR1_CEN;
 
 NVIC_EnableIRQ(TIM3_IRQn); 
 
  while (1) {
    
      
  }
}

void TIM3_IRQHandler(void){
 
 TIM3->SR &= ~TIM_SR_UIF; //Borrar el flag de interrupción
 
 if(led_stat){
  GPIOC->ODR = GPIO_ODR_8|!GPIO_ODR_9;
  led_stat = 0;
 }
 else{
  GPIOC->ODR = !GPIO_ODR_8|GPIO_ODR_9;
  led_stat = 1;
 } 
}

//=============================================================================
// End of file
//=============================================================================

No hay comentarios:

Publicar un comentario