基于STM32单片机BOOTLOADER通过串口升级程序IAP——APP方案

这篇具有很好参考价值的文章主要介绍了基于STM32单片机BOOTLOADER通过串口升级程序IAP——APP方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

                        此方法前提是你得有一个EEPROM

        我用的单片机是STM32F103ZET6 , 此单片机FLASH容量为512KB;

在此单片机里面FLASH的起始地址是0X8000000,BOOT作为引导加载程序一般都是从这个地址开始,单片机一上点默认会从这个地址开始运行,所以将自己的BOOT程序放在这个地址。

基于STM32单片机BOOTLOADER通过串口升级程序IAP——APP方案

         其实boot也是个程序,只是他的主要功能是处理升级包。

        我将FLASH分成三个块,第一块是BOOT区,第二块是程序缓存区,第三块是APP区

BOOT

                我的boot代码大概33KB左右,所以我预留了40KB作为BOOT区

CODE 

                这个区是代码缓存区,一共160KB,将串口接收到的代码先存放在这个位置,等全部接受完成了,再把code区的代码移到APP区,然后跳转到APP就算完成bootloader

APP

                这一块是我的主要代码运行区,我预留了312KB

程序运行逻辑

BOOT启动-----》读取EEPROM,判断有没有更新: 

如果有---》将CODE区的代码移到APP区,然后跳转到APP区;

 如果没有-----》等待一段时间,如果接收到新的升级包,先把数据存放到CODE区,等全部接受完成了移到APP区。如果没有接收到升级包,直接跳转到APP

APP启动--------》等待接受升级包,如果接收到升级包,重启单片机,回到BOOT

BOOT程序里判断EEPROM状态代码

这个放在main函数里。运行此段之前先初始化串口和EEPROM

    
    uint32_t readAddr ; 	//程序缓存区地址
	uint32_t app_wrinte_addr; 	//APP启动地址
	uint32_t app_size;		//升级包大小
	uint8_t  read_write_buf[1200];
    uint8_t  BOOTloader_ST=0;
    //检查EEPROM
	if(AT24CXX_Check()==0)//检查器件EEPROM已经初始化
	{	
		USART3_Send_Str("------------------------------------------------------\r\n");	
		USART3_Send_Str("---------BOOTLOADER程序正在运行正常--------------------\r\n");	

		
		USART3_Send_Str("EEPROM硬件正常\r\n");		

		//初始化bootloader状态	
		BOOTloader_ST = AT24CXX_ReadOneByte(999);//升级标志位在最后面 
		
		switch(BOOTloader_ST)
			{
				//无需升级
			case 0XA0:	//等待10个心跳时间后如果还是没有收到升级包跳转APP
				//直接跳过
				USART3_Send_Str(" 等待接受升级程序\r\n");
			  //  iap_load_app(0X8032000);

				break;
				//准备升级
			case 0XA1:	//擦除FLASH,准备接受	
				AT24CXX_WriteOneByte(999,0XA0);		//初始化时等于0XA1说明接受失败
				USART3_Send_Str("准备升级--升级失败--等待接受升级程序\r\n");	
				break;
				//正在接受数据
			case 0XA2:	//等待接受完成,超时跳转APP
				AT24CXX_WriteOneByte(999,0XA0);		//初始化时等于0XA2说明接受失败
				USART3_Send_Str("接受中断--升级失败--等待接受升级程序\r\n");	
				break;
				//等待升级命令
			case 0XA3:	//等待开始升级命令
				AT24CXX_WriteOneByte(999,0XA0);	   //初始化时等于0XA3说明接受失败
				USART3_Send_Str("接受完成---等待接受升级命令\r\n");	
				break;
				//接受失败
			case 0XA4:	
				AT24CXX_WriteOneByte(999,0XA0);	   //初始化时等于0XA4说明接受失败
				BOOTloader_ST	= 0XA0;
				USART3_Send_Str("---接受中断--升级失败--等待接受升级程序-----\r\n");
				break;
			//开始升级
			case 0XA5:	//擦除APP区,缓存的升级包移到APP区,跳转到APP区
				AT24CXX_WriteOneByte(999,0XA6);		//升级
				USART3_Send_Str("---------接受完成---开始升级----------\r\n");

				app_size = (AT24CXX_ReadOneByte(1000)<<24) | (AT24CXX_ReadOneByte(1001)<<16)| (AT24CXX_ReadOneByte(1002)<<8)  |AT24CXX_ReadOneByte(1003);
				
				app_wrinte_addr = 0X8032000;	//APP地址
				readAddr  = 0X800A000;	//代码缓存区地址

				while (app_size> 0)
					{
						if (app_size>=1024)
						{
				            System_ReadInteriorFlash (readAddr, read_write_buf, 1024) ;	
				            System_WriteInteriorFlash(app_wrinte_addr,read_write_buf, 1024);
							readAddr+=1024;
							app_size-=1024;
							app_wrinte_addr+= 1024;	//写入地址增加
						}	
						else 
						{
	                        System_ReadInteriorFlash (readAddr, read_write_buf,app_size);	                                                          
                   
      System_WriteInteriorFlash(app_wrinte_addr,read_write_buf,app_size);
							readAddr+=app_size;
							app_size-=app_size;
							app_wrinte_addr+= 1024;	//写入地址增加
								
						}
					}	

				USART3_Send_Str("--------------即将跳转APP----------\r\n");

				iap_load_app(0X8032000);	//跳转到APP

				
				break;
			//升级成功,无需
			case 0XA6:	//回到无需升级
				USART3_Send_Str("--------------升级成功-----------\r\n");
				AT24CXX_WriteOneByte(999,0XA0);	//等待新更新
				break;
			
			default :	//可能是第一次上电,默认回到0XA0状态
				AT24CXX_WriteOneByte(999,0XA0);
				break;
			}
	}

在串口接受协议里面运行的代码文章来源地址https://www.toymoban.com/news/detail-444805.html

                     //下面这个几个变量是全局变量,不能用局部变量
                     framne_all = uart485buff[6]<<8 | uart485buff[7];	//包总数
					 frame_num  = uart485buff[8]<<8 | uart485buff[9];	//包序号
					 writesize  = uart485buff[10]<<8 | uart485buff[11];	//数据大小
					 
					 if(frame_num==0)	//第一包
						{					
							writeaddr = 0x800A000;
							AT24CXX_WriteOneByte(999,0XA2);		//正在接受数据
                            System_WriteInteriorFlash(writeaddr, &uart485buff[12] , writesize) ;	//写入到内部FLASH
							writeaddr += writesize;
						}
					else if(frame_num == (framne_all-1))	//最后一包
						{
							BOOTloader_ST = 0XA5;
							AT24CXX_WriteOneByte(999,0XA5);	//开始升级
							System_WriteInteriorFlash(writeaddr, &uart485buff[12] , writesize) ;	//写入到内部FLASH
							writeaddr += writesize;
							
							AT24CXX_WriteOneByte(999,0XA5);	//开始升级
							USART3_Send_Str("\r\n");
							USART3_Send_Str("---升级包全部接受完成--即将重启--\r\n");
							writeaddr-=0x800A000;
							AT24CXX_WriteOneByte(1000,((u8)(writeaddr>>24)&0xFF));
							AT24CXX_WriteOneByte(1001,((u8)(writeaddr>>16)&0xFF));
							AT24CXX_WriteOneByte(1002,((u8)(writeaddr>>8)&0xFF));
							AT24CXX_WriteOneByte(1003,((u8)(writeaddr)&0xFF));

							
							reboot();    //重启或者跳转到0X8000000地址

						}	
					else 
						{
	                       System_WriteInteriorFlash(writeaddr,&uart485buff[12] , writesize) ;	//写入到内部FLASH
							writeaddr += writesize;
							
						}

到了这里,关于基于STM32单片机BOOTLOADER通过串口升级程序IAP——APP方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M HX711称重模块 STC89C52RC驱动HX711称重模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M HX711称重模块 STM32F103C8T6驱动HX711称重模块参数 串口与OLED0.96双显示 其他资料目录 直戳跳转 HX711参数 1.两路可选择差分输入

    2023年04月27日
    浏览(68)
  • K_A12_033 基于STM32等单片机驱动TCS34725颜色传感 串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M TCS34725颜色传感 模块 STC89C52RC驱动TCS34725颜色传感模块串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M TCS34725颜色传感模块 STM32F103C8T6驱动TCS34725颜色传感模块串口与OLED0.96双显示 其他资料目录 直戳跳转 工作电压:

    2024年02月06日
    浏览(51)
  • K_A16_003 基于STM32等单片机采集薄膜压力传感器参数串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STM32F103C8T6 晶振8M/系统时钟72M 薄膜压力传感器模块 STM32F103C8T6驱动薄膜压力传感器模块 串口与OLED0.96双显示 其他资料目录 直戳跳转 厚度 :0.4mm 样式 :薄片状,柔性 触发力 :20g,默认电阻值小于 200kΩ 时触发 压力感应范围 :20g~6kg

    2024年02月05日
    浏览(51)
  • K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M MQ2传感模块 STC89C52RC采集MQ2传感模块参数 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M MQ2传感模块 STM32F103C8T6采集MQ2传感模块参数 串口与OLED0.96双显示 其他资料目录 直戳跳转 可以用于家庭和工厂的气体泄漏监

    2024年02月01日
    浏览(88)
  • K_A37_005 基于STM32等单片机驱动ADS1115 ADC模块 串口与OLED0.96双显示

    其他资料目录 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M ADS1115 ADC模块 STC89C52RC驱动ADS1115 ADC模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M ADS1115 ADC模块 STM32F103C8T6驱动ADS1115 ADC模块 串口与OLED0.96双显示 ADS1115 ADC模块 引脚说明 VIN 正极 5V供电

    2024年02月16日
    浏览(57)
  • STM32单片机(九)USART串口----第一节:USART串口协议

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月16日
    浏览(73)
  • K_A18_008 基于STM32等单片机驱动SGP30气体传感器串口与OLED0.96双显示

    其他资料目录 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M SGP30气体传感器 模块 STC89C52RC驱动SGP30气体传感器模块串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M SGP30气体传感器模块 STM32F103C8T6驱动SGP30气体传感器模块串口与OLED0.96双显示 SGP30气体传

    2024年02月04日
    浏览(56)
  • STM32单片机(九)USART串口----第三节:USART串口实战练习(串口发送)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(59)
  • K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示

    注:偏差校准步骤(均十六进制发送) 1、偏差校准命令 A5 21 0A D0(此处是在10CM处校准) 2、加载数据命令 A5 43 04 EC(断电重启后加载偏差补偿) 3、保存设置命令 A5 87 01 2D(保存设置后生效) 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M VL53L0X模块 STC89C52RC驱动VL53L0X模

    2024年02月13日
    浏览(38)
  • K_A35_017 基于STM32等单片机驱动TTP229矩阵触摸传感器 串口与OLED0.96双显示

    其他资料目录 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M TTP229矩阵触摸模块 STC89C52RC驱动TTP229矩阵触摸模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M TTP229矩阵触摸模块 STM32F103C8T6驱动TTP229矩阵触摸模块 串口与OLED0.96双显示 TTP229矩阵触摸传

    2024年02月02日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包