/**
******************************************************************************
* @file : main.c
* @author : Fernando Hermosillo Reynoso
* @brief : Main program body
******************************************************************************
*
* 1. Realice un programa que configure una interrupción por TIM2 cada 500ms
* a. Determine un valor adecuado de prescala y auto-reload (ARR).
* b. El sistema lo único que realizará será conmutar una GPIO que deberá visualizar
* en el osciloscopio
*/
#include <stdint.h>
#include "stm32f103_hal.h"
/* Variables --------------------------------------*/
/* Funciones privadas -----------------------------*/
void TIM2_IRQHandler(void)
{
TIM2->SR &= ~(1 << 0); // Limpiar bandera
GPIOC->ODR ^= (1 << 13); // Toggle directo (enmascaramiento)
}
/* Codigo principal -------------------------------*/
int main(void)
{
// 1. Habilitar relojes
rcc_clock_enable(RCC_GPIOC);
rcc_clock_enable(RCC_TIM2);
// 2. Configurar LED (PC13)
gpio_set_output(GPIOC, GPIO_PIN_13, GPIO_OUTPUT_PP, GPIO_SPEED_50MHZ);
// 3. Configurar Timer a 500ms
// timer_init(instancia, modo, ARR, PSC)
timer_init(TIM2, TIMER_MODE_UP, 499, 7999);
// 4. Habilitar la interrupción de actualización y el NVIC
timer_set_interrupt(TIM2, TIMER_IRQ_UPDATE, IRQ_ENABLE);
nvic_enable_irq(TIM2_IRQn);
// 5. Arrancar
timer_start(TIM2, TIMER_CONTINUOUS);
while (1) {
// Nada aquí, todo ocurre en la interrupción
}
}
// La interrupción se queda igual, es la forma más directa