STM32H7同时驱动16位SDRAM与PSSI:引脚复用与DMA设计实战

发布时间:2026/8/31 22:38:44
STM32H7同时驱动16位SDRAM与PSSI:引脚复用与DMA设计实战 1. 项目概述一颗芯片同时搞定大缓存和高速并行采集做嵌入式图像采集或者运动控制的朋友应该都遇到过这种尴尬主控芯片算力够了但内存不够外部接个大SDRAM吧引脚又紧巴巴的想再接个并行摄像头或者高速ADC结果发现数据线和地址线撞车了只能二选一。STM32H7系列给出的答案是FMC外设和PSSI外设可以组合使用在16位SDRAM和16位PSSI之间做到“同时支持”——注意这个词不是说两条总线物理上完全独立各跑各的而是说在芯片内部总线矩阵和引脚复用层面你可以同时配置这两个外设让它们在同一个系统里正常工作。这个能力解决的是什么问题典型的应用场景是用STM32H7做视觉引导的机械臂控制摄像头通过PSSI接口把并行数据灌进来图像帧先存到外部SDRAM里做缓冲CPU或者DMA2D再从SDRAM里取数据做处理同时H7的定时器还在输出脉冲控制伺服轴。一个芯片全包了不用上FPGA也不用上Linux级别的MPU。另外一个高频场景是高速数据采集PSSI接收外部ADC或者FPGA送来的16位并行数据流SDRAM作为大容量FIFO缓存攒够一批数据再做FFT或者FOC运算。这篇博文适合谁看正在用STM32H7系列做视觉采集、运动控制、高速数据记录的朋友尤其是打算上SDRAM又舍不得PSSI的同学。我先说结论这条路走得通但有几个坑必须提前知道否则调试的时候会怀疑人生。2. 底层机制为什么H7能同时驱动SDRAM和PSSI2.1 FMC总线仲裁机制是这一切的地基要理解“同时支持”首先得搞清楚STM32H7的总线架构。H7内部用的是AXI总线矩阵CPU核心、DMA、以太网MAC、USB等主设备都挂在总线矩阵上FMCFlexible Memory Controller是总线矩阵上的一个从设备端口。PSSI则是一个挂在AHB上的外设它有自己独立的FIFO和寄存器接口数据进来之后可以通过DMA请求搬运到内存也可以直接由CPU读取。关键点在这里FMC和PSSI在芯片内部的总线访问路径不冲突SDRAM的读写走FMC控制器PSSI的数据接收走自己的FIFO两者通过DMA和总线矩阵最终都落到内部SRAM或者外部SDRAM。也就是说PSSI接收的数据可以通过DMA直接写入SDRAM里而SDRAM同时也可以被CPU、LTDCLCD控制器或者DMA2D访问。这种“绕弯子”的设计让SDRAM和PSSI可以共享同一片物理内存不需要在两者之间额外加硬件FIFO。当然这有一个前提总线矩阵的仲裁要合理分配带宽。H7的总线矩阵仲裁策略是可以配置的每个主设备有不同的优先级。PSSI这种实时性较强的数据流我一般会把它的DMA通道优先级调到最高或者次高避免在SDRAM被LTDC大量刷新的时候丢失数据。这一点后面软件配置部分我会详细说。2.2 PSSI到底是什么外设很多朋友对PSSI比较陌生它是STM32H7系列新引入的并行同步串行接口全称Parallel Synchronous Serial Interface。你可以把它理解成一拍能传8位或者16位数据的SPI只不过它没有标准的协议层纯粹靠外部时钟同步适合接并行ADC、并行摄像头传感器、FPGA之类的设备。PSSI有两种工作模式主动模式和被动模式。主动模式是H7自己产生时钟向外发送并行数据被动模式是外部提供时钟和同步信号H7收数据。我们做采集应用用的基本上都是被动模式。在被动模式下PSSI外部需要三个信号并行数据线8位或者16位、时钟CK、同步信号DEData Enable。DE信号拉高期间每个时钟上升沿采集一次数据数据进入内部FIFOFIFO半满或者达到设定阈值之后触发DMA请求。PSSI的FIFO深度我记得是8个字节具体看参考手册不同型号可能有差异默认情况下如果不用DMACPU会在中断里读数据但8字节的FIFO在高速时钟下根本扛不住所以可靠的做法是一上来就配DMA。2.3 “同时支持”的本质引脚复用和分时仲裁现在说重点FMC的SDRAM控制器需要一组数据线、地址线和控制线PSSI也需要一组数据线、时钟和使能线。如果你仔细去翻H7的数据手册会发现PSSI的部分引脚和FMC的数据线复用在同一个物理引脚上。举个例子在LQFP144封装上FMC的16位数据线D0到D15分布在PE7到PE14、PD0到PD7这些引脚上而PSSI的部分数据线也可能映射到相近的引脚组。这就意味着如果你的SDRAM用了完整的16位数据总线那么PSSI并不是随便挑引脚都能用的得看具体型号的AF映射表找出那些“PSSI能复用但FMC没占用”的引脚。这句话听起来有点绕我拆开说H7的PSSI数据引脚映射有好几组可选比如PSSI_D0到D7可以映射到PB0到PB7也可以映射到PC0到PC7具体看型号。而FMC的D0到D15是固定映射的。所以设计的关键是在项目开头就对照《DS12505 datasheet》的Alternate Function Mapping表把FMC占用的引脚全部标出来再挑一组完全不重叠的PSSI引脚。只要引脚不重叠从硬件角度就做到了“同时支持”。至于“分时仲裁”指的是FMC和PSSI在访问SDRAM时总线矩阵会在时钟周期级别做仲裁这个对我们应用开发者来说是透明的不用干预。但你要知道的是仲裁本身不会丢数据可是如果PSSI的DMA请求迟迟得不到响应FIFO溢出就会丢数据。所以软件上的优先级配置比硬件连接更关键。3. 硬件设计引脚规划、PCB布线和SDRAM选型3.1 引脚分配实操先画一张复用冲突表我习惯在画原理图之前先拉一张Excel表把所有需要用到的外设引脚列出来按“外设功能、引脚号、AF号、是否冲突、备注”五列来管理。以STM32H743VIT6LQFP100封装为例FMC SDRAM用到的引脚至少包括数据线PD0到PD7FMC_D0到D7PE7到PE14FMC_D8到D15地址线PF0到PF3FMC_A0到A3PG4、PG5等控制线PC2SDNE0、PC3SDCKE0、PG8SDCLK、PF11SDNRAS、PG15SDNCAS、PH5SDNWE等然后看PSSI的可选映射。以STM32H743的PSSI为例PSSI_D0到D7可以复用为PB0到PB7PSSI_D8到D15可以复用为PC0到PC7的一部分? 实际上H743的PSSI引脚映射如下参考具体数据手册PSSI_D0-PSSI_D7对应PB0-PB7的AF13PSSI_D8-PSSI_D15对应PE7-PE14的AF13而PSSI_CK对应PB8或PE15PSSI_DE对应PB9或PE6等。这下问题来了PE7到PE14如果被PSSI_D8到D15占用那FMC_D8到D15就没了16位SDRAM数据总线就凑不齐。所以在实际同时使用16位SDRAM和16位PSSI时必须根据具体型号的映射找出不冲突的组合。有的型号PSSI_D8到D15映射到PC0到PC7或者PD0到PD7那就可以和SDRAM错开。如果LQFP100封装实在错不开还有一个方案SDRAM降位宽——用8位SDRAM省出来的D8到D15给PSSI用。但这就绕回了标题说的是16位SDRAM和16位PSSI同时支持。所以更稳妥的做法是优先选LQFP176或者BGA封装的型号引脚多错开的余地大。我在实际项目里用的是STM32H750VBT6LQFP100通过精心挑选PSSI的映射组最终做到了16位SDRAM和16位PSSI同时铺开但这个过程花了两天反复核对数据手册。所以强烈建议原理图定稿前至少花半天时间专门核对引脚复用。3.2 SDRAM选型与硬件布线注意事项SDRAM的选择优先考虑16位数据宽度的SDRAM颗粒常见的有IS42S16400J4M×16和W9825G6KH2M×32? 不对这是16位宽? W9825G6KH是256Mb16位4M×16。我做项目常用的是IS42S16400J-7T容量64Mb16位宽7ns的访问周期成本低、货源稳。如果对容量要求高可以上IS42S32800J32位宽但因为是32位宽和16位PSSI共用引脚时冲突概率更大所以16位SDRAM反而是最合理的折中方案。PCB布线层面SDRAM的时钟线、数据线、地址线要特别注意等长特别是CLK。我记得第一次画H7SDRAM的板子CLK线长了大概1.5cm跑在168MHz的SDRAM时钟下偶尔会出现随机数据错误最后把CLK线绕短、数据线控制在±0.5mm误差范围内才稳定下来。细节上还注意SDRAM的VDD和VDDQ去耦电容尽量靠近引脚每个电源引脚配一个100nF陶瓷电容尽量保证SDRAM底下有一块完整的GND平面别被其他走线切断。当然了双层板不是说不行但推荐至少四层板第三层做完整地平面是最稳妥的。PSSI的数据线因为是从摄像头模组或者ADC模块过来的一般速率在10MHz到50MHz之间相对好处理但要注意和SDRAM的数据线拉开距离别互相串扰。3.3 时钟树的规划PSSI时钟和SDRAM时钟同源吗H7的时钟树里FMC的SDRAM时钟来源于AXI域时钟而PSSI的接收时钟来源于外部引脚。也就是说PSSI时钟并不需要内部PLL提供外部给多少就采多少。这带来一个很大好处摄像头或者ADC的像素时钟不需要和FMC时钟同步两个域之间通过FIFO和DMA自然解耦。但是有一个前提PSSI的输入时钟频率要在外设允许范围内。H7的PSSI最大时钟频率和电压域有关系一般VOS1最高性能档下可以支持较高的频率具体数值以参考手册的电气特性表为准。我实际用到的场景是8MHz相机像素时钟完全没压力。如果你的设备跑到50MHz以上就得仔细看手册里I/O能力配置了可能要把对应引脚设置成High Speed模式同时在CubeMX里的GPIO Speed选Very High。4. 软件配置CubeMX与寄存器级初始化细节4.1 CubeMX里如何配置FMC SDRAM在STM32CubeMX里选中FMC外设在Mode下拉里勾选SDRAM Bank1然后在Configuration面板里逐项填时序参数。SDRAM初始化时序是需要认真计算的几个关键参数LoadToActiveDelaytRCDRAS到CAS延迟典型值2个时钟周期ExitSelfRefreshDelaytRC刷新周期典型值9个时钟周期SelfRefreshTimetRAS? 这里CubeMX命名可能略有差异一般填4到6个时钟周期RowCycleDelaytRC行周期典型值9到10个时钟周期WriteRecoveryTimetWR写恢复时间典型值2个时钟周期ReadToPrechargeDelaytRTP读后预充电延迟典型值2个时钟周期这些值到底怎么定翻一下你买的SDRAM芯片的数据手册里面的AC特性表里会给出最小时间单位ns。用这个最小时间除以时钟周期向上取整再加一个余量就是你要填的时钟周期数。举个例子IS42S16400J-7T的tRCD最小是20ns如果SDRAM时钟是100MHz周期10ns那么tRCD至少要填2个周期我习惯填3稳妥一些。CubeMX里还有一个Init Sequence设置就是SDRAM上电后需要执行的初始化命令序列Precharge All、Mode Register Set、若干次Refresh。CubeMX生成的代码里会调用HAL_SDRAM_Init()它内部会执行初始化序列但要注意如果你在初始化之前就尝试访问SDRAM那就是未定义行为程序能跑起来纯属运气。4.2 从零配置PSSIDMA联动是核心PSSI在CubeMX里属于多媒体类别下的外设勾选PSSI工作模式选Slave接收数据宽度选16位外部时钟极性选上升沿或者下降沿根据传感器手册决定DE使能按需打开。这里有一个容易忽略的地方PSSI的FIFO深度只有8字节所以DMA配置必须选Normal模式还是Circular模式要想清楚。我推荐用Circular模式DMA持续把PSSI FIFO里的数据搬到SDRAM的一个环形缓冲区每次搬完指定长度就触发一次传输完成中断在中断里把“当前帧数据已就绪”的标志位置1。这样一来CPU不需要频繁进出中断只在每一帧开始处理的时候介入一次效率高很多。DMA的具体配置项数据宽度必须和外设寄存器一致PSSI的FIFO是32位对齐的我习惯把外设数据宽度设成Word32位内存数据宽度也设成Word这样一次搬运4个字节比Half Word效率高一倍。但要注意如果传感器送来的数据是16位像素那DMA搬的时候实际有效数据是低16位高16位可能是0或者上一次残留处理时要做掩码或者移位。4.3 初始化顺序谁先谁后有讲究实际调试中我总结出一个固定顺序用这个顺序系统能稳定跑起来反过来就容易出怪问题先初始化SDRAM并且做一次简单的写读校验比如往地址0写0x55AA55AA再读出来比对确认SDRAM稳定。再配置DMA把DMA目标指向SDRAM缓冲区。然后配置PSSI但先不使能DE信号。最后启动DMA传输再使能PSSI和DE信号。为什么这个顺序重要因为PSSI一旦使能外部时钟随时可能进来数据就会开始往FIFO里灌如果DMA还没准备好FIFO一溢出就丢数据。先使能DMA再使能PSSI相当于先挖好水渠再开水闸不会漫出来。另外SDRAM先行的道理也简单DMA的目标地址在SDRAM里如果SDRAM都没初始化好DMA搬过去的数据就会写进一片未知区域轻则数据丢失重则触发总线错误HardFault。4.4 SDRAM刷新与带宽优化缓冲位置要动脑子SDRAM需要周期性刷新这是它和SRAM最大的区别。H7的FMC SDRAM控制器会自动处理刷新请求但是刷新操作会占用总线带宽。如果LTDC同时在读SDRAM刷屏、PSSI DMA又在往里写数据总线繁忙时PSSI可能在刷新间隙里抢不到DMA响应。这里有个优化技巧把DMA的FIFO阈值调低。STM32的DMA控制器内部有个FIFO可以设置阈值1/4、1/2、3/4、Full。默认的1/2阈值意味着DMA要攒够一半FIFO才往内存搬一次如果某个瞬间总线特别挤可能就会多等一会儿。我实测下来在PSSIDMA场景下DMA FIFO阈值设成1/4传输模式用Burst的Single模式CPU占用更低、数据丢包率最小。另外一个实用经验DMA的目标缓冲区如果条件允许放在内部RAM而不是SDRAM里。当然做视觉采集时图像数据比较大内部RAM装不下必须放SDRAM那就做一个中间小环形缓冲DMA先搬到内部RAM的512字节环形缓冲再由CPU的另一个DMA或者memcpy把数据转存到SDRAM。这种方式能有效避免PSSI数据因为总线拥塞被丢掉代价是多一次拷贝。对实时性要求极高的场景这个拷贝开销是值得的。5. 数据通路设计双DMA搬运与帧同步策略5.1 PSSI到SDRAM的DMA链路怎么搭先说结论PSSI的DMA请求信号可以直接连到DMA1或者DMA2的某个Stream和Channel上具体映射关系在参考手册的DMA request mapping表里查。以STM32H7为例PSSI的请求对应的DMA通道是固定的配置的时候必须选对Stream和Channel否则DMA永远不会触发。我的配置方法是这样的DMA选择DMA2因为它和外设的关联度高带宽也更充足。Stream选Stream0Channel根据CubeMX提示自动分配给PSSI。方向Peripheral To Memory。外设地址PSSI数据寄存器地址PSSI_DR。内存地址SDRAM缓冲区地址注意要按32位对齐。传输长度一次DMA循环传输的字节数一般是每帧数据量除以4因为按32位算。模式Circular循环模式。外设地址自动递增关闭因为PSSI数据寄存器地址固定内存地址自动递增打开。还有一个容易忽略的点PSSI的FIFO在读取数据时如果开启了DE同步功能读出来的一个32位字里高16位和低16位分别对应两个连续的16位PSSI样本。也就是说DMA按32位读一次实际上拿到了两个16位像素。如果你的传感器输出是RGB565格式每个像素占16位那一次DMA搬运正好拿走两个像素非常舒服。5.2 帧同步DE信号和DMA半传输中断配合PSSI的DE信号即Data Enable是外部设备给出的“当前数据有效”的指示信号。我们在软件上怎么判断一帧数据收完了两种方式第一种如果外部设备在每一帧之间拉低DE一段时间比如行消隐或者帧消隐可以配置PSSI的DE信号在下降沿产生中断在中断里判断“一帧结束”。这个方案的缺点是DE下降沿中断会产生额外的CPU负载而且如果帧率很高中断太频繁会影响其他任务。第二种用DMA的半传输和全传输中断。把DMA循环缓冲区设置为两帧以上大小在DMA半传输中断里处理第一帧在全传输中断里处理第二帧这样CPU处理一帧的时间分布在一帧采集周期内平均负载更低。我个人更喜欢第二种尤其是在同时跑运动控制算法的时候DMA双缓冲方案可以让CPU算法处理和数据采集完全流水线化。简单说数据采集不打断CPU的实时控制CPU处理上一帧的时候DMA正在采集下一帧。这个设计思路其实和热词里出现的“双DMA实现脉冲输出”是同一个套路利用DMA在后台搬运数据、控制定时器把CPU解放出来做核心计算。STM32H7的运动控制应用里经常用DMA来更新比较寄存器保证多轴脉冲输出不抖动本质就是外设级的流水线。5.3 中断优先级设置这可能是你丢数据的元凶在STM32H7上做PSSI采集最常见的数据丢失原因不是硬件信号质量而是中断优先级配错了。PSSI的DMA传输完成中断、DE同步中断还有SDRAM的刷新、以太网、USB等外设中断大家一起争夺CPU。看一下我的优先级分配策略PSSI DMA中断抢占优先级0子优先级0最高级。FMC SDRAM错误中断抢占优先级1子优先级0。运动控制定时器更新中断抢占优先级1子优先级1。以太网中断抢占优先级2子优先级0。串口、按键等慢速外设抢占优先级3或更低。为什么要这么分因为PSSI的数据是实时流DMA半满中断如果晚来一会儿FIFO可能已经溢出数据就是一去不复返。运动控制定时器中断如果被卡住脉冲输出就会抖动电机位置就跑偏。这两者都是硬实时必须保证优先级足够高。以太网和USB虽然也要求实时性但相比之下有缓存机制延迟几微秒通常影响不大。另外提醒一点STM32H7的中断优先级配置是NVIC层面的需要在CubeMX的NVIC Settings里把所有用到的中断都打开并且手动修改优先级数值。很多人写代码的时候只把DMA中断开在CubeMX里但忘了把PSSI自身的错误中断比如FIFO溢出错误打开结果出问题的时候压根没有错误日志只能靠猜。建议把PSSI的Overrun Error中断也打开在中断里清标志位并打印一条错误信息这对调试很有帮助。6. 踩坑实录这些问题我调试时都遇到过6.1 白屏问题SDRAM初始化不成功画面花屏接上SDRAM之后最典型的故障是LCD显示花屏或者白屏或者摄像头图像存进去之后读出来全是乱码。这通常不是代码逻辑问题而是SDRAM根本没有稳定工作。排查步骤我建议按顺序来第一步用硬件调试器读FMC的SDRAM状态寄存器看SDRAM初始化命令序列是否正常完成。H7的FMC_SDSR寄存器里的Mode Status字段能反映当前SDRAM处于什么状态如果一直是Idle而不是Ready说明初始化序列卡住了。第二步做一次内存写读校验往SDRAM的每个Bank、每个Row写递增数再读出来比对。如果数据错乱优先怀疑时序参数配得太紧或者太松。时序参数太紧读写窗口不够太松刷新周期不匹配数据写进去后过一会儿就被刷新冲掉了。第三步检查复位引脚。我用过的一块SDRAM模组NRST引脚没接上拉电阻导致偶尔复位不释放现象就是上电后SDRAM随机出错。给NRST加10kΩ上拉到VDD问题消失。6.2 PSSI数据错位图像整体偏移颜色通道错乱PSSI采集的图像如果出现整体偏移半个像素或者颜色不对一般是两个原因一是数据线的位序反了D0接到D7、D1接到D6这样造成像素高位低位对调二是时钟极性和DE极性配反了采集到了无效数据边缘。解决办法先在CubeMX里把PSSI的时钟极性、DE极性换一下试试如果图像颜色仍然不对再检查原理图上的数据位序。强烈建议设计阶段在PSSI数据线上加上丝印标注D0到D15避免硬件回来之后反复翻原理图对线。还有一个很容易踩的坑PSSI在16位模式下如果外部设备只输出了8位有效数据但你在CubeMX里选了16位数据宽度那么D8到D15引脚会悬空采集到的数据高字节就是随机的颜色必然乱。这种情况要么软件里屏蔽高字节要么干脆按8位宽度配置PSSI数据量减半处理更简单。6.3 SDRAM和PSSI并跑时的HardFault在系统同时跑SDRAM和PSSI的时候偶尔会跳进HardFault这种问题排查起来最头疼。我的经验是先看Fault状态寄存器SCB-CFSR里的字段特别是BFARVALID和MMFARVALID位能定位到是总线错误还是内存管理错误。从实际项目出发最常见的两种情况一种情况是DMA传输长度配置过大DMA从PSSI往SDRAM搬运时越过了SDRAM的有效地址范围访问到了不存在的地址。比如说SDRAM只有4M×168MB但DMA目标缓冲区却定义成从SDRAM基址到8MB之外一搬就崩。这种情况在代码里检查DMA传输长度和缓冲区边界就能发现。另一种情况是DMA和CPU同时访问SDRAM同一个Cache line而且没有做Cache一致性处理。STM32H7的CPU核心是Cortex-M7带D-Cache而DMA操作的是外部SDRAM不会自动同步Cache。如果CPU先写了SDRAM区域DMA再去读这块区域DMA读到的可能是Cache里尚未回写的旧数据。解决办法是在DMA传输前调用SCB_CleanDCache_by_Addr()传输完成后调用SCB_InvalidateDCache_by_Addr()。这个坑特别隐蔽我当初查了整整两天最后是在官方勘误手册里看到的——H7系列在DMA和Cache交互上有明确的注意事项。6.4 同时跑以太网和PSSI时的带宽瓶颈热词里提到的LAN8720让我多说一嘴。H7接LAN8720做以太网以及PSSI采集两者同时工作的时候系统的总线负载会明显上升。以太网DMA、PSSI DMA、LTDC都在抢SDRAM带宽如果不做任何带宽规划可能出现以太网丢包或者PSSI丢帧。此时的优化手段有这几条以太网的DMA描述符和收发缓冲区放在内部RAMDTCM或者SRAM不要放SDRAM。这样以太网流量完全不占用SDRAM带宽避免和PSSI抢。PSSI的DMA缓冲区如果必须放SDRAM把它放在独立的Bank里减少同一Bank的冲突概率。FMC SDRAM控制器有两个Bank可以用Bank1和Bank2分别给不同用途物理上减少访问冲突。调整总线矩阵的优先级。在H7的系统时钟配置里可以设置AXI总线矩阵的仲裁模式。我的个人经验是把DMA的优先级调为High以太网MAC设为MediumLTDC设为Medium这样PSSI数据流能优先获得总线使用权。如果带宽实在不够考虑降低PSSI的输入时钟频率或者将PSSI的16位数据宽度改为8位牺牲一部分数据率来保证不丢包。在某些测量精度要求不高的场景8位数据宽度完全够用没必要追求16位。7. 进阶扩展这个组合还能用在哪些场景7.1 运动控制与高速数据采集协同热词里提到“运动控制源码”“双DMA实现脉冲输出8个轴插补500k、3轴1M”这说明不少人在用H7做多轴运动控制。PSSI和SDRAM这个组合在运动控制场景下能发挥很大的价值系统可以同时采集编码器反馈数据通过SPI或者PSSI并行接口、把轨迹规划表存在SDRAM里、用双DMA输出多轴脉冲三者并行不冲突。SDRAM在这里扮演的是轨迹数据的“弹药库”PSSI则负责高速引入编码器或者光栅尺的并行数据。我还试过用PSSI接一个高速的并行DAC把PSSI配置成主动模式输出16位并行数据到DAC实现高速波形发生。此时的SDRAM就用来存放波形样本表DMA先把波形数据从SDRAM搬到PSSI FIFO再由PSSI按外部时钟发出去。这相当于一个简单的DDS直接数字频率合成器频率分辨率取决于采样时钟和波形点数实用性很高。7.2 FOC电机控制与并行采样H7做FOC电机控制核心是电流环和速度环的高速计算。如果电机电流采样通过并行ADC完成PSSI可以一次性把三路电流数据并行读进来配合SDRAM存储录波数据方便做控制算法的调参分析。这个组合的亮点是FOC的PWM中断优先级最高PSSI DMA中断次之录波数据存SDRAM实时计算在内部RAM完成三者互不干扰。当然FOC控制本身对电流采样的实时性要求极高PSSI的DMA搬运会引入少量延迟所以电流采样环节我仍然建议用ADC的注入组或者定时器触发的DMA完成PSSI更多用于示波器式的录波回放不参与实时闭环。这一点各位做电机控制的时候一定要想清楚别为了炫技把控制环路的确定性给搞坏了。7.3 视觉定位与显示输出三路并行最后说一个我最喜欢的应用组合H7 16位SDRAM 16位PSSI摄像头 LTDC屏幕。摄像头通过PSSI进来数据经过DMA存到SDRAMLTDC从SDRAM同一块区域读取图像再通过RGB接口推到LCD屏上。你没有看错PSSI输入、SDRAM中转、LTDC输出整个链路不需要CPU参与CPU只负责跑图像处理算法比如找色块、算坐标。这种架构下CPU的负载极低系统实时性高非常适合做视觉引导的机械臂、无人机定位、黑白棋机器人这类项目。如果想让显示更流畅还能引入DMA2D来做图像格式转换或者Alpha混合。DMA2D可以把SDRAM里的RGB565图像直接转成ARGB8888再送给LTDC省掉CPU的逐像素转换。这一步做完H7基本就是一个带GPU加速的图像处理平台了而成本只有一颗几十块的芯片加一片几块钱的SDRAM。8. 最后的实操建议如果让我重新做一遍这个项目如果让我现在重新设计一个STM32H7 16位SDRAM 16位PSSI的项目我会在动手之前多花两天时间做三件事第一把H7的引脚复用表完整整理一遍导出成PDF贴在工作台上。这件事看起来繁琐但能省掉后期至少一周的调试时间。尤其是PSSI的AF映射不同封装、不同型号可能有差异一定要对着ST官方的数据手册而不是只信CubeMX的自动分配——CubeMX的引脚分配有时候选择的是默认组不一定是最优组。第二把所有和时序相关的参数SDRAM的tRCD、tRP、tWRPSSI的时钟极性、DMA的FIFO阈值整理成一份Excel表格标注每个参数的理论值、我实际使用的值、以及调整后的稳定性表现。这样做的好处是后期换SDRAM颗粒或者换摄像头模组的时候只需要改几个参数而不是重新盲调。第三把DMA和中断优先级设计成宏定义放在一个独立的头文件里禁止在代码里散落裸数字。我见过很多项目外设配置越来越复杂中断优先级到处都是魔数一旦性能出问题根本不知道从哪里下手。用宏定义集中管理调试的时候能快速切换不同的优先级组合测试。STM32H7的FMC和PSSI组合确实是这个系列最被低估的能力之一。很多人觉得H7的强项是CPU跑得够快但实际上它的外设协同能力——多个DMA同时工作、总线矩阵自动仲裁、FMC同时接SDRAM和LCD——才是让它能在一个芯片里搞定采集、存储、显示、控制四件套的关键。只要把底层总线和数据通路设计好剩下的就是纯粹的算法问题了。