vprog构架上,目前完全基于脚本,以前main函数中的一大堆代码都没有了,编程代码变成简单的:
if (ERROR_OK != misc_run_script("operate"))
{
free_all_and_exit(EXIT_FAILURE);
}
执行一个脚本而已。
并且,使用vsprog -V"script",可以运行单一脚本。
通过使用run命令,可以运行一个文本文件中的脚本,目前,这个功能在我这里主要用于测试我的一个基于IIC接口的方法。
一个简单的脚本运用举例:
test_script.vts -- vts == Versaloon test script,和vbs == Versaloon binary script对应。
param exit_on_fail 1
iic_init 100 20000
gpio_init 1 0 1
log_info "Press any key to run test..."
getchar
loop 10000
xxxx_transact xx xx xx xx ---- 自定义命令,用于测试自己的方案,测试10000次
iic_fini
gpio_fini
并且,可以在脚本中,加入芯片的删除下载校验等功能,下载完程序后,马上执行后续的测试脚本:
s avr8 -- 相当于命令行中的-savr8
I test.hex -- 相当于命令行中的-Itest.hex
o e -- 相当于命令行中的-oe
o wf -- 相当于命令行中的-owf
o vf -- 相当于命令行中的-ovf
operate -- 执行编程操作
run test.vts quiet -- 运行测试脚本,quiet表明,只显示结果,不显示脚本中的每条具体的命令
有些方案,需要下载2次程序,第一次是类似加密的程序,可能通过芯片序列号,计算出一个密钥:
s stm32
I encrypt.hex
o e
o wf
o vf
operate
free-all
sleep 100
xxx_read_encrypt --- 用户定义命令,用于读取密钥(通过ADIv5接口,读取指定内存的数据),下面的命令就是第二次下载应用固件
s stm32
I application.hex
o e
o wf
o vf
operate
目前,Versaloon的应用,就看你怎么写脚本了。
并且,在以后的Versaloon硬件中,会集成一定的存储功能,用于存放vbs,也就是二进制的脚本,相当于离线执行的功能,当然,编程和测试都可以支持。
命令列表:
param ---- 设置参数,exit_on_fail(错误时自动退出)和no_commit(输入发送命令后,不执行,在收到commit命令或者读取命令时才执行,只对编程器提供的各个接口命令有效)
misc-help ---- 显示帮助,可以增加一个参数,为需要显示帮助的命令
shell ---- 新开一个shell,shell在堆栈上嵌套
run ---- 运行脚本文件,可以在文件,名后增加“quiet”,脚本文件内的执行命令不显示,只显示执行结果
loop ---- 指定下一条命令的执行次数
exit ---- 退出当前shell
close ---- 退出当前程序
V/misc-cmd ---- 运行脚本命令,命令行中的-V参数,就是用这个脚本解析的
log_info ---- 显示指定信息,如果信息里有空格,需要再两边加上引号
getchar ---- 等待用户输入任意按键
h/help ---- 命令行中的-h参数,用此脚本解析,这个是显示vsprog的help信息,和misc-help有区别
v/version ---- 命令行中的-v参数,用此脚本解析
d/debug ---- 命令行中的-d参数,用此脚本解析
S/support ---- 命令行中的-S参数,用此脚本解析
o/operation ---- 命令行中的-o参数,用此脚本解析
Z/firmware-update ---- 命令行中的-Z参数,用此脚本解析
free-all ---- 清空原先为了执行下载操作所分配的所有资源,之后就可以准备下一个下载操作
init ---- vsprog初始化是自动调用,用户无需调用
D/memory-detail ---- 命令行中的-D参数,用此脚本解析
P/parameter ---- 命令行中的-P参数,用此脚本解析
s/target-series ---- 命令行中的-s参数,用此脚本解析
c/target-chip ---- 命令行中的-c参数,用此脚本解析
t/target ---- 命令行中的-t参数,用此脚本解析
F/frequency ---- 命令行中的-F参数,用此脚本解析
K/kernel-khz ---- 命令行中的-K参数,用此脚本解析
W/wait-state ---- 命令行中的-W参数,用此脚本解析
A/auto-adjust ---- 命令行中的-A参数,用此脚本解析
J/jtag-dc ---- 命令行中的-J参数,用此脚本解析
m/mode ---- 命令行中的-m参数,用此脚本解析
operate ---- 执行设置的编程操作
X/execute ---- 命令行中的-X参数,用此脚本解析
G/gui-mode ---- 命令行中的-G参数,用此脚本解析
I/input-file ---- 命令行中的-I参数,用此脚本解析
O/output-file ---- 命令行中的-O参数,用此脚本解析
L/display-programmer ---- 命令行中的-L参数,用此脚本解析
p/programmer ---- 命令行中的-p参数,用此脚本解析,如果该命令无参数,则使用系统默认编程器,如果该编程器以初始化,会调用终止化程序,并重新初始化
C/comport ---- 命令行中的-C参数,用此脚本解析,指定串口和参数,串口ISP使用
U/usb ---- 命令行中的-U参数,用此脚本解析,指定USB接口参数
一下是编程器各个接口的命令:
get_tvcc ---- 读取目标VCC电压
set_tvcc ---- 设置目标VCC电压
gpio_init ---- GPIO模块初始化
gpio_fini ---- GPIO模块终止化
gpio_config ---- GPIO模块设置(输入输出,上拉下拉)
gpio_out ---- 输出
gpio_in ---- 输入
spi_init ---- SPI模块初始化
spi_fini ---- SPI模块终止化
spi_config ---- SPI模块配置,clock,cpha,cpol
spi_io ---- SPI模块读写
iic_init ---- IIC模块初始化
iic_fini ---- IIC模块终止化
iic_config ---- IIC模块配置,频率,最大超时
iic_read ---- IIC读操作
iic_write ---- IIC写操作
delayus ---- 编程器us延时
delayms ---- 编程器ms延时
commit ---- 执行编程器的接口操作
用户可以增加自己指定的命令,不过这个就要写代码了,比如:
MISC_HANDLER(user_run);
struct misc_cmd_t user_cmd[] =
{
MISC_CMD( "user_run",
"run user defined operation, format: user_run",
user_run),
MISC_CMD_END
};
MISC_HANDLER(user_run)
{
struct programmer_info_t *prog;
// 如果本命令,需要使用到编程器的功能,需要先确认编程器可用
// 如果programmer_assert返回ERROR_OK,则后续的代码可以通过prog直接调用各个接口操作
if (ERROR_OK != programmer_assert(&prog))
{
LOG_INFO("programmer not inited");
return ERROR_FAIL;
}
// 这里可以通过prog->interfaces来调用各个接口定义的操作
// 当然,也可以调用其他模块,比如ADIv5的ARM调试接口,或者调用cortex_m3的接口
// 要执行其他脚本的话,也可以运行misc_run_script("bla bla bla");
// 操作成功,返回ERROR_OK,否则,返回ERROR_FAIL
return ERROR_OK;
}
然后在scripts.c文件的misc_cmds_list结构中,增加user_cmd即可。
文章评论(0条评论)
登录后参与讨论