基于TCP的STM32 IAP bootloader初步设计

基于TCP的STM32 IAP bootloader初步设计

Daniel_USTB  2015-8-22夜

 

            好久没有写东西,前段时间发生了不少事情,现在终于能静下心来。停下脚步望望曾经的自己,一路走来,对技术的坚持是多么的可贵。人的时间是有限的,作为一个嵌入式工程师,对新技术的热爱和好奇心将产生前进的驱动力。至于可以达到怎样的高度,全看个人的执行力和自我约束,兴趣常常是最好的导向。

        最近研究了下IAP bootloader的实现方法,这在产品设计中是非常有用的。所谓IAP就是在线应用编程,可以用于远程程序升级。比如我们设计了一个产品,使用较为复杂的工艺被封装在精美的外壳中,或者被用于偏远的场景,如果在使用过程中需要修改程序,使用烧写器烧写是非常麻烦的,费时费力。真正的工业产品几乎都会有自己的bootloader

       其实,实现自己的bootloader在原理上并不复杂,就是通过MCU的接口把外部新的程序文件烧写到其内部的flash中,然后去运行新程序。以前怎么也没想过如何在同一个flash里面运行毫无关系的两个程序,bootloader就可以实现。其核心跳转代码就只有三行:

     app_program = (void(*)())((*(__IO uint32_t*)(ApplicationAddress+4)));

     __set_MSP(*(__IO uint32_t*) ApplicationAddress);//初始化堆栈指针

     app_program();//跳转到app程序去执行

     其中ApplicationAddress,是应用程序在flash中存储的地址,ApplicationAddress+4就是复位中断向量地址,因为程序最开始都是去执行复位中断函数的。在这之前,先用一张图说明下stm32的正常启动过程。下图很好的说明了arm的启动过程,以及程序在flash中的存储方式:

 

     对于这个启动过程,我相信图上画的已经很明白了,也可以在很多文档中看到,我就不再赘述了。当然这个是bootloader的运行方式,现在我们还有一个app程序,放在了flash的另外一个区域。使用上述三行代码可以实现跳转,如下图所示:

 

     其中下面的那部分就是APP的存储结构以及运行过程。其过程也不再赘述。有了这个思路作为指导,就可以完成我自己的bootloader了。

     之所以选择TCP的升级方式,我觉得一是升级速度快,二是利用了原设备现有的网口,比较方便,在现有uIP协议栈的基础上实现一个TCP Server,用于接收上位机发来的二进制文件。涉及到数据交互,就要选择相应的交互协议,用的比较多的是1KXmodem协议。由于这是一个初级版本,以简单起见先用分包发送的方式实现,稍后在使用1KXmodem协议,再做诸多改进。这个简单的思路是,在点击下载程序后,先于bootloader进行握手,成功后使用上网机软件将APP BIN文件读入,然后分成1024大小的数据包发送给bootloader,每发完一个包,bootloader就写入flash,这样只占用1K的内存,即使对一个小型stm32芯片也可以实现,而不是一次性读到内部的ram后再编程flash

     基于这个思路我做了一些实验,出现了一些问题。

     问题1arm收到上位机下发一个数据包后马上写入flash,再返回ack,读写flash会占用较长的时间,造成上位机发送超时,引起重发。

     其实,完全可以arm收到一个数据包后立即应答,之后在下个数据包发来之前写入flash中去。

     问题二、把一包1024字节的数据写入flash后,我定义的很多全局变量被莫名奇妙的编程了FF,导致了程序运行错误。

     我想了两个晚上都不知原因。后来看flash函数才发现,原来flash是按块进行读写的,写入数据前先要整个数据块读出来,而这个函数声明了一个一块大小的局部数组,居然有2048这么大!大家都知道局部数组是放在内存的栈上的,而stm32在启动文件中定义的栈只有1K大小!在存储一包1024大小的数据到flash时栈过小,造成泄露,覆盖了分配在堆上的全局变量!把启动文件中栈大小改为Stack_Size      EQU     0x00002000,一共为8192字节,可以解决上述问题。

     这样,我的BIN文件就可以存入flash中去了,我定义的首地址为0x08010000,也就是给bootloader留出了64KBytes的空间,我的bootloader编译完一共26K,足够了。

     可以我又遇到了第三个问题:写完后居然不能执行!我通过jlinkflash0x08010000地址上的数据读出与BIN文件对比,发现有些数据是错的!

    

                                       通过jlink烧写的app程序        通过上位机少进去的程序

     原来,是上位机打开BIN文件的方式不对。上位机软件使用C#编写,打开BIN文件起先使用的是StreamReader,后来查到应该使用BinaryReader。原来StreamReader是按照asc码的定义来解析,如果没有对应的asc码,就会出现乱码,而造成了某些字节的错位。读取文件改为BinaryReader方法就可以了,看看这几天的成果吧。

 

      下一步计划:使用X-Modem协议实现数据的交互,添加异常处理机制,保证数据传输的可靠性,以及bootloader的稳定性。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: STM32 IAP(In-Application Programming)串口 Bootloader是一种用于STM32微控制器的串口引导程序。它允许用户通过串口接口对STM32芯片进行固件(程序)的更新和烧录。 使用IAP串口Bootloader的好处在于,我们可以通过外部设备(如电脑)的串口与STM32微控制器通信,而无需使用专门的烧录工具。这样就方便了固件的更新,同时节省了成本。 在使用IAP串口Bootloader进行固件更新时,我们需要先将Bootloader本身烧录到STM32芯片的内部Flash中。然后,我们可以通过串口接口将新的固件程序发送到芯片,并在芯片上执行这个程序。 一个典型的IAP串口Bootloader应该具备以下功能:与上位机(电脑)通信的串口接口、对固件进行接收和存储的能力、对接收到的固件进行校验的功能以确保完整性、重启和跳转到新固件的能力等。 通过使用IAP串口Bootloader,我们可以实现对STM32芯片的远程更新。这对于大规模应用中的批量更新非常有用,因为我们可以通过网络将固件传输到每个设备,并远程执行固件更新。这大大提高了更新的效率和便捷性。 总之,STM32 IAP串口Bootloader允许通过串口对STM32芯片进行固件更新,具备了简单易用、低成本、远程更新等优势,用于批量更新和快速迭代的产品开发中非常有用。 ### 回答2: STM32 IAP (In-Application Programming) 是一种可以通过串口来实现固件升级的串口 bootloader。这意味着我们可以通过串口接口,不用外部编程器,直接在已经部署的STM32芯片上更新固件。 STM32的串口 bootloader 非常方便,因为大多数STM32芯片都集成了用于串口通信的USART模块。通过该串口模块,我们可以与主机计算机建立通信,并使用升级固件的工具来发送新的固件文件。 串口 bootloader 通常由两部分组成。一部分是在芯片出厂时预烧录的引导程序,也称为ROM bootloader。这个引导程序负责在芯片上电时的初始化操作,并负责在引导模式或应用模式之间进行切换。另一部分是我们可以根据需要编写的应用程序,通常被称为User Application。User Application负责处理应用层的功能,同时需要处理与串口 bootloader 之间的通信。 在运行时,当芯片启动时,ROM bootloader会检测特定引脚(例如 BOOT0 引脚)是否被拉低,如果是,则芯片会进入串口 bootloader 模式。然后,主机计算机可以通过串口与芯片通信,并发送新的固件文件。芯片会通过串口接收文件并存储在相应的存储位置上。 一旦新的固件文件接收完毕,芯片将验证文件的完整性,并在通过验证后将其存储在相应的固件区域。然后芯片将控制权转交给User Application,让其开始使用新的固件。通过这种方式,我们可以使用串口 bootloader 来实现非常方便的固件升级,而不需要物理访问芯片和外部编程器的支持。 总而言之,STM32 IAP 串口 bootloader 是一种用于通过串口接口进行固件升级的方便方式。它由ROM bootloader和User Application组成,通过串口与主机计算机通信,并处理新固件文件的接收和存储。这种方法避免了对外部编程器的依赖,使得固件升级变得更加方便快捷。 ### 回答3: STM32是一种嵌入式微控制器系列,可以使用UART串口来实现IAP(应用程序在内部存储器中更新)功能。而串口Bootloader是一种特殊的程序,允许通过串口接口进行外部的固件升级。 串口Bootloader主要有以下功能: 1. 通过串口接口与计算机或其他设备进行通信,从而实现固件的传输和更新。 2. 提供一个命令界面,通过接收计算机发送的指令来执行不同的操作,如擦除内存、写入新固件等。 3. 具备错误检测和恢复机制,确保固件的传输和写入的正确性。 4. 具备固件校验功能,保证新固件的完整性和安全性。 在stm32中,IAP功能通过串口Bootloader来实现。首先,将带有Bootloader的特殊固件烧录到stm32芯片中。然后,将计算机或其他设备通过串口与stm32连接,并发送相应的命令和固件数据。串口Bootloader将接收到的指令解析,并执行相应的操作。例如,当接收到固件数据时,Bootloader将把数据写入芯片内部的闪存。在整个过程中,Bootloader会负责检测错误并进行恢复,以保证固件的正确更新。 通过串口Bootloader,用户可以方便地对stm32芯片中的应用程序进行升级和更新,无需进行物理连接或者使用其他烧录工具。这为产品的开发和维护提供了灵活性和便利性,同时也增强了固件的稳定性和可靠性。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值