打印
[应用相关]

STM32与FPGA升级更新

[复制链接]
2439|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

使用特权

评论回复
沙发
goodluck09876|  楼主 | 2019-9-15 17:14 | 只看该作者
基于x86平台的PC104工控机通过有线以太网或者WiFi连接的方式与控制台计算机连接,并通过集
成的无线路由器与控制台计算机及各ARM 控制器板组
成内部局域网。PC104用于控制台控制命令的转发、各板
卡状态的反馈以及升级固件的传输等功能。ARM 控制
器板卡采用STM32F407微控制器,主要用于实现板卡间
协议通信,复杂算法的实现及固件自动升级功能。FPGA
板卡采用Xilinx公司Spartan-6系列XC6SLX45T。由于
FPGA内部没有大容量Flash存储器,需要外扩PROM 存
储固件程序。在设置配置方案后,板卡上电时将PROM
中的固件读出并加载到FPGA 的SRAM 中运行,配套
PROM 的型号为Xilinx XCF16P。FPGA板卡主要用于实
现高速信号数据传输及控制命令的并发执行。ARM 控
制器外扩的Flash用于存放ARM 控制器和FPGA 板卡
的固件。ARM 控制器和FPGA 板卡之间通过串行及并
行接口进行数据通信,并通过JTAG接口将FPGA 外接
的PROM 以菊花链的方式连接,按照JTAG的协议规范
将固件依次下载到菊花链上的各PROM 中。

使用特权

评论回复
板凳
goodluck09876|  楼主 | 2019-9-15 17:15 | 只看该作者
STM32系列MCU的固件文件介绍STM32系列的MCU(微控制器单元)可应用IAR forEWARM V6.40编译环境进行开发设计,程序编译后默认生成的固件格式后缀为.out,可通过JTAG仿真器及修改编译环境的配置选项,直接将程序下载到MCU的内部Flash中运行,也可下载到内部SRAM 中进行在线调试。如果采用自动升级方式,建议通过开发编译环境的配置选项输出一个*.bin文件,即二进制格式的固件文件。该文件不仅支持STM32固件的传输和自动升级,还可通过ST公司提供的STM32系列固件下载工装软件STlink utility及ST-Link V2仿真器,将固件下载到STM32MCU的内部Flash中运行。

使用特权

评论回复
地板
goodluck09876|  楼主 | 2019-9-15 17:15 | 只看该作者
ISE软件是Xilinx公司推出的FPGA及CPLD集成开发环境,该软件环境下编译生成的FPGA 固件格式通常包括.bit和.mcs格式两种。编译器默认生成.bit格式的固件文件,可通过JTAG仿真器将文件下载到内部SRAM 中,也可应用该文件实现FPGA固件的自动升级。BIT文件的组织格式通常为15字节的文件开始标记、文件名记录、文件创建时间、配置数据开始标记及配置数据,该文件可通过UltraEdit软件查看。在通过网络传输FPGA固件的过程中,通常只需要传递配置数据,配置数据的起始部分固定为FF FF FF FF AA99 55 66,所以在传输数据过程中只需要检索关键字,识别到配置数据起始关键字后将前面的数据剔除即可。MCS格式文件为ASCII格式文件,文件内容可通过文本编辑器查看。该文件格式是在ISE软件中通过BIT文件经位转换及添加校验信息等过程转换生成。该文件格式可用于通过JTAG下载电缆对PROM 的配置,也可用于固件自动升级后对固件文件的回读校验。

使用特权

评论回复
5
goodluck09876|  楼主 | 2019-9-15 17:16 | 只看该作者
如果只考虑实现ARM 及FPGA固件的自动升级功能,可将系统的硬件方案进行简化,因为STM32F407微控制器提供以太网MAC层接口,也可通过上位机直接与该控制器通过网络接口连接,简化的硬件框图如图2所示。

使用特权

评论回复
6
goodluck09876|  楼主 | 2019-9-15 17:17 | 只看该作者
通常,FPGA固件的下载方式是通过板卡上预留的JTAG接口来实现的。应用ISE软件及JTAG仿真器将由BIT文件转换生成的MCS文件下载到FPGA配置的PROM 中,系统重新启动后FPGA 控制器读取外部PROM 的文件,并将配置文件自动下载到FPGA 的SARM 中运行。FPGA固件自动升级的配置方案及硬件连接如图3所示,STM32控制器要为3个FPGA控制器传递升级固件,而实现过程是将STM32及3个PROM 以菊花链的方式连接,按照JTAG 软件协议依次将固件下载到3个PROM 中。系统重新启动后,FPGA从PROM 中分别读取各自的配置文件,并加载到SRAM 中实现各自的功能。

使用特权

评论回复
7
goodluck09876|  楼主 | 2019-9-15 17:17 | 只看该作者

使用特权

评论回复
8
goodluck09876|  楼主 | 2019-9-15 17:17 | 只看该作者
固件升级的功能在IAR for EWARM V6.4集成开发环境中完成,STM32 和FPGA 固件升级代码都通过STM32平台实现,STM32通过网络接收上位机传递的固件升级代码。FPGA 固件升级的过程更加复杂,需要STM32控制器按照JTAG协议将固件下载到FPGA外扩的PROM 中。

使用特权

评论回复
9
goodluck09876|  楼主 | 2019-9-15 17:19 | 只看该作者
STM32系统中除了要实现固件升级功能,还要完成板卡间通信、系统状态监控等多项功能。为了实现多任务调度及网络传输功能,需要在STM32系统中移植μC/OS-II系统及LwIP以太网协议栈。μC/OS-II是Micrium(现被Silicon Labs收购)公司的一款可裁剪、可移植、抢占式多任务嵌入式实时内核,广泛应用于微控制器中。LwIP是瑞典计算机科学院开发的一个小型开源的TCP/IP协议栈,由于它能在保持TCP协议主要功能的前提下减少对RAM和存储空间的占用,特别适合于硬件资源比较有限的MCU。操作系统的移植过程可以参考Micrium公司网站上基于STM32控制器的移植范例。

使用特权

评论回复
10
goodluck09876|  楼主 | 2019-9-15 17:19 | 只看该作者
为了实现STM32固件自升级功能并提高系统的稳定性,需要将STM32的固件分成3个部分,分别为引导代码、备份代码及应用代码。3部分代码分别建立3个工程开发,最后将3个编译生成的.bin文件通过VC++软件合并为一个大小为256KB的固件文件。如图4所示,引导代码存放的地址区间为0x00000~0x28000,是一个未移植操作系统的单循环任务,主要用于加载BSP文件并判断系统的固件状态,如果有新固件存放在外部Flash中,则从外部Flash将固件读取到内部Flash中。

使用特权

评论回复
11
goodluck09876|  楼主 | 2019-9-15 17:19 | 只看该作者

使用特权

评论回复
12
goodluck09876|  楼主 | 2019-9-15 17:21 | 只看该作者
当引导程序通过读取内部Flash标志位确认没有新
固件需要更新时,引导代码将重映射的起始地址设置为应
用代码的起始地址,初始化用户应用程序的堆栈指针后进
行程序的重映射,程序会自动跳转到应用程序中运行,重
映射部分的代码如下:
//判断用户固件起始地址是否映射到内部Flash地址
if(((*(__IO uint32_t*)App_base_address)&0x2FFE0000)
== 0x20000000){
  JumpAddress= *(__IO uint32_t*)(App_base_address
+4);//App_base_address为应用代码起始地址
  Jump_To_Application= (pFunction)JumpAddress;
  //初始化用户应用代码堆栈

使用特权

评论回复
13
goodluck09876|  楼主 | 2019-9-15 17:22 | 只看该作者
备份代码存放在固件中的地址区间为0x28000~
0x16800,它作为应用代码的备份,只保留最基本的功能,
当引导代码检测到上次固件升级失败时,将加载备份代码
起始地址为重映射地址,并跳转到备份代码中运行,确保
系统的基本功能能够实现,防止因固件升级失败导致板卡
功能失效。

使用特权

评论回复
14
goodluck09876|  楼主 | 2019-9-15 17:22 | 只看该作者
应用程序代码存放的位置为0x16800~0x3FFFF,共166KB,用于实现全部的用户自定义应用程序,包括STM32和FPGA 的固件自动升级任务。μC/OS-II系统提供了任务调度、任务管理、内存管理、任务间通信等基本功能,固件升级功能通过5个任务相互协调完成。这5个任务包括IP层任务、TCP层任务、网络服务任务、FPGA升级任务、外部Flash读写驱动任务。

使用特权

评论回复
15
goodluck09876|  楼主 | 2019-9-15 17:22 | 只看该作者

使用特权

评论回复
16
goodluck09876|  楼主 | 2019-9-15 17:23 | 只看该作者

使用特权

评论回复
17
goodluck09876|  楼主 | 2019-9-15 17:23 | 只看该作者
该任务主要用于与上位机之间建立连接并实现数据传输。此任务建立网络服务器,接收来自于上位机的连接、服务请求,并接收升级固件。升级固件包括STM32和FPGA固件两种,当接收到升级STM32的请求后启动外部Flash读写驱动任务,将接收到的升级数据保存到外部Flash中,当收到完整的升级数据后将升级标志置为1并存储到特定的Flash地址。重新上电之后,引导代码优先启动,并检查该标志位,如果为1,启动升级流程,清空标志位。应用DMA将外部Flash中的固件读出并拷贝到内部Flash中然后进行重映射,程序将跳转到应用程序入口运行。此任务对外的接口为接收消息队列和网络层接口队列(通过标准的Socket接口与TCP/IP进行通信)。图7为网络服务任务的流程图。


使用特权

评论回复
18
goodluck09876|  楼主 | 2019-9-15 17:23 | 只看该作者

使用特权

评论回复
19
goodluck09876|  楼主 | 2019-9-15 17:24 | 只看该作者
FPGA的固件是通过网络服务任务接收而来的。网络服务任务传递消息给外部Flash读写驱动任务,调用写外部Flash函数将数据按页写入到外部Flash中并进行回读校验,随后启动FPGA升级任务。将按页读取的数据通过JTAG协议写入到FPGA外接的PROM存储器中。重新上电后,经过配置的FPGA会自动读取PROM中的固件并运行。FPGA升级任务首先初始化I/O及JTAG 接口,并申请用于保存外部Flash数据的缓存区,顺序地读取固件数据,通过异或校验码确定读取数据的正确性,然后调用JTAG 下载函数执行程序下载。JTAG函数中每次读取指定字节的数据并按照JTAG协议下载到FPGA的存储器中,通过写入之后的回读校验来验证写入固件数据的正确性。当所有固件数据都正确写入后向网络服务任务返回升级成功信号,否则返回错误信息。FPGA升级任务再次进入等待状态,等待任务启动信号量的唤醒,图9为FPGA升级任务流程图。

使用特权

评论回复
20
goodluck09876|  楼主 | 2019-9-15 17:24 | 只看该作者

使用特权

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

本版积分规则

220

主题

5843

帖子

20

粉丝