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:
- Escribe 5 registros de tipo
SRAM_TYPE_SENSORcon valores sintéticos - Escribe 3 registros de tipo
SRAM_TYPE_CIRCUITcon celdas de ejemplo - Muestra por USART1 el conteo total y por tipo
- Itera los registros de cada tipo y los imprime
- 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.