Saltar a contenido
← Volver a OPRobots.org

Arquitectura Software

Visión general

El firmware sigue una arquitectura secuencial simple con inicialización en cascada y un bucle principal de demostración. No utiliza RTOS: la única interrupción activa es el SysTick a 1 kHz para la base de tiempos.

La demo escribe registros de varios tipos en la SRAM externa, los lee mediante el iterador, imprime estadísticas, y entra en un bucle de parpadeo del LED.

Módulos del proyecto

Módulo Archivos Responsabilidad
setup setup.c, setup.h Inicialización del hardware (clocks, GPIO, SPI, USART, SysTick, SRAM)
sram sram.c, sram.h Ring buffer heterogéneo en SRAM externa
delay delay.c, delay.h Delays por ms y µs, contador de ticks del sistema
usart usart.c, usart.h Redirección de printf a USART1 (syscall _write)
config config.h Constantes del sistema (frecuencias, macros)
main main.c Demo del ring buffer y tipos de registro de ejemplo

Secuencia de inicialización

flowchart TD
    Reset[Reset / Power-on] --> Clock[setup_clock\n84 MHz PLL + DWT]
    Clock --> SysTick[setup_systick\n1 kHz]
    SysTick --> Priorities[setup_timer_priorities\nNVIC priorities]
    Priorities --> GPIO[setup_gpio\nLED, USART, SPI, CS]
    GPIO --> USART[setup_usart\n115200 baud, 8N1]
    USART --> SRAM_Init[setup_sram\nSPI 10.5 MHz + sram_init]
    SRAM_Init --> Main[main loop]

Detalle de inicialización

Etapa Función Acción
1 setup_clock() Configura HSE 25 MHz + PLL → SYSCLK 84 MHz. Habilita relojes de GPIOA, GPIOC, USART1, SPI1, SYSCFG. Activa DWT cycle counter.
2 setup_systick() SysTick a 1 kHz (SYSTICK_FREQUENCY_HZ = 1000).
3 setup_timer_priorities() NVIC: SysTick prioridad 16, USART1 prioridad 32. Habilita IRQ de USART1.
4 setup_gpio() PC13 = LED (output). PA9/PA10 = USART1 (AF7). PA5/PA6/PA7 = SPI1 (AF5). PA15 = CS SRAM (output, high).
5 setup_usart() USART1: 115200 baud, 8 bits, 1 stop, sin paridad, sin flow control, TX+RX.
6 setup_sram() setup_spi_high_speed() → SPI1 DIV8 (10.5 MHz), Modo 0. sram_init() → activa modo secuencial + verifica/formatea cabecera.

Bucle principal (demo)

flowchart TD
    A[main] --> B[Escribir 5 registros SENSOR]
    B --> C[Escribir 3 registros CIRCUIT]
    C --> D[Imprimir estadísticas totales]
    D --> E[Iterar + imprimir SENSOR logs]
    E --> F[Iterar + imprimir CIRCUIT cells]
    F --> G[Loop infinito\nLED toggle cada 500 ms]

La demo no tiene máquina de estados — es una secuencia lineal de demostración que:

  1. Escribe 5 registros de tipo SRAM_TYPE_SENSOR con valores sintéticos
  2. Escribe 3 registros de tipo SRAM_TYPE_CIRCUIT con celdas de ejemplo
  3. Muestra por USART1 el conteo total y por tipo
  4. Itera los registros de cada tipo y los imprime
  5. Entra en bucle infinito parpadeando el LED PC13

ISR del SysTick

Parámetro Valor
Frecuencia 1000 Hz
Período 1 ms
Prioridad 16 (grupo 1)
Handler sys_tick_handler()

La ISR del SysTick se limita a incrementar el contador global clock_ticks (llamando a clock_tick()). Este contador es la base de delay() y get_clock_ticks().

void sys_tick_handler(void) {
  clock_tick();
}

Gestión de tiempos

Función Resolución Mecanismo Ubicación
delay(ms) 1 ms Bloqueo sobre clock_ticks delay.c:17
delay_us(us) ~84 ciclos (~1 µs) Bloqueo sobre DWT cycle counter delay.c:28
get_clock_ticks() 1 ms Lectura de clock_ticks delay.c:24
get_us_counter() ~1 µs DWT cycle counter ÷ 84 delay.c:13

Compilación condicional

El proyecto no utiliza compilación condicional (#ifdef). Toda la funcionalidad está siempre habilitada. Las líneas comentadas en setup.c (IRQ de USART RX, interrupción EXTI) y usart.c (inserción de \r) son remanentes de desarrollo desactivados intencionadamente para simplificar la demo.

Dependencias entre módulos

flowchart TD
    main.c --> setup.h
    main.c --> sram.h
    setup.c --> config.h
    setup.c --> delay.h
    setup.c --> sram.h
    setup.c --> usart.h
    sram.c --> delay.h
    delay.c --> setup.h
    usart.c --> usart.h

Documento generado el 2026-06-27. Ver también Hardware, Protocolos / API.