10. 固化程序
固件在SPI Flash的结构
由于绝大多数的设计都是使用SPI Flash,因此这里只介绍SPI Flash的烧写。ERTEC200P-2的固件在SPI Flash中的Layout如下图所示:
其中ROM Header:格式如下图所示:
Firmware Binary: 协议栈固件的二进制程序
Trace Data:当协议栈出现致命错误时,会将Trace数据写入到这个区域,但是目前没有开放工具支持读取和分析这些数据
NV Data: 非易失性参数(例如:MAC地址,IP地址,设备名称)
这里需要注意的是,目前协议栈默认Trace Data起始地址为0x00570000(注意与原始协议栈不同),NV Data的起始地址为0x005F0000 (注意与原始协议栈不同),如果二进制程序的比较大,越过这些数据(e.g. Trace Data)的起始地址,就会被这些数据覆盖,导致协议栈无法启动。解决的办法是修改协议栈的宏SPI_FLASH_TRACE_START和SPI_NV_ADDRESS。
10.1 标准的烧写方法
注意:烧写时一定要断开网线与PLC的连接。在TIA博图软件中更新在线设备,在“在线和诊断” “分配IP地址” 将设备的IP地址改为 “192.168.1.10”。
编译生成的二进制文件ecos.bin位于\pn_ioddevkits\src\projects\pnio_proj\ertec\EB200P_Debug_EcosNative,将bin文件拷贝到\tools\TcpFwLoader文件中。用记事本打开TcpFwLoader_EB200P.bat文件,修改IP地址,使IP地址与目标板一致。同时修改.bat文件中的.bin文件名,使其与BootableBinary文件中的.bin文件名一致。例如:
tcpFwLoader ecos.bin 192.168.1.10 999
在putty串口终端键入“f”后,双击TcpFwLoader_EB200P.bat运行下载程序
选择SPI FLASH,键入“2”,完成后,关闭Eclipse和GDB Server,重启开发板就可以看到新的固件运行了。
10.2 Python 烧写工具
笔者开发了一个基于Python的小工具。基本运行步骤是:
- 通过JLink的GDB Server初始化SDRAM
- 将一个可执行程序(flash_spi.elf)加载到SDRAM的起始地址
- 将固件的二进制文件加载SDRAM到指定区域
- 将MAC地址等参数加载到SDRAM
- 启动可执行程序(flash_spi.elf),可执行程序会完成烧写固件,烧写NV Data,校验等操作
运行界面如下:
运行前的准备
- 安装pyhthon3
- 安装依赖库,在windows命令行中输入:
pip3 install ConfigParser
pip3 install wxPython
pip3 install pygdbmi
如果提示找不到pip3,需要在系统路径中添加pyhton39/scripts/
开始烧写
连接JLink到目标板,打开JLink GDB Server,确认JLink GDB Server处于运行状态;运行flash_gui.py;指定gdb的可执行程序和需要烧写的二进制代码。修改相关参数,例如MAC地址(注意:每个PN设备需要占用3个MAC地址,例如当前设备的MAC地址是80_20_CB_30_00_50,那么当前设备就占用了80_20_CB_30_00_50,80_20_CB_30_00_51,80_20_CB_30_00_52三个MAC地址,下一个设备就只能从80_20_CB_30_00_53开始。此外MAC地址不能自行随意定义,需要从相关机构购买。)和SPI的偏移量(注意:一定要与固件中的宏SPI_NV_ADDRESS保持一致)。依次运行“Start GDB”和“Flash”完成烧写,烧写完成后会自动弹出对话框提示烧写完成;在烧写过程中,ERTEC200P-2调试串口会打印出状态信息:
如果需要修改默认值,可以直接编辑config.ini文件
附录
1. 其他的评估板的适配
如果要适配NINICARD和NANO评估板,打开项目中的Makefile
如果是MINICARD,去掉#DEFD += -DMINI_BOARD_V1=1 的注释标识#
如果是NANO,去掉#DEFD += -DNANO_BOARD_V1=1 的注释标识#
2. 致谢
感谢大家选择西门子ERTEC200P芯片进行PN设备的开发!您对PN技术的支持,给我们增添了在技术的道路上勇往直前的信心和勇气。
祝开发顺利 !
芥末博士
2023-4-24