06 第二波 C1。新增 EXTI 控制器(IMR/EMR/RTSR/FTSR/SWIER/PR),GPIO 边沿经 AFIO EXTICR 路由 → 触发 → raise NVIC(复用 C2 的 raise_irq 通道,EXTI 是其第二个消费者)。GPIO
simulate_input改为也 emit edge(外部输入边沿喂 EXTI)。ctest 296/296 绿(289 + 7 新)。
06 第二波 C1:GPIO 外部中断模式。AFIO EXTICR 寄存器已存但无消费者,缺 EXTI 控制器(06 实测 EXTI 0%)。复用 C2 打通的 raise_irq 通道 —— EXTI 作为第二个消费者,证明该通道通用(TIM/EXTI/USART 都走它)。
Stm32f1Exti : Device(@0x40010400):6 寄存器 IMR/EMR/RTSR/FTSR/SWIER/PR(PR rc_w1,写 1 清)。on_gpio_edge(GpioEdge):线=pin → EXTICR 路由校验 port → IMR 使能 + RTSR/FTSR 沿匹配 → set PR + raise(经exti_irq_for_line)。- AFIO
exti_line_port(line)(stm32f1_afio.hpp):暴露 EXTICR 路由(线 N → 端口 0=PA,1=PB,…)。原exticr_[4]私有无 getter。 - GPIO
simulate_inputemit edge(stm32f1_gpio.cpp):原只改idr_不 emit;EXTI 监听外部输入边沿,故现也 emit edge_signal(与 ODR 边沿同路径)。 - 线→IRQ(
exti_irq_for_line,EXTI hpp):0-4=6-10,5-9=23(EXTI9_5),10-15=40(EXTI15_10)。 - SoC 接线(stm32f103_soc.cpp):
exti.set_afio(afio)+gpioa/b/c.edge_signal().connect(exti slot)+exti.set_irq_callback(raise)。
- 单元(test_stm32f1_periph.cpp):寄存器 R/W、PR w1c、上升沿触发 + IRQ 号、错端口不触发、IMR 屏蔽、FTSR-only 不响应上升沿。
- E2E(test_interrupt_roundtrip.cpp
ExtiGpioEdgeRoundtrip):simulate_inputPA2 上升沿 → EXTI → raise IRQ8 → handler 进入 → BX LR 返回。 ctest全量 296/296 绿,固件 E2E/CLI/中断抢占无回归。
MICRO_FORGE_SOURCES是显式set()列表(CMakeLists.txt 行 25),非 DIRECTIVES A 说的GLOB_RECURSE:新src/*.cpp须手动加该列表,否则vtable undefinedlink error(reconfigure 也不会自动扫)。- IPR word 对齐:EXTI 线优先级寄存器
0xE000E400+N(byte N);word 写须 4 对齐(IRQ8 在 0xE000E408 byte0;IRQ9 在 byte1 需<<8)。测试选 IRQ8(word 对齐)避 unaligned。 - simulate_input vs ODR edge:原
edge_signal只 ODR 变化 emit;EXTI 要外部输入,故补simulate_inputedge emit(输入边沿同路径喂 EXTI)。 - EXTICR 路由:EXTI 线 N 路由到
EXTICR[N/4]bits[(N%4)*4 : +4] 选的端口;错端口的 edge 不触发。 - C2c 跳过:抢占/嵌套验证边际价值低(Thread 被抢占已由
TimerUifRoundtrip验证 +active_priorities_已被 test_interrupt 5 测试覆盖),本里程碑不补。
EXTI 外部中断端到端(GPIO 边沿 → EXTI → NVIC → handler),AFIO EXTICR 终于有消费者,raise_irq 通道第二个用户(证通用)。剩 C3 USART RX-IRQ(第三消费者,需先设计串口输入注入)。