我使用 cp14、这是 MRC 和 MCR 用于操作调试相关寄存器的指令、这将导致未定义的异常。 然而,armV7r 的官方发布手册规定 cp14可用于操作,如图所示。 
那么、我可以问一下如何操作它吗? 如果是方法1、可以看出 V7debug 的 cp14接口是由制造商定义的、那么 TI 本身是否定义了方法? 如果是 TI 设置的方法2地址映射、还请告知映射的地址区域。
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.
尊敬的 Lin:
下面是我们的系统架构师给出的答案:
|
|
物理地址 |
|
|
AM2434–Arm R5F 内核 |
APB-AP (32位) |
SoC 地址空间(36位) |
|
R5F0_0 |
0x9D410000 |
0x73D410000 |
|
R5F0_1 |
0x9D412000 |
0x73D412000 |
|
R5F1_0 |
0x9D510000 |
0x73D510000 |
|
R5F1_1 |
0x9D512000 |
0x73D512000 |
请注意、对调试资源的访问也会受到器件安全状态的影响。
此致、
明
尊敬的 Lin:
以下是我们的系统架构师的评论:
----------------
我有一些意见、再说一次、我只是阅读 ARM 文档。 如果此指示灯亮起、那么我们可能需要将客户转至 ARM 支持。
----------------
此致、
明
正如系统架构师所说的、我在没有 CCS 调试器的情况下运行代码、但未定义的异常仍然会发生、因此我认为未定义的异常并不是由 CCS 调试器环境导致的。
答:我们要做的就是 编写自己的代码来实现调试函数。 因此、我们应借助一些调试寄存器来实现它。
b:因为 DBGDSCRint 是 RO、所以我们需要写入 DBGDCSR。 然后 DBGDSCRext 是 RW、所以我们要访问 DBGSCRext。
c. d 我也可以找到这些要求。 我还需要检查 DBGPRSR。 SPD 和 DBGLSR。 但如下图中的代码所示、读取 DBGPRSR 和 DBGLSR 仍会导致未定义的异常。


所以我不知道要解决这个问题。 请告诉我如何详细编程,而不是根据手册猜测。 谢谢。
尊敬的 Lin:
我们终于找到了这个问题的根本原因。 对于 ARM V7架构、只能通过 CP14接口访问少数几个 CP14寄存器:


其余寄存器必须通过存储器映射接口进行访问:
|
|
物理地址 |
|
|
AM2434–Arm R5F 内核 |
APB-AP (32位) |
SoC 地址空间(36位) |
|
R5F0_0 |
0x9D410000 |
0x73D410000 |
|
R5F0_1 |
0x9D412000 |
0x73D412000 |
|
R5F1_0 |
0x9D510000 |
0x73D510000 |
|
R5F1_1 |
0x9D512000 |
0x73D512000 |
由于 CP14存储器映射基址为36位、因此您需要在 syscfg 中为其设置 RAT 条目:

我们 在 RAT 条目中将0x73D410000映射到0x10000000。
以下是用于访问 CP14接口和内存映射接口的代码段:
uint32_t * CP14_MMR_REGION_ptr =(uint32_t *) 0x10000000;// 0x73D410000的本地地址
uint32_t cp14_193 = 0;
uint32_t cp14_197 = 0;
void hello_world_main (void * args)
{
/*打开驱动程序以打开控制台的 UART 驱动程序*/
drivers_open();
Board_driversOpen();
//通过 CP14接口进行寄存器访问
_asm ("MRC P14、0、r0、c0、c0、 0");//读取 DBIDR (寄存器0)
_asm ("MRC P14、0、r0、c0、c1、 0");//读取 DBGDSRCint (寄存器1)
_asm ("MRC P14、0、r0、c0、C5、 0");//读取 DBGDTRRXint (寄存器5)
//__asm ("MCR P14、0、r0、c0、C5、 0");//写入 DBGDTRTXint
_asm ("MRC P14、0、r0、c1、c0、 0");//读取 DBGDRAR (寄存器128)
_asm ("MRC P14、0、r0、C2、c0、 0");//读取 DBGDSAR (寄存器256)
//通过存储器映射接口进行寄存器访问
cp14_193 = CP14_MMR_REGION_PTR[193];//读取 DBGOSLSR (寄存器193)
cp14_197 = CP14_MMR_REGION_ptr[197];//读取 DBGPRSR (寄存器197)
DebugP_log ("Hello World!\r\n);
...
}
我已经测试了上述代码。 它像预期的那样工作。
请注意这个代码与 DAP 冲突的事实、所以您不能使用 CCS 内存浏览器来查看0x10000000区域。
此致、
明