硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1041|回复: 3
收起左侧

[使用教程] H7-TOOL的LUA小程序访问AP和DP调试寄存器方法(2023-08-16)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2023-8-16 02:51:01 | 显示全部楼层 |阅读模式
API说明:
函数pg_init()
功能:用于初始化TOOL的SWD接口

函数pg_swd("RDP", adr)
功能:读DP端口
参数:"RDP"是固定的,adr是地址。

比如读取地址0xFC,就是data,re = pg_swd("RDP", 0xFC), data是返回的数据,re = 1 表示成功, 0表示失败


函数pg_swd("WDP", adr, val)
功能:写DP端口
参数:"WDP"是固定的,adr是地址,  val是数值

比如地址8写入数据2,就是re = pg_swd("WDP", 8, 2), 返回值 re = 1 表示成功, 0表示失败


函数pg_swd("RAP",  adr)
功能:读AP端口
参数:"RAP"是固定的,adr是地址。

比如读取地址0xFC,就是data,re = pg_swd("RAP", 0xFC, data是返回的数据,re = 1 表示成功, 0表示失败


函数pg_swd("WAP", adr, val)
功能:写AP端口
参数:"WAP"是固定的,adr是地址,  val是数值

比如地址8写入数据2,就是re = pg_swd("WAP", 8, 2), 返回值 re = 1 表示成功, 0表示失败


操作举例

AP和DP调试寄存器访问,跟我们访问外设的寄存器不同,外设寄存器给个总线地址即可,而AP和DP调试寄存器要看芯片厂家参考手册末尾的调试章节。

我们这里使用TOOL访问STM32H7系列为例进行说明。

下载 (2).png

1、DP端口寄存器的访问

参考手册对DP访问的描述如下:

1.png

比如我们要读取DP的调试端口标识寄存器DP_TARGETID

(1)先要修改DP_SELECT寄存器

2.png

对应的TOOL操作就是 re = pg_swd("WDP", 8, 2), 数值8是我们操作DP_SELECT寄存器的地址,数值2是上面截图的含义,通过AP0 - Cortex-M7 debug access port (AHB-AP) 读取DP_TARGETID

(2)读取DP_TARGETID

对应的TOOL操作就是data,re = pg_swd("RDP", 4)

测试代码如下

[Lua] 纯文本查看 复制代码
pg_init() -- 初始化SWD接口

re = pg_swd("WDP", 8, 2)

if(re == 1) then

print("WDP成功")

else

print("WDP失败")

end

data,re = pg_swd("RDP", 4)

if(re == 1) then

print("RDP成功")

print(string.format("rdp = %08x", data))

else

print("RDP失败")

end


操作效果:

4.png

读取的结果于手册描述的一致,说明没问题:

5.png

2、AP端口寄存器的访问

参考手册对AP访问的描述如下:

6.png

7.png

比如我们要读取AP的调试端口标识寄存器AP_IDR,对应的地址是

(1)先要修改DP_SELECT寄存器

12.png

对应的TOOL操作就是 re = pg_swd("WDP", 8, 0xF4), 数值8是我们操作DP_SELECT寄存器的地址,数值0xF4是上面截图的含义,通过AP0 - Cortex-M7 debug access port (AHB-AP) 操作APBANKSEL设置0xF,即AP_IDR,而DPBANKSEL我们没有使用。

(2)读取AP_IDR

对应的TOOL操作就是data,re = pg_swd("RAP", 0xFC)

测试代码如下:

[Lua] 纯文本查看 复制代码
pg_init() -- 初始化SWD接口

re = pg_swd("WDP", 8, 0xF4)

if(re == 1) then

print("WDP成功")

else

print("WDP失败")

end

data,re = pg_swd("RAP", 0xFC)

if(re == 1) then

print("RDP成功")

print(string.format("rdp = %08x", data))

else

print("RDP失败")

end



测试效果:

8.png

读取的结果于手册描述的一致,说明没问题:

9.png

评分

参与人数 1金币 +10 收起 理由
missfox + 10 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2023-8-16 15:58:30 | 显示全部楼层
更新完毕。
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2023-8-17 09:34:37 | 显示全部楼层
谢谢分享,第一次了解这个知识点
代码不规范,亲人两行泪!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2024-3-22 01:17:17 | 显示全部楼层
[C] 纯文本查看 复制代码
beep()
print("窗口2")

pg_init(0)


re = pg_swd("WDP", 8, 0x10000000)

if(re == 1) then
    print("WDP成功")
else 
    print("WDP失败") 
end

re = pg_swd("WriteData", 0x20000000, 0x55aa55aa, 0x46000040)

if(re == 1) then
    print("WriteData成功")
else 
    print("WriteData失败") 
end

data,re = pg_swd("ReadData", 0x20000000, 0x46000040)
 
if(re == 1) then
print("ReadData成功")
print(string.format("rdp = %08x", data))
else
print("ReadData失败")
end
--------------------------------------------------
--------------------------------------------------
--------------------------------------------------
--------------------------------------------------
ROMTableBase = pg_swd("RAP",0xF8)
ROMTableBase = ROMTableBase & 0xFFFFFFFC

str =pg_read32(ROMTableBase + 0x0FE4)
print_hex(str)
str =pg_read32(ROMTableBase + 0x0FE8)

print_hex(str)

re = pg_swd("WDP", 8, 0x10000000)

if(re == 1) then
 
    print("WDP成功")
     
    else
     
    print("WDP失败")
     
    end

re = pg_swd("WAP", 0, 0x46000040)

if(re == 1) then
 
    print("WDP成功")
     
    else
     
    print("WDP失败")
     
    end

data,re = pg_swd("RAP", 0)
 
if(re == 1) then
 
print("RDP成功")
 
print(string.format("rdp = %08x", data))
 
else
 
print("RDP失败")
 
end

-- temp, re = pg_read32(0xE000EE08)

-- if(re == 1) then
-- print_hex(temp)
-- else
-- print("pg_read32(0xE000EFB8)读取失败")
-- end

re = pg_write32(0xE000EDF0, 0xA05F0001)

if(re == 1) then
    print("进入调试成功")
 else
    print("pg_write32(0xE000EDF0, 0xA05F0001)失败")
end

temp, re = pg_read32(0xE000EE08)

if(re == 1) then
print_hex(temp)
else
print("pg_read32(0xE0044004)读取失败")
end

-- temp = temp & 0xFFFFFFF0
-- temp = temp | 0x06
-- re = pg_write32(0xE0044004, temp)
-- if(re == 1) then
--     print_hex(temp)
--  else
--     print("pg_write32(0xE0044004, temp)失败")
-- end

-- str, re =pg_read32(0x08000000)

-- if(re == 1) then
-- print_hex(str)
-- else
-- print("pg_read32(0x08000000)读取失败")
-- end

re, data = pg_read_mem(0x20000000, 100)
if(re == 1) then
print_hex(data)
else
print("pg_read_mem(0x08000000, 1024)读取失败")
end





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 10:47 , Processed in 0.174096 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表