IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 关于STM32之IAP与APP互跳转重点 -> 正文阅读

[嵌入式]关于STM32之IAP与APP互跳转重点

大家会很好奇IAP和APP是如何实现跳转的,如果你是需要完成这个任务的话,肯定已经了解了不少的知识,我就不重复别人的博客进行分析了,话不多说,直接来吧。
首先,如果你是使用IAR软件的话,你一定要去看看自己生成的.map文件是否有Reset_Handle这个地址,我在我现有的IAR里面是生成不出来的,可以在工程文件夹里面直接搜索.map文件进行查看,所以,下面我都是使用KEIL进行测试。
这个就是KEIL生成出来的这个复位中断地址,简单说一下这个就是跳转的中断,不要好奇,因为这个只要在APP文件中设置正确,自动会续寻找到这个地址。在这里插入图片描述
1.设置IAP,我使用的是STM32F103VET6,我想应该大概STM32Fx系列的都是一样的吧,哈哈哈哈,我猜的。还有一些.bin文件的生成我就不在这里多说了,去参考一下别人的,都一大堆。
在这里插入图片描述
2.记住,如果要实现跳转,一定要在IAP和APP两个程序都打开总中断,在跳转IAP或者APP前都要关闭总中断,下面会说到跳转到IAP的。我这里的Uart_Recevid是我使用串口通讯来进行通讯这里是发送0x77跳到APP程序,那边是发送0x88跳到IAP程序(如果使用串口的话,一定要两个程序的串口都要配置正确,不然收不到指令也不会运行)

3.对于网上你们也搜索到一些差不多的东西,当然我的也一样,不要问为什么,直接用就行,都是OK的,如果要去专研,可以去看看STM32内存存储的一些问题。我这里的注释都是乱码,算了,去别的地方也可以看到的啦。

void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
	u16 t;
	u16 i=0;
	u16 temp;
	u32 fwaddr=appxaddr;
	u8 *dfu=appbuf;
	for(t=0;t<appsize;t+=2)
	{						    
		temp=(u16)dfu[1]<<8;
		temp+=(u16)dfu[0];	  
		dfu+=2;
		iapbuf[i++]=temp;	    
		if(i==1024)
		{
			i=0;
			STMFLASH_Write(fwaddr,iapbuf,1024);	
			fwaddr+=2048;//??ò?2048  16=2*8.?ùò?òa3?ò?2.
		}
	}
	if(i)STMFLASH_Write(fwaddr,iapbuf,i);//??×?oóμ?ò?D??úèY×??úD′??è¥.  
}

void iap_load_app(u32 appxaddr)
{
	if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)	//?ì2é???¥μ??·ê?·?o?·¨.
	{ 
		jump2app=(iapfun)*(vu32*)(appxaddr+4);		//ó??§′ú????μú?t??×??a3ìDò?aê?μ??·(?′??μ??·)		
		MSR_MSP(*(vu32*)appxaddr);					//3?ê??ˉAPP????????(ó??§′ú????μ?μúò???×?ó?óú′?·????¥μ??·)
		jump2app();									//ì?×aμ?APP.
	}
}		

到这里 IAP程序已经搞定了,下面说说APP的配置。
4.APP的配置,重点是要配置对.bin文件哦,因为这个是要生成bin文件的,配置不对是跳不进去的。
在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/0cd270a9df414bb984106ae4b2cea8b9.png)
6.之后进入循环呗:
![在这里插入图片描述](https://img-blog.csdnimg.cn/cf0fcb97f1554a2999c1ec0224f46079.png)

7.注意这个跳到IAP的函数内容会不同,仔细看看哦

```c
void app_load_iap(void)
{
       int a  = 0;
	u32 JumpAddress;
	iapfun JumpToBootload;                  

	if (((*(__IO uint32_t*)STM32_FLASH_BASE) & 0x2FFE0000) == 0x20000000)  
	{             
      
		/*Jump to user application*/
		JumpAddress = *(__IO u32*)(STM32_FLASH_BASE+4);
		JumpToBootload  = (iapfun)JumpAddress;
		/*Initialize user application's Stack pointer*/
		__set_MSP(*(__IO u32*)STM32_FLASH_BASE);
    __disable_irq();  
		JumpToBootload();
	}
}

8.基本就配置完成啦。另外补充一下吧,调试过程的这个JumpAddress一定对应的是你要跳转的那个工程文件的复位中断地址Reset_Handle,可以自己去尝试一下。记得去map文件寻找能不能找到这个复位中断,如果生成不了,是解决不了问题的。
如果这个
9.有一个简单的办法,就是清除掉Flash后,可以先download APP程序,你会发现没有现象,然后再去写入IAP程序,就会自动跳转到APP程序啦。亲测可以正确使用的,还有一个重点,测试文件都不可以很大,不允许超过芯片RAM的大小,尽量大家用超级简单的点灯或者亮屏来测试,不然你都不会发现是什么原因跑不过去,避开这些坑,你一定行。

10.对于太大的bin文件,已经超过了RAM储存的容量,比如有300KB,而芯片的RAM只有64KB,你必须要采用分包的方式去处理,就相当于将300KB的东西打包成10个30KB的进行写入,如果你们想看的话,之后可以一起探讨一下呗


  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 13:19:13  更:2021-09-12 13:20:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 0:21:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码