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和调试驱动。
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的主频上限。 - 把
APB1和APB2的时钟分频设好,别超了外设的最高频率。
我记得第一次调这个时钟树,配完发现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打开这个工程,直接就能编译通过。
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 Generator和Clocking Wizard。 - 仿真文件:用于功能仿真的testbench。
3.3.3 基本流程
Vivado的开发流程,说白了就是四步:
- 综合(Synthesis):把Verilog代码转换成门级网表。
- 实现(Implementation):把门级网表映射到具体的LUT和FF上,并布线。
- 生成比特流(Generate Bitstream):生成下载到FPGA的配置文件。
- 下载(Program):通过JTAG线把比特流烧进FPGA。
嗯,这里要提醒你。第一次综合可能会很慢,尤其是电脑配置一般的话。我建议写代码时,先做 RTL Analysis 检查语法,别直接点综合。等语法没问题了,再跑综合。
3.3.4 与STM32的协同
在我们的示波器里,FPGA负责高速采样和数据处理,STM32负责控制和显示。两者通过FMC总线通信。
FPGA这边,我设计了一个双口RAM模块。STM32通过FMC接口,像读写普通SRAM一样读写这个双口RAM。这样数据交互就简单了。
调试时,我习惯先在Vivado里用仿真验证FPGA逻辑,再用Keil调试STM32的FMC读写。两边都调通了,再联调。
好了,环境搭好了,工具链通了。下一章,咱们开始写真正的代码——让STM32和FPGA先握上手。