用STM32F103C8T6的做IAP时,在跳转时一直进入HardFault_Handler 解决方法
首先是IAP
STM32F103C8T6的flash是64k,每次擦除是1k
1、用串口接收APP的bin文件数据,然后写入内部的FLASH
//appxaddr是要跳转的地址 设置是0x0800500
//appbuf是串口接收到的app的bin文件数据
//appsize是bin的大小
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
u8 page = 0;
u32 i =0;
u16 *p = (u16 *)appbuf;
page = FLASH_PagesMask(appsize);//得到要擦除的页数
printf("\r\n要擦除的数据页数:%d\r\n",page);
FLASH_Unlock();//解锁
for(i = 0;i < page; i++)
{
CPU_IntDis();//关中断
FLASH_ErasePage(appxaddr+i*Page_Size);//一次擦除1024字节
CPU_IntEn();//开中断
if(Flash_ReadHalfWord(appxaddr+i*Page_Size)!=0xffff)
{
printf("\r\n擦除出错.................\r\n");
}
}
for(i = 0;i < appsize;i=i+2)
{
FLASH_ProgramHalfWord(appxaddr + i,*p);//半字写入
if((Flash_ReadHalfWord(appxaddr +i) & 0xff)!=appbuf[i])//判断写入的是否正确
{
FLASH_Lock();
printf("\r\n写入错误\r\n");
return ;
}
p++;
}
FLASH_Lock();
}
上面是把接收到串口的数据写入flash,写入的数据是没有错误的,通过读flash和app的bin文件做了比较
2、下面是跳转函数
typedef void (*iapfun)(void); //定义一个函数类型的参数.
iapfun jump2app;
void iap_load_app(u32 appxaddr)//appxaddr是0x08005000
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
串口接收发送都是采用中断
每次在跳转的时候就会进入HardFault_Handler,不知道错在什么地方
app的设置如下
1、在魔法棒中设置app的起始地址为0x08005000
2、设置中断向量表SCB->VTOR = FLASH_BASE | 0x5000;
然后程序里面就是一个很简单的LED的闪烁,
每次在接收完成,把数据写入到flash之后再进行跳转就会进入HardFault_Handler,不知道那里有错,
这是之前我发的帖子
错误的原因是:我虽然设置了起始地址,但是没选择如下图,所以map里面的地址一直没改变,use memory哪里默认的不是勾选,应该把哪里勾选
这样我的问题就解决了 ,有空再把bootloader的整体给写出来,,,这里个错误找了我3天时间 ,,好浪费啊 希望可以帮助到其他人
这样map就可以看到起始地址的改变了
用STM32F103C8T6的做IAP时,在跳转时一直进入HardFault_Handler 解决方法相关推荐
- 使用nginx做反代时遇到413 Request Entity Too Large的解决方法
使用nginx做反代时遇到413 Request Entity Too Large的解决方法 参考文章: (1)使用nginx做反代时遇到413 Request Entity Too Large的解决 ...
- 打开一个网站会跳到另一个怎么办,解决方法是什么?
当我们在搜索引擎上搜索自已公司网站打开却看到其他网址,看到这种情况肯定让人头痛不已,那我们如何解决呢? 第一.不要责怪搜索引擎: 第二.查找自身网站问题,因为一般都是在网站被挂马的情况才会出现这样的情 ...
- DEDECMS后台无法登陆并跳转回登陆界面的解决方法
本文详细分析了DEDECMS后台无法登陆并跳转回登陆界面的解决方法.分享给大家供大家参考.具体方法如下: 一.问题: 网站已经运行了很久,前些天突然在登陆的时候提示密码不正确,而且不管怎么试,都是无法 ...
- xp系统提示rpc服务器不可用,XP更新系统时间时提示:RPC服务器不可用的解决方法...
今天小编由于工作的原因,更改了XP系统的系统时间,用完之后,我们这里需要将他更换回来,但是又不想要自己手动去输入,这个时候,我们选择"Internet 时间"中的立即更新,报了一个 ...
- 3d缺少html文件,3dmax打开时显示缺少外部文件的原因及解决方法
为什么每次打开3DMAX都显示缺少外部文件?在做3dmax模型贴图或者下载模型之后,经常会出现缺少外部文件的情况,这是怎么回事?遇到这一情况又该如何解决呢?接下来小编就给大家整理了用3dmax打开模型 ...
- linux红帽网页中文乱码解决,【linux学习笔记】安装redhat时中文显示乱码(小方框)解决方法...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 ------------------------------------- 防抽------------------------------------- ...
- 打包解决方案后,安装时提示只能在IIS5.1以上运行解决方法
打包解决方案后,安装时提示只能在IIS5.1以上运行解决方法 参考文章: (1)打包解决方案后,安装时提示只能在IIS5.1以上运行解决方法 (2)https://www.cnblogs.com/wp ...
- Linux安装软件时缺少依赖包的简单较完美解决方法!
Linux安装软件时缺少依赖包的简单较完美解决方法! 参考文章: (1)Linux安装软件时缺少依赖包的简单较完美解决方法! (2)https://www.cnblogs.com/xiaommvik/ ...
- oracle中“ORA-00060: 等待资源时检测到死锁” 或存储过程编译卡死 解决方法
oracle中"ORA-00060: 等待资源时检测到死锁" 或存储过程编译卡死 解决方法 参考文章: (1)oracle中"ORA-00060: 等待资源时检测到死锁& ...
- jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法
jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法 参考文章: (1)jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法 (2)https: ...
最新文章
- MVC之Model转Json
- 安卓html5桌面提醒,HTML5桌面通知提示功能的实现
- Python 入门 Day4
- 美国服务器百度抓取耗时不稳定,百度或者其他搜索引擎抓取频次快慢的因素,还会受什么有影响?...
- KMyMoney:全体理财好管家
- webpack:js、css、es6装载与压缩配置-学习笔记
- WCF 非http寄宿IIS
- 再论C++之垃圾回收(GC)
- 第二季-专题3-汇编语言得玩转
- BNU 鸣人的查克拉
- 泰迪杯数据挖掘挑战赛—机器学习(二)
- 1688接口:item_search - 按关键字搜索商品
- 像素画,治愈系超萌!看了这个,我都心痒了
- 微商潮牌怎么引流?成功的人不是赢在起跑点
- 利用Linux的crontab实现定时执行python任务
- 深圳垃圾分类告诉你这些都是什么垃圾 不仅要会分还要分的准确才行
- 智能优化算法之灰狼优化算法(GWO)的实现(Python附源码)
- oracle数据库导入dmp文件
- 别再说你不会,规则引擎Drools了
- 百度排名批量查询_一篇文章讲透百度霸屏引流细节思路与极其简单的操作玩法...
热门文章
- 【docker】docker run命令详解
- Redis集群:sharding策略
- jQuery面试题-区别mouseover和mouseenter的不同之处(看了也许对你有好处)
- rocm平台_痛击NV CUDA!AMD ROCm开放计算平台瓜熟蒂落
- 字典删除多个键值对方法_Life is short,you need Python——Python序列(元组、字典、集合)...
- 思科bfd静态路由切换_思科路由器曝出两个严重零日漏洞,已被野外利用
- 数据中心空调施工工序工艺管理要点
- 重新考虑数据中心的冷却方案—水冷却或将再次兴起
- java documentlistener_java在DocumentListener中更改文档
- Java:Java编程实现导出二维码