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.
Por último aquí teneis el código completo del vídeo.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.//============================================================================= // 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