打印
[STM32F7]

【分享评测】移植JAM Player到Nucleo-STM32F767ZI-144

[复制链接]
5388|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
deru_qq|  楼主 | 2016-8-13 13:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 deru_qq 于 2016-8-13 13:49 编辑

1.     背景
       最近有一个需求:项目用的IGBT驱动板上有一片CPLD,在现场做试验时需要改参数,不得不从功率柜上拆下来,使用JTAG重新烧写程序,但由于结构复杂,一拆一装需要6,7个小时,实在让人无法忍受,因此,需要研究一种CPLD在线配置的方法。
2.     问题
       CPLD在线配置需要一个MCU和CPLD连接,MCU自身通过驱动板上的光纤接口和上位机连接,上位机通过一定的协议将配置文件发送给MCU,MCU再通过一定的时序去配置CPLD,但是问题是不知道CPLD的配置时序和数据格式,查遍Altera的资料,最后发现只能通过Jam STAPL这个东西来配置(某个论坛上有人说开发出来了一个U盘大小的配置工具,只要插到要配置的板件上就可以进行配置,不知道他用的方法是什么,应该和本文的方法大不相同,看了下面就会知道)
3.     Jam STAPL介绍
       Jam STAPL全称是The Jam Standard Test and Programming Language,由Altera的工程师发明,主要用于可编程器件的在线编程和测试,在1999年称为JEDEC标准JESD-71,很多可编程器件厂商、编程器厂商和测试工具厂商都支持这个标准。
       Jam STAPL解决了一个问题:在配置可编程器件时,不同厂商的器件,相同厂商的不同器件都会有配置文件格式或者配置方法的差异,如果对每一种器件出一套方案,显然费时费力,而JAM STAPL的出现则屏蔽了这些差异,实现第三方工具的统一和兼容。
4.     Jam STAPL工作原理
       Jam STAPL包括两部分:Jam Composer和Jam Player;Jam Composer由可编程器件厂商提供,用来生成.jam文件,jam文件包含了对某个可编程器件进行配置的数据和算法;Jam Player读取jam文件的内容,将jam文件的指示转化为对JTAG接口的操作,可以完成对器件的测试和编程功能。
5.     Jam文件
       Jam文件有两种格式,一种是ASCII格式的,里面按照JESD-71A标准规定的语法编写,Altera推荐在上位机测试环境下使用这种格式;另一种是Jam byte-Code文件(.jbc),是二进制的,它是Jam文件经过编译之后的可执行文件,可以把Jam Player看做是一个虚拟机,它从jbc文件中获取指令和数据来执行jbc文件的操作,Altera推荐嵌入式环境下使用jbc文件,因为这样需要的资源比较少。
6.     Jam STAPL Byte-Code Player的移植
       本评测中要移植Jam Player到嵌入式微处理器中,所以使用jbc格式,Jam STAPLByte-Code Player的源代码可以在Altera官网下载到,但是里面是基于Windows或Linux桌面机的,但是移植到嵌入式微处理器中也很简单。
6.1接口函数移植
jbi_jtag_io()
jbi_export()
jbi_delay()
jbi_vector_map()
jbi_vector_io()
       本评测中的应用只是要实现CPLD的配置,只要实现前3个函数就行了
jbi_jtag_io()
移植起来很简单,只要根据参数翻转IO即可,但是要先将IO配置为相应的模式
jbi_export()
这个函数用来打印一些执行过程中要打印的内容,实际上分为几个函数:
voidjbi_message()
voidjbi_export_integer()
voidjbi_export_boolean_array()
移植比jbi_jtag_io()还要简单,只要把printf函数换为自己的printf就行了,如:
voidjbi_message(char *message_text)
{
       xprintf("%s", message_text);
}
6.2 内存管理配置
       源代码中有两个函数void *jbi_malloc()和void jbi_free()用来管理内存分配,内存管理可以有两种方式,动态和静态,动态的就是直接调用malloc函数,静态的需要用户事先声明一个内存空间,所有的内存分配将在这段内存空间中进行,函数还具有记录内存使用情况的代码,这个功能很有用,可以知道最大内存使用情况来评估处理器是否可以满足使用,另外这部分代码也很有参考价值。
       内存管理的函数不用移植,默认按动态方式管理,如果需要使用静态内存管理的方式,需要增加宏定义:
#defineUSE_STATIC_MEMORY   360
这个宏定义将分配360KB的内存用于静态内存管理,另外加上一条宏定义来使能内存使用记录:
#defineMEM_TRACKER
注:执行命令时发现,每次执行完命令,内存好像都没有释放(使用静态内存管理),所以在移植时加入了强制释放内存的语句
6.3 jbc文件存储方式
       源代码基于桌面机,jbc文件是以文件的形式存储的,使用时需要读取到RAM中,如果嵌入式应用中也使用这种方式就不必修改什么,本评测中直接把jbc文件放在了ROM中,因此需要一些改动。
1. 添加jbc_program.c文件,里面包含jbc文件的数据jbi_data[]。
2. 在jbi_execute()函数调用时,用指针jbi_data和文件大小代替原来的参数file_buffer和file_length
       由于源代码中使用jbc数据指针的函数都是用的unsignedchar*类型,jbi_data在rom中,用的是const unsigned char*,编译器会报错,所以将相关的函数声明和定义中的参数修改了一下。
进行到这里,差不多要结束了,最后外部只需要调用一个函数:
int jam_player(int argc, char **argv)
这个函数尽量保持和Windows版本的main函数的格式一致
7 Nucleo-STM32F767ZI-144上运行
       移植到Nucleo-STM32F767ZI-144开发板上,连接超级终端,就可以输入命令了,几乎和Windows一样
下面是配置EP2C144C5 FPGA的过程:
可以看到,STAPL Byte-Code Player会打印出来jbc文件的信息,包括支持的操作和选项
注:输入的命令是“jam_player–v –aCONFIGURE led.jbc”,其中jam_player和led.jbc可以随便指定,因为这两个参数程序中不判断,只是为了和原来的指令格式保持一致
内存使用
配置完之后会打印出内存占用情况,可以看到,仅仅是一个配置FPGA的SRAM就使用了315K的内存,其实最开始是想要烧写FPGA的配置芯片的,但是那个jbc文件是这个的3倍,并且还经过压缩了,运行时直接就不行了,打印出来的内存占用已经超过了500K,而STM32F767ZI的片上RAM有512KB,还是不能胜任,看来必须使用SDRAM才行。
配置速度
       根据打印信息可以看到,配置用了2s,感觉和在QuartusII中使用STAPL Byte-Code Player相差不多,这也说明了M7速度惊人。
8 总结
       移植完之后发现这种方法根本行不通,对处理器要求太高,不说成本,光是芯片体积也不合使用,不过倒是有解决办法,可以通过Nucleo-STM32F767ZI-144用串口连接一个低端的MCU,将IO的模拟指令通过串口发送给MCU,由MCU来模拟操作,但是这样的话,配置速度将会成百倍的降低,配置CPLD可能还可以,对容量较大的FPGA来说就有点无法接受了。
附录1-MCU和可编程器件连接
注:在配置完之后,要将MCU的IO设为input floating模式,这样不会跟JTAG仿真器冲突。
附录2-Quartus IIjbc文件的生成和配置注意事项
       通过JTAG配置FPGA时有两种情况,一种是只配置SRAM,掉电之后就没有了,另外一种是将配置文件烧写到配置芯片中,掉电保存;如果要用jbc文件来执行配置,这两种情况生成jbc的方法也会不一样。
配置SRAM
       这种情况只通过sof文件来生成jbc文件,步骤如下:
1. 在programer窗口addfile,选择.sof文件,注意将Program/Config和Verify打勾
2. 点击菜单File->Create JAM JBC SVF orISC file…
3. 在弹出的对话框的File Format一栏选择Jam STAPL Byte-Code 2.0,点击OK即可生成。
       这样生成的jbc文件可以执行CONFIGURE操作,不能执行PROGRAM操作。
烧写配置芯片
       这种情况也是要通过sof文件来生成jbc文件,但是要增加一些步骤:
1. QuartusII的主界面点击File->Convert ProgrammingFiles…
2. 在弹出对话框中的Programing File Type一栏选择JTAG Indirect Configuration File(.jic)
3. ConfigurationDevice选择EPS1
4. File name里面指定要生成的文件名字
5. 在Input Files to Convert中点击Flash Loader,在右侧点击Add Device,选择要配置的FPGA器件;点击OK,回到Input Files to Convert再点击SOF Data,点击右侧的Add File…,选择.sof文件,回到Input Files to Convert,点击Generate生成jic文件
6. 在Programmer界面,先Delete掉其他的文件,点击Add File,将刚生成的jic文件添加进去,将Program/Config、Verify和BlankCheck都打勾
7. 点击菜单File->Create JAM JBC SVF orISC file…
8. 在弹出的对话框的File Format一栏选择Jam STAPL Byte-Code 2.0,点击OK即可生成。
       这样生成的jbc文件可以执行PROGRAM操作,但是也能执行CONFIGURE操作,这里就需要注意了,这里的CONFIGURE和前面那个不太一样,它并不是要将FPGA配置为所写的程序,而是将它配置为专门用来烧写配置芯片,所以在STAPL Byte-Code Player中要先执行CONFIGURE指令,然后再执行PROGRAM指令,才可以成功烧写,如果直接执行PROGRAM指令(或Verify BlankCheck等),会报错(Unrecognized Device, ExitCode=6)。


Jam Player移植.rar

3.15 MB

评分
参与人数 1威望 +10 收起 理由
zhanzr21 + 10 很给力!
沙发
xia00| | 2016-8-13 16:20 | 只看该作者
看的懂的人都是大牛。。。

使用特权

评论回复
板凳
CallReceiver| | 2016-8-13 16:30 | 只看该作者
对Jam文件不是很清楚,进来学习下

使用特权

评论回复
地板
mmuuss586| | 2016-8-13 19:49 | 只看该作者
谢谢分享;

使用特权

评论回复
5
mark86739851| | 2017-2-8 00:14 | 只看该作者
altera官网上有8051单片机的jam STAPL code player的代码,占用空间应该会小很多

使用特权

评论回复
6
mark86739851| | 2017-2-8 00:17 | 只看该作者
我qq     7零9395六23 ,最近也在研究CPLD  isp方案,交流一下吧

使用特权

评论回复
7
xudongdong91| | 2017-3-1 19:12 | 只看该作者
感谢楼主哈,本人已经被altera的jamplayer已经搞了快半个月了,一直卡在unrecognized device,回去拜读下

使用特权

评论回复
8
zoomdy| | 2017-3-1 21:09 | 只看该作者
强,很强,非常强!

使用特权

评论回复
9
xudongdong91| | 2017-3-2 09:37 | 只看该作者
mark86739851 发表于 2017-2-8 00:14
altera官网上有8051单片机的jam STAPL code player的代码,占用空间应该会小很多

8051的jam STAPL code player的版本能解析1.1的,现在用quartus生成的jbi文件是2.0的,8051的版本应该不兼容了吧

使用特权

评论回复
10
xudongdong91| | 2017-3-2 11:06 | 只看该作者
大神,你用的PLD是EP2C5,这块是CPLD吗

使用特权

评论回复
11
deru_qq|  楼主 | 2017-3-9 18:27 | 只看该作者
xudongdong91 发表于 2017-3-2 11:06
大神,你用的PLD是EP2C5,这块是CPLD吗

这是块FPGA,都支持JAM Player的,手头没有CPLD

使用特权

评论回复
12
jstgotodo| | 2017-3-9 22:48 | 只看该作者
连FPGA都用上了。

使用特权

评论回复
13
jstgotodo| | 2017-3-9 22:53 | 只看该作者
FPGA+ARM接口是什么?

使用特权

评论回复
14
deru_qq|  楼主 | 2017-3-10 09:03 | 只看该作者
jstgotodo 发表于 2017-3-9 22:53
FPGA+ARM接口是什么?

这个是通过ARM给FPGA下载程序的,通过GPIO模拟JTAG时序

使用特权

评论回复
15
xudongdong91| | 2017-4-10 15:50 | 只看该作者
额,大神。我用altera的jam方式没成功,一直会出现Device xxxx信息,后来无意中使用了xilinux的xsvf方案,反而成功了。我用的是am335x + cpld。也感谢大神哈,突然给了我一丝希望,最后通过其他方法成功了。

使用特权

评论回复
16
chenci2013| | 2017-4-10 21:49 | 只看该作者
JAM Player是什么?

使用特权

评论回复
17
chenci2013| | 2017-4-10 21:52 | 只看该作者
以前都是看过嵌入式移植这些东西

使用特权

评论回复
18
deru_qq|  楼主 | 2017-4-11 09:32 | 只看该作者
xudongdong91 发表于 2017-4-10 15:50
额,大神。我用altera的jam方式没成功,一直会出现Device xxxx信息,后来无意中使用了xilinux的xsvf方案, ...

我也是看到你的回复才知道还可以有其他解决方法,多交流,一起学习

使用特权

评论回复
19
linqiangzxcv| | 2017-5-7 12:47 | 只看该作者
本帖最后由 linqiangzxcv 于 2017-5-7 12:53 编辑
xudongdong91 发表于 2017-3-1 19:12
感谢楼主哈,本人已经被altera的jamplayer已经搞了快半个月了,一直卡在unrecognized device,回去拜读下 ...

@xudongdong91   哥们  你出现“unrecognized device”的问题解决了吗?  我现在移植JAM Player,给MAXII  EPM570下载程序时,也出现这个问题。。
楼上给出的**使用的是FPGA的DEMO,那个确实需要先发送一下“CONFIGURE”命令,在进行其他操作;  我使用的是CPLD,没有那个“CONFIGURE”指令,直接进行“ERASE”就会报出“unrecognized device”错误。  代码其它地方都检查了没发现什么问题,但就是不行   ,百思不得其解????

使用特权

评论回复
20
linqiangzxcv| | 2017-5-7 13:02 | 只看该作者
xudongdong91 发表于 2017-4-10 15:50
额,大神。我用altera的jam方式没成功,一直会出现Device xxxx信息,后来无意中使用了xilinux的xsvf方案, ...

@xudongdong91      altera的jam方式更新CPLD,你成功了吗?解决Device xxxx问题了吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

132

帖子

2

粉丝