您好!
我正在进行 NMPU 外部诊断测试、TRM 第11.3.2.2节中提到了该测试。 我正在尝试测试 DMA 接口。
在第7步中、它提到了在 MPUDIAGADDR 寄存器中对诊断地址进行编程。
请您解释一下、该寄存器的地址可能是什么。 是我们用作事务 DMA 的目标地址的地址。
此外、您能否提供任何可用于使用 dma-nmpu 进行 NMPU 外部诊断测试的示例代码。
谢谢
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我正在进行 NMPU 外部诊断测试、TRM 第11.3.2.2节中提到了该测试。 我正在尝试测试 DMA 接口。
在第7步中、它提到了在 MPUDIAGADDR 寄存器中对诊断地址进行编程。
请您解释一下、该寄存器的地址可能是什么。 是我们用作事务 DMA 的目标地址的地址。
此外、您能否提供任何可用于使用 dma-nmpu 进行 NMPU 外部诊断测试的示例代码。
谢谢
这是您要测试的区域中的地址。
下面是我刚刚为您开发的一个示例:
nmpu_dmaREG->MPULOCK = 0x0A;//允许写入其他 MPU 寄存器
nmpu_dmaREG->MPUCTRL1 = 0x5;//存储器保护被禁用
nmpuRegionAttributes_t nmpuConfig0;
nmpuConfig0.accesspermission = NMPU_PRIV_RW_USER_RO;
nmpuConfig0.regionsize = NMPU_SIZE _4_KB;
nmpuConfig0.baseaddr = 0x08030000;
nmpuEnableRegion (nmpu_dmaREG、nMPU_REGION0、nmpuConfig0);
nmpuRegionAttributes_t nmpuConfig1;
nmpuConfig1.accesspermission = NMPU_PRIV_RO_USER_RO;
nmpuConfig1.regionsize = nMPU_SIZE _4_KB;
nmpuConfig1.baseaddr = 0x08031000;
nmpuEnableRegion (nmpu_dmaREG、nMPU_REGION1、nmpuConfig1);
nmpu_dmaREG->MPULOCK = 0x0A;
nmpu_dmaREG->MPUDIAGCTRL = 0 << 18 //将事务处理视为用户模式
| 1 < 17 //将事务视为写入
| 0 << 16 //内部诊断模式
| 0xA << 4;//启用诊断
nmpu_dmaREG->MPUDIAGADDR = 0x08031008;
在此示例中、我为 DMA 启用了2个 UMPU 区域。 结束区域(#1)为0x08031000至0x08032000、大小=4KB、权限为 pri 和用户只读。
在用户模式中、诊断被配置为对0x08031008处的第2个区域进行写入访问、这违反了许可。
位27、25、16和位0被置位。

您好、Wang、
非常感谢您提供示例代码和所有详细信息。 此代码示例配置为内部诊断模式。 我已经尝试过此模式、工作正常。 当尝试配置为外部诊断模式( 将 MPUDIAGCTRL 中的位16更新为1 )并且启动 DMA 事务(我看到数据正在从源传输到目的)时、 MPUERRSTAT 中没有按预期记录故障。 该寄存器的值为0。
我已配置如下。 执行 第 11.3.2.2节中提到的所有步骤。 如果可用 、请帮助提供外部诊断模式的参考代码。
nmpuRegionAttributes_t region1Attributes;
region1Attributes.baseaddr = 0x08067000;
region1Attributes.regionsize = NMPU_SIZE _4_KB;
region1Attributes.accesspermission = NMPU_PRIV_NA_USER_NA;
nmpu_dmaREG->MPUDIAGCTRL = 0 << 18 //将事务处理视为用户模式
| 1 < 17 //将事务视为写入
| 1 << 16 //外部诊断模式
| 0xA << 4;//启用诊断
感谢你的所有帮助