硬汉嵌入式论坛

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

[LUA教程] H7-TOOL的LUA小程序教程第8期:SWD接口函数,读写各种类型数据,内存和寄存器等(2023-04-07)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2023-2-25 12:13:43 | 显示全部楼层 |阅读模式
LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用,支持在线调试运行,支持离线运行。

TOOL的LUA教程争取做到大家可以无痛调用各种功能函数,不需要学习成本。


操作外设寄存器或者指定位宽的总线外设注意是8bit,16bit还是32bit操作,这样操作才能正常。
支持8bit,16bit,32bit,64bit,单精度浮点,双精度浮点,连续地址读写和字符串读取


函数:pg_init()
用于初始化TOOL的SWD接口

8bit读函数:pg_read8,  pg_read_u8,  pg_read_s8
用于读取目标板指定RAM空间或者寄存器地址的8bit数据

pg_read8读取是原始bit值
pg_read_u8表示读取无符号值
pg_read_s8表示读取有符号值

比如读取地址0x2000 0000地址的8bit数据,就是data, re = pg_read8(0x20000000),re = 1 表示OK, 0表示失败, data是返回的8bit数据

8bit写函数:pg_write8,pg_write_u8,pg_write_s8
用于目标板指定RAM空间地址或者寄存器地址的8bit数据写入

pg_write8是写入原始bit值
pg_write_u8表示写入无符号值
pg_write_s8表示写入有符号值

比如写地址0x2000 0000地址的8bit数据,就是re = pg_write(0x20000000, 0x55),re = 1 表示OK, 0表示失败。

16bit读函数:pg_read16, pg_read_u16,  pg_read_s16
用于读取目标板指定RAM空间或者寄存器地址的16bit数据

pg_read16读取是原始bit值
pg_read_u16表示读取无符号值
pg_read_s16表示读取有符号值

比如读取地址0x2000 0000地址的16bit数据,就是data, re = pg_read16(0x20000000),re = 1 表示OK, 0表示失败, data是返回的16bit数据

16bit写函数:pg_write16,pg_write_u16,pg_write_s16
用于目标板指定RAM空间地址或者寄存器地址的16bit数据写入

pg_write16是写入原始bit值
pg_write_u16表示写入无符号值
pg_write_s16表示写入有符号值

比如写地址0x2000 0000地址的16bit数据,就是re = pg_write(0x20000000, 0x5566),re = 1 表示OK, 0表示失败。


32bit读函数:pg_read32, pg_read_u32,  pg_read_s32
用于读取目标板指定RAM空间或者寄存器地址的32bit数据

pg_read32读取是原始bit值
pg_read_u32表示读取无符号值
pg_read_s32表示读取有符号值

比如读取地址0x2000 0000地址的32bit数据,就是data, re = pg_read32(0x20000000),re = 1 表示OK, 0表示失败, data是返回的32bit数据

32bit写函数:pg_write32,pg_write_u32,pg_write_s32
用于目标板指定RAM空间地址或者寄存器地址的32bit数据写入

pg_write32是写入原始bit值
pg_write_u32表示写入无符号值
pg_write_s32表示写入有符号值

比如写地址0x2000 0000地址的32bit数据,就是re = pg_write(0x20000000, 0x55665566),re = 1 表示OK, 0表示失败。

64bit写函数:pg_write_int64,pg_read_int64
用于目标板指定RAM空间地址或者寄存器地址的64bit数据读写

pg_write_int64是64bit数据写入
pg_read_int64是64bit数据读取

比如读地址0x2000 0000地址的64bit数据,就是data, re = pg_read_int64(0x20000000),re = 1 表示OK, 0表示失败, data是返回的64bit数据

单精度浮点函数:pg_write_float,pg_read_float
用于目标板指定RAM空间地址的单精度浮点数据读写

pg_write_float是单精度浮点数据写入
pg_read_float 是单精度浮点数据读取

比如读地址0x2000 0000地址的单精度数据,就是data, re = pg_read_float (0x20000000),re = 1 表示OK, 0表示失败, data是返回的单精度浮点数


双精度浮点函数:pg_write_double,pg_read_double
用于目标板指定RAM空间地址的双精度浮点数据读写

pg_write_double是双精度浮点数据写入
pg_read_double是双精度浮点数据读取

比如读地址0x2000 0000地址的双精度数据,就是data, re = pg_read_double(0x20000000),re = 1 表示OK, 0表示失败, data是返回的双精度浮点数


连续地址读:pg_read_mem
用于目标板指定RAM空间地址数据的读取,最大读取4096字节

比如读地址0x20000000地址的10个数据,就是

re, data = pg_read_mem(0x20000000, 10)

re = 1 表示OK, 0表示失败。 data 是二进制字符串数组,只是以字符串形式表示,字符的原始值还是本身,读取出来就是类似这样data = "\x00\x00\x11\x22\x33"


连续地址写:pg_write_mem
用于目标板指定RAM空间地址数据的读取,最大写4096字节

比如读地址0x20000000地址的5个数据,就是

data = "\x00\x00\x11\x22\x33"

re = pg_write_mem(0x24000000, data)

re = 1 表示OK, 0表示失败。

读取字符串:pg_read_string

比如:pg_read_string(0x20000000, 1024)   --返回0x20000000开始的字符串(0结束), 搜1024字节)



1、8bit,16bit,32bit,64bit,单精度浮点,双精度浮点测试

[C] 纯文本查看 复制代码
-- 根据需要判断re返回值,不想判断,可以不加返回值
local re
local data
local value
local value1
local value2
local value3

function printf(...)
    print(string.format(...))
end

pg_init()

-- 8bit 测试
pg_write_u8(0x24000000, 4)    
value = pg_read_u8(0x24000000)
printf("pg_read_u8 = %d", value)

-- 16bit 测试
pg_write_s16(0x24000000, -466)
value = pg_read_s16(0x24000000)
printf("pg_read_s16 = %d", value)

-- 32bit 测试
pg_write_s32(0x24000000, -466777)
value = pg_read_s32(0x24000000)
printf("pg_read_s32 = %d", value)

-- 单精度浮点
pg_write_float(0x24000000, 0.12)
value2 = pg_read_float(0x24000000)
printf("pg_read_float = %f", value2)

-- 64bit 测试
re = pg_write_int64(0x24000000, 0x1122334455667788)
if(re == 1) then
    print("64bit数写入成功")
else
    print("64bit数写入失败")
end

value1, re= pg_read_int64(0x24000000)
if(re == 1) then
    printf("pg_read_int64 = %16x", value1)
else
    print("64bit数读取失败")
end

-- 双精度浮点
re = pg_write_double(0x24000000, 0.123)
if(re == 1) then
    print("双精度浮点数写入成功")
else
    print("双精度浮点数写入失败")
end

value3, re= pg_read_double(0x24000000)
if(re == 1) then
    printf("pg_read_double = %.15f", value3)
else
    print("双精度浮点数读取失败")
end

image.png

2、内存批量读写测试

[C] 纯文本查看 复制代码
local dataread
local datawrite
local re

pg_init()  -- 初始化SWD接口

---------------------------------------------------
-- 常数方式直接写入
---------------------------------------------------
datawrite = "\x11\x22\x33\x44\x55"
re = pg_write_mem(0x24000000, datawrite)
if(re == 1) then
    print("写入成功")
else
    print("写入失败")
end

re,dataread = pg_read_mem(0x24000000, 5)

if(re == 1) then
    print("读取成功")
    print_hex(dataread)
else
    print("读取失败")
end

---------------------------------------------------
-- 变量数据写入
---------------------------------------------------
datawrite = string.format("%c%c%c%c", 0xAA, 0xBB , 0xCC, 0xDD)
re = pg_write_mem(0x24000000, datawrite)
if(re == 1) then
    print("写入成功")
else
    print("写入失败")
end

re,dataread = pg_read_mem(0x24000000, 4)

if(re == 1) then
    print("读取成功")
    print_hex(dataread)
else
    print("读取失败")
end

image.png


FAQ:

1、读取失败解决办法

H7-TOOL的SWD接口Lua函数读取失败后处理办法(2023-04-07)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=118696




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2023-2-25 12:14:17 | 显示全部楼层
整理这期教程主要是方便要发布的2.20固件有很多这方面的应用。
回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

H7 TOOL 大法好!

积分
179
发表于 2023-2-25 12:38:54 | 显示全部楼层
eric2013 发表于 2023-2-25 12:14
整理这期教程主要是方便要发布的2.20固件有很多这方便的应用。

我来帮帮场子
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2023-2-25 17:34:37 | 显示全部楼层
更新完毕。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2023-4-7 09:58:48 | 显示全部楼层
更新一种读取失败解决机制。
回复

使用道具 举报

12

主题

178

回帖

214

积分

高级会员

积分
214
发表于 2023-5-4 08:33:09 | 显示全部楼层
硬汉,请问目标板(而不是H7-tool)怎么实现 CacheClean, pg_read32 等等函数呢?谢谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 04:30 , Processed in 0.183291 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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