#include "stm32f103xb.h"
#include "stm32f103_hal.h"
int main(void) {
// 1. Habilitar Relojes
rcc_clock_enable(RCC_GPIOA);
rcc_clock_enable(RCC_GPIOB);
rcc_clock_enable(RCC_GPIOC); // Para el LED integrado
rcc_clock_enable(RCC_TIM2);
rcc_clock_enable(RCC_TIM3);
// 2. Configurar el LED de la Bluepill (PC13)
gpio_set_output(GPIOC, 13, GPIO_OUTPUT_PP, GPIO_SPEED_2MHZ);
GPIOC->BSRR = (1 << 13); // Apagar el LED inicializando en ALTO (PC13 es lógica negada)
// 3. GENERADOR DE PULSO LENTO: TIM3 en PB0 (Aprox 5 Hz)
// Con un reloj de 8 MHz: Prescaler 7999 nos da 1000 ticks/segundo. ARR 199 nos da 5 pulsos/segundo.
gpio_set_output(GPIOB, 0, GPIO_OUTPUT_AF_PP, GPIO_SPEED_2MHZ);
timer_init(TIM3, TIMER_MODE_UP, 199, 7999);
timer_set_oc_channel(TIM3, TIMER_CHANNEL_3, TIMER_OC_PWM1, TIMER_OC_POLARITY_HIGH, 100, true);
timer_start(TIM3, TIMER_CONTINUOUS);
// 4. LECTOR INPUT CAPTURE: TIM2 en PA0
gpio_set_input(GPIOA, 0, GPIO_INPUT_FLOAT);
timer_init(TIM2, TIMER_MODE_UP, 0xFFFF, 0);
// Configuración pura a nivel de registros para Input Capture
TIM2->CCMR1 |= TIM_CCMR1_CC1S_0; // PA0 mapeado a TIM2 CH1
TIM2->CCER &= ~TIM_CCER_CC1P; // Captura en flanco de subida
TIM2->CCER |= TIM_CCER_CC1E; // Habilitar captura de hardware
timer_start(TIM2, TIMER_CONTINUOUS);
// 5. Bucle Principal de Prueba
while(1) {
// ¿Se encendió la bandera de hardware de Input Capture?
if (TIM2->SR & TIM_SR_CC1IF) {
// 1. Limpiamos la bandera para esperar el siguiente pulso
TIM2->SR &= ~TIM_SR_CC1IF;
// 2. Cambiamos el estado del LED de la Bluepill (Toggle)
GPIOC->ODR ^= (1 << 13);
}
}
}