1. MPS2(+)开发板FPGA寄存器地址错误问题解析
在嵌入式系统开发中,FPGA寄存器是硬件与软件交互的关键桥梁。作为Arm架构下的经典开发平台,MPS2(+)系列开发板广泛应用于嵌入式系统原型验证和外设驱动开发。近期在实际项目中使用MPS2+时,我发现其软件头文件中存在一个关键寄存器地址定义错误,这个问题直接影响FPGA预分频功能的正常使用。
1.1 问题现象与定位
当尝试使用MPS2+的FPGA预分频功能时,发现无论怎样配置PRESCALE寄存器,系统时钟始终无法按预期分频。通过示波器测量时钟信号和查阅Arm官方文档,最终定位到问题根源:在SMM_MPS2.h头文件中,预分频相关寄存器的偏移地址定义存在错误。
这个头文件被广泛应用于MPS2平台的各类测试软件中,包括:
- 自测试程序(selftest)
- 屏蔽测试程序(shieldtest)
- 演示程序(demo)
- Mbed OS基础代码
1.2 寄存器地址错误详情
原始头文件中错误的寄存器偏移定义如下:
c复制RESERVED; // Offset: 0x01C
PRESCALE; // Offset: 0x020
PSCNTR; // Offset: 0x024
而根据MPS2+技术参考手册(TRM)和FPGA数据手册,正确的偏移地址应为:
c复制PRESCALE; // Offset: 0x01C
PSCNTR; // Offset: 0x020
RESERVED; // Offset: 0x024
这个错误导致:
- 写入PRESCALE寄存器(0x020)实际上操作的是保留区域
- 读取PSCNTR寄存器(0x024)获取的是无效数据
- 真正的预分频控制寄存器(0x01C)从未被正确访问
1.3 解决方案与验证步骤
要解决此问题,需要按以下步骤操作:
-
备份原始头文件:
bash复制cp SMM_MPS2.h SMM_MPS2.h.bak -
修改寄存器定义:
使用文本编辑器打开SMM_MPS2.h,找到FPGA寄存器定义部分,将偏移量修改为:c复制#define FPGA_PRESCALE (0x01C)
