左左右学堂 STM32F103C8T6 HAL 综合验证工程 / v0.4

本工程是可编译的完整 C 固件，不是网页操作脚本。包含启动向量、复位初始化、
链接脚本、ST 官方 HAL 1.1.10 驱动、CMSIS、应用代码与已编译 ELF/HEX/BIN。

运行：
1. 在 https://www.zuozuoyou.cn/board-lab/ 选择“固件执行 · HAL 工程”。
2. 点击“加载完整 HAL 综合工程”，再点击“运行固件”。
3. USART1 输出 HAL READY，随后输出 ADC=... TIM=... KEY=...。
4. 改变 PB1 电位器，后续串口读数随实际 ADC 转换改变。
5. 按住 KEY 产生 PC13 下降沿中断，松开后再次按下可累计 KEY 次数。
6. 向 USART1 RX 输入文本，固件接收中断回调读取数据并回显。
7. TIM2 以 20ms 虚拟周期进入中断并翻转 PA15；TIM3_CH3 为 1kHz、25% PWM。

构建：安装 Python 3 和 Arm GNU Toolchain，运行 python build.py。
也可设置 ARM_CC 为 Zig 0.14.1 可执行文件的路径，再运行 python build.py。
默认内存：Flash 0x08000000 / 64KB，SRAM 0x20000000 / 20KB。
STM32CubeIDE：
1. 将压缩包完整解压到英文路径，例如 D:\STM32Projects\BoardLab_HAL。
2. File > Import > General > Existing Projects into Workspace。
3. Select root directory 选择解压目录，勾选 BoardLab_HAL，点击 Finish。
4. 选中工程，Project > Build Project（Ctrl+B）。
5. 固件位于 Debug/BoardLab_HAL.elf、.hex、.bin，可加载到网站仿真。

本包根目录含 .project、.cproject 和相对路径的全部构建依赖。
这是手写初始化的 CubeIDE C 工程，没有 .ioc；可直接导入并编译，不能用 CubeMX 图形化重新生成。
请导入整个目录，不要只打开 main.c。启动向量在 startup.c，链接脚本为 flash.ld。
工程不依赖 Python、Zig、在线固件库或绝对路径。

已验证：
- HAL_Init、SystemInit、HSE/PLL 72MHz、SysTick、HAL_Delay。
- NVIC 使能、挂起、优先级、PRIMASK、BASEPRI、嵌套中断和异常栈恢复。
- GPIOA-D、AFIO、PC13/EXTI13；TIM2/3/4 内部时钟向上计数、更新/比较与 PWM1。
- ADC1 通道9单通道轮询和中断，理想校准，0V/1.65V/3.3V。
- USART1/2/3 轮询/中断收发，状态位与固件回显。
- SRAM 和外设位带地址。
- 两份未修改的课程 ELF：30.1_ODR、29.1_My_printf。

边界：
这是上述范围内的完整 HAL 工程支持，不是 STM32 全芯片、全 HAL 模块仿真。
DMA、USB、I2C、SPI、RTC、ADC 扫描/注入、定时器捕获/编码器尚未实现。
不支持 FreeRTOS/PendSV 上下文切换、RTOS 系统调用、复杂低功耗或实时时序验收。
ARM M-class 后端默认 Cortex-M33，未限制成只接受 Cortex-M3 的指令特性。
每条指令推进32个虚拟HCLK tick；晶振ready与ADC校准采用理想功能模型。
虚拟时间不等于墙钟时间，不能据此标定实际脉宽、串口误差或电气性能。
外部器件模型和实板验收仍需后续对照，不保证任意固件均可运行。

许可：本项目应用和仿真适配代码 GPL-2.0。Drivers 中各源文件按其原版权及许可分发；
保留 ST 和 ARM 的许可文件。Unicorn.js、Three.js 的许可见网站 vendor 目录。

2026-11-01 验证：STM32CubeIDE 1.17.0 / Arm GNU 12.3，O0 教学调试配置，0 errors、0 warnings。此配置编译的 ELF 通过15项固件/中断/ADC/串口回归验证。其他编译器或优化级别需要另行验证。

