stm32f103f8t6+keil+IAP+Ymodem(有线传输)+keil

由于篇幅和研究进度的限制,本文分为上下两部分:上部分为有线IAP下载的编写,下部分为添加无线模块以后的下载代码编写。

描述:stm32f103f8t6+Ymodem+Bootloader(有线下载)+keil

文中灰色底色的为摘自其他作者的文章,文章下附原文链接

笔者通过参考ST官方Bootloader代码和正点原子APP代码,得到了一份可以在stm32f103f8t6最小系统上运行的代码(Bootloader+APP)stm32f103f8t6最小系统上运行的代码(Bootloader+APP),代码测试成功截图如下:
下载成功截图

项目来源

在项目开发过程中,通常会使用大量的杜邦线或类杜邦线导线作为连接线路。下载电路和电脑之间的插拔总是让人十分无奈:一方面插拔过程中时间的增加使得开发周期增长,另一方面,插拔过程中不可避免的会使相邻线路晃动,可能会使得电路中杜邦线松动,造成电路故障。

基于上述理由,是我萌发了使用无线下载的下载方式。

开始前的准备

硬件准备

考虑到单片机引脚、RAM、ROM和外设等资源,本项目中使用stm32f103f8t6单片机最小系统作为开发载体。
本程序使用的最小系统

在进行单片机的IAP代码编写前,有一点需要尤为注意:电脑的USB端口数目。开发过程中电脑需要连接的USB硬件有鼠标、键盘、STlink(或其他下载器)、CH340串口共计4个USB口,其中由于STlink(或其他下载器)、CH340串口都连接在最小系统上,故两者必须相邻。为满足上述要求,一般需要外接USB扩展坞作为USB口的扩展。

编程前须知

本项目使用IAP方式编程,常用的单片机编程方式为ISP编程,两者区别已有前辈给出,这里直接复制过来给大家看

ISP和IAP的一些基本概念(作者:junlianzi)

  1. ISP就是in-system programming(在系统烧录,在系统编程)。以前要烧录代码bin文件到单片机内部的flash中是需要借助专用的烧录器的,比较麻烦。后来我们就需要一种不用烧录器也不用把单片机从板子上卸下来的烧录方法,这种方法就是ISP。一般ISP都是PC机通过串口把bin/hex文件直接isp到单片机内部flash中,比如利用J_LINK或者USB转TTL进行烧录。

  2. IAP就是in-application programming(在应用编程,在应用烧录,在线升级),IAP的核心是用户需要在自己的应用程序中去操作单片机内部flash的控制器的寄存器,实现对内部flash的烧录功能。然后IAP的时候用户程序通过串口(usb、ethernet)来接收PC发送过来的bin/hex文件,然后将之烧录到内部flash中去完成IAP。完成后再次启动后就会从用户存储器区执行,更新就会起效果。一般实现iAP需要人为的将用户存储器区分为2部分:bootloader+app,很多嵌入式产品的后续升级采用这种方式。
    ————————————————
    版权声明:本文为CSDN博主「junlianzi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:原文链接

由于IAP编程程序在实际工作时单片机内有两套代码,故使用IAP编码的单片机内部程序flash存储空间相对来说需要更大。所以STC普通系列单片机(如stc89c5x)无法使用IAP程序。
个人理解:IAP程序中bootloader和APP程序在相互跳转时,两个程序中的主程序可各自视为一个普通之程序,运行完毕即释放所声明变量,但全局变量在跳转完毕后不被释放,因此请注意bootloader和APP程序中全局变量声明是否重复。此外程序中设置的外设(如串口),程序跳转后,跳转前的设置跳转后不被改动。

程序跳转

STM32 IAP 在线升级详解(作者:yx_l128125)

————————————————

版权声明:本文为CSDN博主「yx_l128125」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:原文链接

项目中的常见问题

为什么要选用Ymodem

正点原子在做IAP教程时使用的传输方式为仅串口,但串口传输只能保证所传输的字节无误,但由于周围的电磁场和其他情况以及后续将要使用无线传输的下载方式,仅使用串口无法保证程序字节和字节之间的正确性。而在串口传输的基础上增加Ymodem传输协议则可以保证程序字节和字节之间的正确性。且Ymodem具有较高的误差兼容以及先发送程序大小,可有效避免APP文件过大带来的程序flash无用性擦除带来的程序flash不必要的寿命衰减。

Ymodem的传输工具

普通串口传输工具不具备Ymodem传输协议,因此应使用特定的软件。

SecureCRT具有Ymodem传输协议,建议使用。
Tera Term虽然也具有Ymodem传输协议,但笔者在测试过程中发现Tera Term在Ymodem时通信失败,疑似该软件本身存在问题。

APP烧录位置确定

对于stm32,可使用STM32 ST-LINKUtility读取芯片数据,比对数据位置,即可确定APP代码烧写位置是否正确。

Ymodem传输过程中传输错误的查找

Ymodem传输协议使得程序调试增加难度,在Ymodem中增加串口输出文字作为调试信息可能会影星Ymodem本身的正常传输;使用LED作为指示信号,又需要大量的LED灯,两者都不合适。

较为合适的方法是使用抓包工具,对电脑传输的信息抓包查看。笔者使用的抓包工具为Bus Hound(可在其官网找到有限制的免费版本)。

程序无法从Bootloader跳转到APP

stm32官方为使单片机运行更加稳定,定义了诸多意外中断。如程序无法由Bootloader跳转到APP,可尝试将如下标记代码用与如下相同方式处理,应该就可以解决了。

bootloader跳转app失败 解决 位置

程序由APP跳转到Bootloader出现问题

STM32F1xx IAP跳转App 后中断异常及解决(作者:苏墨随笔)

网上看到一些网友遇到STM3F1xx系列编写IAP程序经常遇到跳转到App后中断异常的问题,如一触发串口接收中断就复位等,现梳理如下。

其实引起上述异常的根本原因就是:共用一组件,中断无入口。如:IAP程序中配置并打开了USART1接收中断;在App中使用轮询查询USART1,所以初始化时未配置、使用或关闭USART1中断且未编写中断函数,而实际上IAP是打开了USART1中断的,此时USART1一旦收到数据就会触发中断,但App程序中没有编写函数,程序找不到中断入口进而引起异常复位。

解决方法:在IAP程序跳转前关闭或者在APP初始化中重新配置对应组件的中断即可。
————————————————
版权声明:本文为CSDN博主「苏墨随笔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:原文链接

便捷的Bootloader代码生成方式:(笔者未尝试)

搜寻资料时找到了下面的通用Bootloader代码生成方式,若不需要知道IAP原理的急需者,或许可以一试

使用 STM32 通用 Bootloader ,让 OTA 更加 Easy(作者:我夏了夏天)
————————————————
版权声明:本文为CSDN博主「我夏了夏天」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:原文链接

关于使用NRF24L01转USB模块避坑指南:

笔者原本打算使用NRF24L01作为无线下载的媒介,某宝上刚好有该产品,但由于个人疏忽,进坑了:NRF24L01转USB模块单次传输有效字节数:1-31字节,单次传输内容过小。这使得该模块无法作为IAP程序的无线传输工具!!!

最后

上述为参考网上各方所得,个人能力有限,若有错误,欢迎各位大神指正赐教。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值