3、开发环境搭建:Keil MDK安装与配置、STM32CubeMX初始化、FPGA开发环境(Vivado)简介

好,咱们开始搭台子了。

做数字示波器,说白了就是两件事:控制采集。控制靠STM32,采集靠FPGA。所以这一章,咱们得把两套开发环境都支棱起来。

我个人习惯先把MCU的环境搞定,再搞FPGA。因为MCU那边相对简单,能快速建立信心。你想想看,要是上来就碰Vivado那动辄几十G的安装包,心态容易崩。

3.1 Keil MDK安装与配置

Keil MDK,ARM单片机开发的标配。我用它十几年了,从ADS1.2时代过来的老家伙应该都懂。

3.1.1 下载与安装

去Keil官网(www.keil.com)下载MDK-Arm版本。注意别下成C51了,那是给51单片机用的。

  • 版本选择:我建议用5.38或更新的版本。太老的版本对新的STM32H7系列支持不好。
  • 安装路径:别带中文!别带空格!我见过太多人因为路径里有“新建文件夹”导致编译报错,排查半天。
  • 安装过程:一路Next就行。它会自动装好ARM Compiler和调试驱动。
注意:安装完成后,记得用管理员权限运行一次Keil。否则后面添加设备包可能会权限不足。

3.1.2 设备包(Pack)安装

Keil本身不直接支持STM32,需要安装对应的设备支持包。

点击菜单栏的 Pack Installer 图标。在搜索框里输入 STM32H7,找到 Keil.STM32H7xx_DFP,点击Install。

嗯,这里要注意。网络不好的时候,Pack Installer经常卡死。我曾经在客户现场演示时,等了半小时进度条都不动,场面一度很尴尬。

我的建议是:直接去Keil官网下载离线Pack包,手动双击安装。稳得很。

3.1.3 工程配置要点

新建工程时,有几点我踩过坑,分享给你:

  • 选择芯片:我们用的是STM32H750IBK6,别选错了。H750和H743的Flash大小不一样,选错会导致下载失败。
  • C/C++编译器:在 Options for Target -> C/C++ 里,把 Optimization 设为 -O2。调试阶段用 -O0 也行,但最终固件建议开优化。
  • 调试器设置:我用的是ST-Link。在 Debug 选项卡里选 ST-Link Debugger,然后点 Settings,把 SWD 速度设为 4MHz。太快了容易不稳定,太慢了下载慢。
小技巧:Utilities 选项卡里,勾选 Update Target before Debugging。这样每次点调试按钮,它会自动编译并下载,省一步操作。

3.2 STM32CubeMX初始化

Keil负责写代码,但芯片的引脚怎么分配、时钟怎么配置,这些体力活交给CubeMX。

说白了,CubeMX就是个图形化的初始化代码生成器。你点点鼠标,它帮你生成HAL库的初始化代码。

3.2.1 新建工程与时钟配置

打开CubeMX,选择 New Project,搜索 STM32H750IB

第一步,配时钟。这是最关键的。示波器对时序要求高,时钟必须稳。

  • Clock Configuration 标签页里,把 HSE 设为 25MHz(我们的板子上是25M晶振)。
  • PLL1 配到 400MHz,这是H750的主频上限。
  • APB1APB2 的时钟分频设好,别超了外设的最高频率。

我记得第一次调这个时钟树,配完发现USB不工作。查了半天,原来是PLL的VCO范围没在约束内。CubeMX其实有颜色提示——绿色表示合法,红色表示越界。我当时没注意看。

3.2.2 引脚分配

示波器要用到的外设不少:

外设 功能 引脚
FMC 连接FPGA的双口RAM PD0-PD15等
SPI1 控制LCD屏幕 PA5-PA7
UART4 调试串口 PD1, PD0
DMA2D 图形加速 内部连接

Pinout & Configuration 标签页里,把这些外设使能,引脚会自动分配。如果冲突了,CubeMX会报错,手动调整一下就行。

3.2.3 生成代码

点击 Project Manager 标签:

  • Project Name:取个有意义的名字,比如 DsoScope_FW
  • Project Location:别放桌面,放个专门的工程目录。
  • Toolchain / IDE:选 MDK-ARM V5
  • Generated Code:勾选 Generate peripheral initialization as a pair of .c/.h files per peripheral。这样每个外设单独一个文件,好管理。

最后点 GENERATE CODE。等几秒钟,代码就生成了。用Keil打开这个工程,直接就能编译通过。

核心思路:CubeMX只负责初始化,不负责业务逻辑。你后续写的采集控制、UI绘制、数据处理,都在它生成的框架里加。别去改CubeMX生成的代码,否则下次重新生成时会被覆盖。

3.3 FPGA开发环境(Vivado)简介

FPGA这边,我们用的是Xilinx的Artix-7系列。对应的开发环境是Vivado。

说实话,Vivado是个大家伙。安装包20多G,装完占50G空间。我第一次装的时候,硬盘差点爆了。

3.3.1 Vivado安装要点

  • 版本选择:我用的是Vivado 2022.2。太新的版本对电脑配置要求高,太老的版本不支持新器件。
  • 安装选项:安装时选 Vivado HL WebPACK 就够了。这个版本免费,支持Artix-7全系列。没必要装System Edition,那是给Virtex UltraScale+用的。
  • 安装路径:再次强调,别带中文!Vivado对中文路径的兼容性比Keil还差。

3.3.2 工程结构

Vivado的工程管理方式和Keil不太一样。它用 .xpr 文件管理整个工程。

一个典型的FPGA工程包含:

  • RTL源码:Verilog或VHDL写的逻辑代码。我们主要用Verilog。
  • 约束文件(.xdc):定义引脚位置和时序约束。这个很重要,不写约束,综合出来的电路可能跑不到目标频率。
  • IP核:Vivado自带很多现成的IP,比如FIFO、PLL、Block RAM。我们做示波器会用到 FIFO GeneratorClocking Wizard
  • 仿真文件:用于功能仿真的testbench。

3.3.3 基本流程

Vivado的开发流程,说白了就是四步:

  1. 综合(Synthesis):把Verilog代码转换成门级网表。
  2. 实现(Implementation):把门级网表映射到具体的LUT和FF上,并布线。
  3. 生成比特流(Generate Bitstream):生成下载到FPGA的配置文件。
  4. 下载(Program):通过JTAG线把比特流烧进FPGA。

嗯,这里要提醒你。第一次综合可能会很慢,尤其是电脑配置一般的话。我建议写代码时,先做 RTL Analysis 检查语法,别直接点综合。等语法没问题了,再跑综合。

避坑指南:我曾经有一次,综合通过了,但实现时报错说时序不满足。查了半天,发现是约束文件里忘了约束时钟。Vivado默认会帮你分析,但你不写约束,它就用默认的宽松约束,结果布线后时序就崩了。所以,约束文件一定要写

3.3.4 与STM32的协同

在我们的示波器里,FPGA负责高速采样和数据处理,STM32负责控制和显示。两者通过FMC总线通信。

FPGA这边,我设计了一个双口RAM模块。STM32通过FMC接口,像读写普通SRAM一样读写这个双口RAM。这样数据交互就简单了。

调试时,我习惯先在Vivado里用仿真验证FPGA逻辑,再用Keil调试STM32的FMC读写。两边都调通了,再联调。

个人经验:联调时最容易出问题的是时序。STM32的FMC时序参数需要和FPGA的双口RAM读写时序匹配。我一般先在CubeMX里把FMC的时序配得宽松一点(比如延长建立时间和保持时间),等联调通了,再逐步优化。

好了,环境搭好了,工具链通了。下一章,咱们开始写真正的代码——让STM32和FPGA先握上手。