// ----- Función de retardo por software -----
void delay_ms(uint32_t milliseconds) {
uint32_t cycles = milliseconds * (SystemCoreClock / 12000);
for (volatile uint32_t i = 0; i < cycles; i++) {
// Mantiene al procesador ocupado
}
}
// ----- Función para habilitar puertos y configurar pines -----
void inicio(void) {
// 1. Habilita el reloj de los puertos GPIOA y GPIOB
RCC->IOPENR |= 0b00000000000000000000000000000011;
// 2. Configura los modos en el registro MODER
// Puerto A: Deja PA0 como Entrada (00). Los pines del 1 al 15 quedan como Salida (01)
GPIOA->MODER = 0b01010101010101010101010101010100;
// Puerto B: Todos los pines del 0 al 15 quedan como Salida (01)
GPIOB->MODER = 0b01010101010101010101010101010101;
// 3. Habilita resistencia de pull-up (01) en el pin PA0 (Pulsador A0)
GPIOA->PUPDR = 0b00000000000000000000000000000001;
}
// ----- Función principal -----
int main(void) {
inicio();
uint8_t leds_encendidos = 0; // 0 = apagados, 1 = encendidos
uint8_t boton_presionado_antes = 0; // Detecta el flanco de la pulsación
while (1) {
// Leemos el bit 0 del registro IDR (Pin PA0 correspondiente a A0)
uint32_t estado_boton = (GPIOA->IDR & 0b00000000000000000000000000000001);
// Si la lectura es 0, el pulsador está presionado
if (estado_boton == 0) {
if (boton_presionado_antes == 0) {
// Estructura IF/ELSE para alternar el estado
if (leds_encendidos == 0) {
leds_encendidos = 1;
} else {
leds_encendidos = 0;
}
boton_presionado_antes = 1; // Bloquea lecturas continuas
delay_ms(50); // Retardo antirrebote
}
} else {
boton_presionado_antes = 0; // El pulsador ha sido liberado
}
// === ACCIÓN CONTROLADA SOBRE LOS PUERTOS (BSRR) ===
if (leds_encendidos == 1) {
// ENCIENDE: En el Puerto A encendemos del pin 1 al 15
GPIOA->BSRR = 0b00000000000000001111111111111110;
// En el Puerto B encendemos todos del 0 al 15
GPIOB->BSRR = 0b00000000000000001111111111111111;
} else {
// APAGA: En el Puerto A apagamos del pin 1 al 15
GPIOA->BSRR = 0b11111111111111100000000000000000;
// En el Puerto B apagamos todos del 0 al 15
GPIOB->BSRR = 0b11111111111111110000000000000000;
}
delay_ms(10); // Sincronización del simulador
}
}
Loading
st-nucleo-l031k6
st-nucleo-l031k6