STM32F407 上的有限 I2S2 从机发送¶
在独立控制的外部 I2S 主机提供时钟时,这个精确裸机角色可让 STM32F407VET6 或 STM32F407ZGT6 发送一个由调用方拥有的 stereo16 帧块。单一任务拥有发送器、外部时钟握手及失败排空。实现提供有限普通模式 DMA 和显式最终访问边界;产品负责采样值、速率、编解码器、主机及恢复政策。物理 HIL 为 not_executed。IO-41 仍为 in_progress;连续音频、SAI 和 PDM 仍开放。
选择一个物理角色¶
在 [i2s2] 中以 profile = "slave-tx-stereo16-pb12-pb13-pb15" 声明这个角色。它与其他控制器通过同一套已验证硬件 IR 和资源计划解析。所选 SPI2 模式、引脚、DMA stream 或向量发生冲突时,在生成前拒绝。省略角色就保持未选中,不创建音频所有者或目标。
资源或格式 |
精确选定项 |
|---|---|
芯片与时钟 |
STM32F407VET6 或 STM32F407ZGT6;baremetal; |
线上协议 |
Philips I2S;两个 16 位声道、16 位时隙;采样以 MSB 优先的顺序输出 |
引脚 |
PB12 WS 输入、PB13 CK 输入、PB15 SD 输出;AF5 |
DMA 引擎 |
DMA1 Stream4 channel0;普通模式、直接模式、内存地址递增的 16 位传输 |
独占中断向量 |
DMA1 Stream4 和 SPI2;中断源始终保持禁用,不安装 IRQ 服务 |
数据负载 |
一个平面,偏移为零,各非空行连续排列,满足 |
块大小 |
4..131068 B,且为四的倍数;2..65534 个 DMA 半字 |
DMA 可访问内存 |
整个对齐的源数据范围必须位于主 SRAM |
对于这种 stereo16 I2S 格式,nx_frame_layout_audio 将连续音频帧描述为行。保留这种规范布局:多帧块可以由多个连续行组成。provider 检查行非空、stride == row_bytes,并以有界计算核验 rows * row_bytes == layout.bytes,再以实际行布局取得视图。DMA 计数和结清均覆盖完整块,不存在逐行借用或逐行完成。
nx_frame_layout_t 记录存储几何布局,不配置线上格式,也不验证音频格式元数据。调用方仍须提供所声明的小端 stereo16 采样。音频布局 helper 的其他格式不会因此成为发送器支持的格式。
下面是维护的 VE 输入。ZG 输入 以相同角色选择对应的精确 Board 包。
schema = 2
board = "stm32f407ve_sky_qingchun"
backend = "baremetal"
clock = "hse8-pll168"
optimization = "Os"
[memory]
main_stack_bytes = 2048
flash_load_limit_bytes = 65536
static_ram_limit_bytes = 32768
libc_heap_bytes = 0
# Chip pin capability only; no audio PCB or external master is qualified.
[i2s2]
profile = "slave-tx-stereo16-pb12-pb13-pb15"
组件目标为 Nexus::F407I2S2SlaveTx,仅在选中已验证角色时由其 CMake 文件 定义。消费者显式链接目标,并以共享操作表和独立清零的所有者存储构造一个稳定的只读 face。Factory 查找不创建或启动音频所有者。固件所有者存储为 88 B,不包括调用方拥有的请求、流、帧和载荷存储。不创建任务、分配、队列或重放 worker。
该角色使用外部 CK/WS,不启用 PLLI2S,也不生成音频时钟。芯片 AF 能力不证明 PCB 布线。装配提供精确料号/封装身份:器件组和 Flash 容量读取不能认证 F407 或区分其物理封装。调用方必须满足 DS8626 的电压、I/O、负载及 CK/WS/SD 时序要求,并提供足够的 DMA 补充裕量。本软件不定义实测外部时钟速率,也不额外给出经过特性测定的 PCLK 与 CK 比率。
分别维护 Platform 与发送器所有权¶
所选正常 Platform 启动以冷复位为前提,没有其他已在运行的外设或总线主设备。它建立固定时钟和 TIM2 时间域,并在 Platform 生命周期内持有 GPIOB/DMA1 门控。时钟门控状态不能证明保留的 DMA 引擎已经复位;不支持附着到未知门控状态或正在运行的 HAL 状态。
发送器初始化要求两个共享门控已经开启。它拥有 SPI2 门控、SPI2/I2S2 模式、所选引脚字段及两个向量,直至发送器成功停止。它从不打开或撤回 GPIOB/DMA1 门控,不复位整个 DMA 控制器,也不改变相邻 stream/引脚状态。Platform 在写入前记录所尝试添加的门控,保留预先存在的门控,并在回滚失败时继续承担清理责任。
一个未设置中断屏蔽的特权任务串行执行初始化和每个方法。排除并发 Platform stop、复位/重新配置时钟/调试器写入者,以及竞争 DMA、向量或引脚的所有者。调用失败不授权复用存储。在 Platform stop 撤回其添加的门控或结束 TIM2 时间域前,先停止并 join 发送器及所有其他共享域用户,包括外部 HAL 用户。旧的绝对截止时间不能跨越 Platform stop/restart。
先接受帧,再允许主机开始¶
FIG-30 是这个精确角色的参考生命周期。 实线表示必需顺序或已标明的分支;虚线表示保留责任及有界重试。其依据是下方链接的公共头文件、provider 和所选 System 实现。它不证明物理时钟持续静止或硬件资格。
在初始化和提交之前开始,持续保持 CK 为 LOW、WS 为 HIGH,直到以 acquire 语义观察到 ACTIVE。寄存器中的引脚读数只反映采样瞬间;连续的静止间隔必须由调用方协调外部主机来保证。每次正常重新启动都从左声道开始。
先成功启动 Platform,再使用地址稳定的接口对象和正值
poll_limit初始化全新的发送器存储。初始化返回 IO 时可能仍保留清理责任;必须保持其存储有效,并调用 stop。使用常规 stream/frame 辅助函数构建完整、连续的帧,并取得其原始
nx_frame_dma_loan_t。在当前有效 TIM2 时间纪元内,使用绝对截止时间初始化并准备请求,再将该借用赋给请求的source。控制对象必须正确对齐、始终有效,且与池中每个槽位的完整容量范围互不重叠,包括未使用的负载尾部。通过接口对象提交请求。拒绝接纳时,不保留任何请求或帧引用,也不会产生提交所导致的硬件效果。
NX_SUCCESS表示 ACCEPTED:该确切的完整帧借用及请求均已被借用。提供方会先发布 QUEUED,再进行请求路径中的首次读清除型 SR 观察或允许任何可能的 DMA 预取。初始化则在读取 SR 之前,单独取得相应的清理责任。提交过程同步执行有界的就绪准备。它先写入完整的半字计数,再依次启用 DMA、TXDMAEN 和 I2SE。发布 ACTIVE 前,必须观察到 I2SE 已启用、DR 已预填充一个半字(
NDTR = N - 1、TXE = 0),并在启用读回后观察到至少三个实际的 1 MHz TIM2 计数推进。BSY = 0不是就绪准备的前提条件。CPU 轮询次数不表示经过的时间。返回时请求可能已经处于 ACTIVE 或 DRAINING;仅有 QUEUED 或 ACCEPTED 绝不允许开始提供 CK。只有以 acquire 语义观察到 ACTIVE,才允许主机为所声明的完整立体声帧提供时钟。主机必须在需要下一个尚未提供的数据字之前停止。由同一个任务调用
service,观察完成状态、错误和截止时间到期,并推进排空。提供方不通过 IRQ 推进请求。
SR 读取会清除 UDR/FRE,因此每次请求路径中的观察都发生在接受之后,并将任何故障保留为本操作的首个错误。后续干净的读取或迟到的 DMA 完成都不能将错误变成成功。绝对截止时间覆盖整个操作,包括线上排空及最终地址/向量撤回。使能观察预算耗尽也可能产生 TIMEOUT;这不证明已经经过某个特定时长。poll_limit 限定每个观察循环,从不保证外部主机取得进展。
归还存储前证明最终访问¶
观察结果或阶段 |
所需操作与仍须承担的责任 |
|---|---|
正常的 |
这只能证明内存计数完成。继续保留对请求和帧的借用。软件禁用 DMA 也可能在计数非零时置位 TCIF。 |
取消、超时或失败 |
保留首个错误并进入 DRAINING;任何错误或取消均报告零传输字节。 |
DMA 引擎撤回 |
清除 TXDMAEN 和 DMA EN 并完成读回确认,然后才能依据串行发送器的排空状态继续。清除失败时仍保留借用。 |
任何 I2SE 启用尝试 |
先观察到 |
未尝试启用 I2SE |
对于已被接受、但在早期设置阶段失败的请求,可以在不等待串行发送器标志的情况下证明 DMA 引擎和引用已撤回。 |
已证明串行发送器空闲 |
在之后的清理重试中保留该证明;不要再次要求已禁用的 I2S 给出 TXE。 |
引用撤回 |
清除 DMA 流配置、地址、计数和标志;撤回中断向量,并证明它们已禁用、无挂起且不处于活动状态。 |
所有证明均已汇合 |
解除提供方持有的引用,归还原始完整帧借用,然后以 release 语义发布 SETTLED,作为对请求的最终访问。 |
证明不足 |
保留处于 QUARANTINED 的存储。排空循环达到次数上限时可以返回 BUSY;超时、TC 或 DMA 计数为零都不能替代最终访问证明。 |
先以 acquire 观察 SETTLED,再读取终结结果或复用请求及帧存储。成功完成报告全部提交字节数。错误和取消报告零;DMA 计数不能证明串行音频字节数。复用外部观察者自身存储前,先 join 这些观察者。只要 stop 尚未关闭准入,请求成功结清后,已初始化的发送器就可接受另行准备的下一块;结清不归还其物理角色。
预填充后 CK 保持静止时,DR 无法清空。因此,取消仍保留借用,直至产品协调足够的排空时钟,实际证明 TXE 及新鲜 BSY 条件。这种错误排空可能欠载或产生部分/无效音频,不保证完整 stereo 帧。保留首个失败,之后重启只能从左声道开始。只要硬件/时间历史仍已知,就可通过同一所有者继续调用 service 或 stop,重试时钟停滞后的清理。
借用期间观察到复位、共享门控/时钟配置丢失或无效时间历史,会使本实例及其借用永久隔离。将寄存器恢复为看似复位的状态,不能证明此前的最终访问。不存在撤销该借用的复位或恢复 API。产品负责应对无法恢复的控制器/主机故障。
stop 关闭准入并请求取消。在 service 确认剩余清理已完成后,再次调用 stop。只有发送器成功停止才归还所选引脚/SPI2 模式及 SPI2 门控;共享 GPIOB/DMA1 门控仍留给 Platform 用户。失败的 stop 保留每个未结束的借用及已拥有的效果。
判断当前证据¶
选入 I2S2 的 VE、ZG 配置以及未选入 I2S2 的默认配置均已通过普通 ARM 构建。限定范围内的 Native 与选择测试、SDK/交付工具检查、retention 检查,以及修正后的两项调用者接口审计也均已通过。一个经移动路径的不可发布开发版 Source SDK 已通过导出、更名、验证、公共 C11 consumer 链接、所选镜像审计及再次验证;该 SDK 检查仅覆盖一个 VE 镜像。源码绑定证据记录完整镜像资源,不代表独立驱动成本。这些是部分开发证据,不能据此认定完整 v10 矩阵、clean main、正式/OCI 交付或物理 HIL 已取得资格。API 与全站构建收据,以及最终提交门禁,必须分别评估。原有严格 Wshadow 与测试夹具准备失败记录继续保留,并与功能 TDD 分列。
正常公共消费者源码为 f407-i2s2-slave-tx.c。它链接公共构造和完整帧所有权路径;链接不会执行这些调用。它不是外部时钟源,也不是已完成的硬件教程。不宣称已执行物理运行或获得有效音频结果。连续 DBM、无间隙重放、SAI/PDM、其他格式/引脚/料号/后端及物理 HIL 在 IO-41 下仍开放。
硬件顺序遵循 RM0090 Rev22 第 28.4.6–28.4.8 节及第 10.3.13–10.3.14 节,同时以 DS8626 的电气要求及锁定的 ES0182 适用范围为约束。不以仅适用于 SPI 的 BSY 勘误规避方法替代 I2S 停止顺序。来源身份维护于 F407 参考清单。