SENDER:发送方。 RECEIVER:接收方。 第一步先由接收方,发送一个字符'C' 发送方收到'C'后,发送第一帧数据包,内容如下: SOH 00 FF Foo.c NUL[123] CRC CRC 第1字节SOH:表示本包数据区大小有128字节。如果头为STX表示本包数据区大小为1024 第2字节00: 编号,第一包为00,第二包为01,第三包为02依次累加。到FF后继续从0循环递增。 第3字节FF: 编号的反码。 编号为00 对应FF,为01对应FE,以此类推。 第4字节到最后两字节:若第1字节为SOH时有128字节,为STX时有1024字节,这部分为数据区。“Foo.c” 文件名, 超级终端下,在文件名后还有文件大小。官方dome也是因为使用了这个文件大小进行比对。这就是为什么用SecureCRT中的YMODEM协议而无法正确传输的原因。 在文件名和文件大小之后,如果不满128字节,以0补满。 最后两字节:这里需要注意,只有数据部分参与了效CRC验,不包括头和编码部分。 16位CRC效验,高字节在前,低字节在后。 接收方收到第一帧数据包后,发送ACK正确应答。 然后再发送一个字符'C'。 发送方收到'C'后,开始发送第二帧,第二帧中的数据存放的是第一包数据。 接收方收到数据后,发送一个ACK然后等待下一包数据传送完毕,继续ACK应答。直到所有数据传输完毕。 数据传输完毕后,发送方发EOT,第一次接收方以NAK应答,进行二次确认。 发送方收到NAK后,重发EOT,接收方第二次收到结束符,就以ACK应答。 最后接收方再发送一个'C',发送方在没有第二个文件要传输的情况下, 发送如下数据 SOH 00 FF 00~00(共128个) CRCH CRCL 接收方应答ACK后,正式结束数据传输。 STM32 Bootloader软件设计 笔者一开始软件的基本思想,串口接收数据,和写数据到ROM中,两者可以同步进行。这样可以让cpu得到最大程度的有效利用。 比如说接收一帧1024的数据,所用的时间= 当前波特率单字符所用时间 * (1024 + 1头 + 2编码 + 2CRC)= (1/115200 * 10) * (1024 + 1 + 2 + 2) = 89.323ms 也是就是,在接收的这90ms左右的时间里,在接收下一帧结束这一期间内,可以把上一帧的数据写入到ROM中。 串口接收数据是中断的方式,所以收写操作基本上算同步运行。程序流程如下 STM32 Bootloader使用方法: 这个STM32 Bootloader程序使用起来很简单,如果你以前没有用过IAP升级方式,也没关系下面会详细说明。 准备工作: 硬件:有串口目标板1,串口连接线。 软件:PC工具:超级终端 或SecureCRT,stm32目标板程序.bin,stm32 Bootloader。 1) 先把上面的工程stm32 Bootloader下载到目标板中; 2) 打开超级终端 或SecureCRT,设置波特特115200,停止位1,数据位8,效验无。 3) 先按下‘C’再给目标板上电;(注意先后顺序) 4) 选择1,然后使用YModem, YModem-G协议发送"stm32目标板程序.bin"文件。 5) 传输完毕后,会自动运行。 注意:以下两处根据自己的需求调整 stm32 Bootloader修改: 找到工程下的common.h文件: 以下三个宏定义根据自己目标板的需求来定: #define ApplicationAddress 0x8002000 //程序首地址 #define ApplicationSize 120000 //目标程序预留空间 #define STM32F10X_HD //目标板芯片类型 stm32目标板程序.bin偏移地址修改: 有两个地方: 1找到system_stm32f10x.c #define VECT_TAB_OFFSET 0x2000 /*!< Vector Table base offset field.
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|