stm32之iap实现应用(基于串口,上位机,详细源码)

开发环境:Window 7
开发工具:Keil uVision4
硬件:stm32f103c8t6

篇幅略长,前面文字很多,主要是希望能让小白们理解,后面就是实现步骤,包括实现的代码。

在研发调试的时候我们一般用烧录器下载代码,对于stm32f103c8t6来说,还可以用串口下载,步骤如下:

1.PC端下载一个上位机Flash Loader Demo
2.芯片的串口引脚Tx、Rx(PA.9、PA.10)通过USB>TTL连接到电脑上
3.将芯片的boot0引脚接高电平、boot1引脚接低电平。这是为了让芯片上电的时候从系统存储区启动,原厂的isp程序保存在那里,地址是0x1FFF 000 ~ 0x1FFF 77FF。系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动程序,它负责实现串口、USB以及CAN等isp烧录功能。
4.打开上位机,配置如图,波特率可多选,这是因为上位机在发送握手0x7F时,芯片接收到0x7F后,就能将波特率算出来,然后给自身串口初始化,跟上位机设置一样的波特率。接着给芯片上电,上位机选择bin文件,下载到芯片里面后,将boot0和boot1引脚接低,重新上电,就能运行刚下载的程序了。

在这里插入图片描述
这样就可以在没有烧录器的情况下下载程序了,当然如果要进行调试的话,还是需要烧录器。

除了上面这两种给芯片下载新程序的方法,还可以在芯片运行中给自身flash存储器写入新程序。这就是iap(In application Programing在应用编程)。做一个产品,研发时一般都是在PC端借助烧录器升级,但到客户手里一般是用U盘升级,只要把U盘插入到机器中,就能给自身升级。其中,在插入U盘后,芯片检测到需要升级,就会跳转到iap程序段里面去,然后读取U盘里面的程序,再将U盘的程序文件拷贝到自身的flash里,拷贝完成之后,跳转到新的程序中运行。下面是通过串口给自身升级的iap案例,将实现的过程代码详细说明。

stc32f103c8t6内部有一个64k的flash存储器,用于储存代码,在电脑上编译好的程序,通过烧录器把它烧录到内部flash中。Flash里面的内容掉电不会丢失,烧录完,芯片重新上电,就可以从内部flash中加载代码(起始地址一般是0x0800 0000)。

内部falsh除了用烧录器读写外,还可以在芯片运行时,对自身的内部flash进行读写。如果flash储存了程序后还有剩余的空间,那么可以把它用来保存程序运行时产生需要掉电保存的数据;也可以在芯片运行时将另一个编译后的二进制程序文件写到剩余的flash,然后进行跳转到新的程序上面运行。这也是iap的实现原理。

1.先介绍怎么利用stm库对flash进行操作

所有flash操作相关的函数接口在stm32f10x_flash.h里面。读flash里面的数据直接根据地址读出来就行了。往写flash里面写数据,需要解锁,擦除,写入数据,上锁;擦除后存储单元都变成1,因为储存单元不能由0变1,所以在写入之前一定要先擦除,不然会写入失败。
操作代码如下:

#define address 0x08006000   //写入的flash地址
#define value 0x55aa55aa     //将要写的数据
void flash_test(void)
{
	uint32_t *pdata=address;

	Printf(“data=%d”,*pdata);   //先将原来的数据打印出来
    FLASH_Unlock();    //解锁
	FLASH_ErasePage(address);   
	//擦除,擦除只能按页擦,擦除address地址所在的页,不同的芯片一页的大小不一样,对于stc32f103c8t6来说,一页就是1024字节,也就是1k。

	FLASH_ProgramWord(address,value);   
	/*将data写入address地址里面,除了写入uint32_t类型,还可以写uint16_t类型的数据,对于一份很长的代码来说,只能这样一个个的写进去flash,对应接口如下:
	FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);
	FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);*/

	FLASH_Lock();		//上锁,保护数据		
	Status=FLASH_WaitForLastOperation(0xFFFFFF);//等待烧写结束,参数是等待的超时时间
	if(Status==FLASH_COMPLETE){
	//写入成功
	}
	Printf(“data=%d”,*pdata);//打印确认是否写入成功
}

要注意,address的地址不能指向自身的代码区域,因为修改了自身的程序会造成不可预测的效果,所以要指向自身程序后面的空余区域,一般来说从0x08000000+加上程序的大小,后面的就是空余区域。下图是对于芯片stc32f103c8t6的工程配置:
在这里插入图片描述

2.流程图不太会写,简单地将过程描述一遍,iap策略如下:

在这里插入图片描述
对于升级的方式,可以选择以下几种,如USART,IIC,CAN,USB,以太网接口甚至是无线射频通道,将程序文件发送到iap。

存储区划分:

Bootloader工程:0x800 0000-0x800 2BFF (11k)
升级标志:0x800 2C00-0x800 2FFF (1K)
App工程:0x800 3000 -0x801 0000 (52k)

芯片上电首先是进入bootloader工程的,所以把bootloader放在前面。升级标志可能会有人问为啥要1k这么大,一个字节不行了吗?首先,bootloader和app都可能会对升级标志的值进行修改或读取,所以不能保存在RAM,只能保存在ROM,那么对ROM的数据进行修改就是flash读写操作,上面提了要先擦除,而且擦除是按页擦,一页就是1k,所以就算标志位不需要1k这么大,只用其一个字节,那剩下的也不能用到其他地方,因为它随时会被擦除。

下面开始说明这两部分的代码实现,其中的一些配置也要细心注意。

3.Bootloader工程

Bootloader程序开机引导app程序,在运行app程序中,若收到升级信号,则从app跳转到bootloader里,然后boorloader通过串口接收新的程序文件,对app进行升级。所以,我们还需要一个上位机将程序文件通过串口发送给bootloader,为了方便,我没自己做上位机,直接用Flash Loader Demo,这个可以网上下载。那么上位机有了,还要了解它的通讯协议, 到底数据是怎么从上位机发送过来了,bootloader该怎么接收数据。
其实我们要做的bootloader工程就是要实现原厂isp的功能,跟上位机同步,接受上位机数据。我们无法得到人家的isp代码,但是可以上st的官网下载它的isp协议。了解了它的协议就能自己写单片机端的代码了。协议下载链接。这里不对这个协议进行细说,直接说明实现的代码,下图是原厂isp所支持的命令。
在这里插入图片描述
建立bootloader工程,打开一个新的带stm32标准库的keil工程,对工程进行如下配置。

  • 18
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
基于Ymodem协议的STM32串口IAP(In-Application Programming)的实现是通过串口通信的方式,实现在设备中对应用程序(APP)进行更新或升级。 在实现过程中,需要涉及三个主要组件:IAP、APP以及上位机IAP是指在设备中运行的固件,用于实现应用程序的更新。它需要能够接收上位机传输的数据,并将其写入设备的存储器中,以完成应用程序的更新。 APP是指设备中当前正在运行的应用程序,它需要检测到IAP的存在,并与上位机进行通信。APP需要具备与上位机进行数据交换的能力,并能够接收来自上位机的命令,以控制IAP的运行。 上位机是用于控制设备中IAP和APP的计算机。它通过串口与设备进行通信,并将应用程序的更新数据传输给设备。上位机需要发送命令给设备,控制设备中IAP和APP的运行,并在传输过程中与设备进行数据交换。 在实际操作中,上位机首先向设备发送一个请求,请求设备启动IAP模式。设备在接收到请求后,会进入IAP模式,并向上位机发送确认信息。之后,上位机会将待更新的应用程序数据通过串口传输给设备。设备会根据Ymodem协议对数据进行校验,并将数据写入存储器中。传输完成后,上位机与设备进行数据交换,以确认更新的完成情况。 总结来说,基于Ymodem协议的STM32串口IAP实现包括IAP、APP和上位机三个主要组件,通过串口通信实现应用程序的更新。以上是对该实现过程的简要描述。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值