ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

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

[复制链接]
1753|22
 楼主 | 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可以随便指定,因为这两个参数程序中不判断,只是为了和原来的指令格式保持一致
内存使用
配置完之后会打印出内存占用