一、IAP原理及过程

《正点原子--STM32F10x串口IAP实验》

《stm32f030 IAP》

《STM32F051 IAP源码分享》

二、遇到的问题

1、中断向量表的充定向问题

(1)与M3核的单片机由区别

1)、STM32F0系列没有void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)这个函数,所以不能像其他系列的那样设置中断向量表;

2)、M0核中需要把APP部分中的中断向量表重定向到SRAM中(在M3中一般是重定向在flash中);

在M3内核中可以通过操作VTOR寄存器来重映射中断向量表
SCB->VTOR = FLASH_BASE | 0x10000;
/* Vector Table Relocation in Internal FLASH. */

在M0内核中需要
memcpy((void*)0x20000000, (void*)IAP_ADDR, 0xB4);
__HAL_SYSCFG_REMAPMEMORY_SRAM();
其中,0x2000 0000是SRAM的起始地址,这个不需要改动。
而之后的两个参数需要根据实际情况作出修改。IAP_ADDR是应用程序的起址地址,从这里开始的VECTOR_SIZE字节,存放是的应用程序的中断向量表。VECTOR_SIZE是指中断向量表的大小,具体多大可以在startup.s文件里计算得到。

3)、跳转

4)、几种中断向量表重定向的方法

  A: memcpy((void*)0x20000000, (void*)IAP_ADDR, 0xB4);

  B:

void InterruptRemap(void)
{uint8_t   i;u32_t  Data;u32_t  Address;for(i=1;i<48;i++){Data =  *(__IO uint32_t *)(0x08003000+i*4);Address = 0x20000000 + (i*4);*(__IO uint32_t *)Address= (uint32_t )Data;}__HAL_SYSCFG_REMAPMEMORY_SRAM();
}

三、FLASH和SRAM的配置

1、BootLoader部分

2、app部分

ROM的设定值要与程序中分配的空间地址对应,例如程序中的地址分配如下:

/*< Bootloader address base. 12KB>*/
/* bootloader: 12KB 0x08000000--0x08003000  */
#define             BOOTLOADER_ADDR_BASE                   0x08000000  /*< APP address base. 24KB >*/
/* 0x08003000--0x08009000 */
#define             APP_START_ADDR                          0x08003000  /*< Parameter address base. 2KB. >*/
#define             PARAM_ADDR_BASE                         0x08009000
#define             UPDATE_FLAG_L8_ADDR                     (PARAM_ADDR_BASE+0)
#define             UPDATE_FLAG_H8_ADDR                     (PARAM_ADDR_BASE+1)
#define             APP_SIZE_L8_ADDR                        (PARAM_ADDR_BASE+2)
#define             APP_SIZE_M1_ADDR                        (PARAM_ADDR_BASE+3)
#define             APP_SIZE_M2_ADDR                        (PARAM_ADDR_BASE+4)
#define             APP_SIZE_H8_ADDR                        (PARAM_ADDR_BASE+5)
#define             APP_CRC_L8_ADDR                         (PARAM_ADDR_BASE+6)
#define             APP_CRC_H8_ADDR                         (PARAM_ADDR_BASE+7)    /*< APP TEMP address base. 24KB  >*/
#define             APP_TEMP_START_ADDR                     0x08009800  /*< Deserve address base. 2KB  >*/
#define             DESERVE_ADDR_START                      0x0800F800 

设定APP部分的SRAM,要注意剩余长度的计算,剩余长度=SRAM总长度 - 中断向量表所用长度 - 1:

四、待解决的问题

发现flash不能字读取(或是要字节对齐,起始地址要是4的倍数),这个问题还没有找到原因,可能是我字读取函数写的有问题。

    /* Get the new app size. *///newAPPSize = hal_flash_read_word(APP_SIZE_L8_ADDR);//直接读取字,不成功newAPPSizeL = hal_flash_read_half_word(APP_SIZE_L8_ADDR);newAPPSizeH = hal_flash_read_half_word(APP_SIZE_M2_ADDR);newAPPSize = (newAPPSizeH<<16) | newAPPSizeL;u32_t hal_flash_read_word(u32_t addr){return *(__IO u32_t *)addr;} 

STM32--STM32F051 IAP的实现相关推荐

  1. 关于STM32的IAP与APP互相跳转

    关于STM32的IAP与APP互相跳转 之前做了一个不带系统的IAP与APP互相跳转,在网上找了资料后,很顺畅就完成了,后来在IAR集成开发环境下,IAP无系统,APP用UCOS系统做互相跳转出现了很 ...

  2. STM32应用IAP进行程序更新详解及实例

      这是以前就想写的一个小专题关于IAP,以及IAP在STM32编程的应用,专题分三小节,主要介绍常见的单片机烧录方式,IAP的实际应用,以及Ymodem协议在IAP编程中应用,在笔记吃灰很久了,终于 ...

  3. 关于STM32单片机IAP升级中if(((*(__IO uint32_t*)ulAddr_App) 0x2FFE0000) == 0x20000000)语句的理解

    没有标题 初见if(((*(__IO uint32_t*)ulAddr_App) & 0x2FFE0000) == 0x20000000) 语句理解 语句功能 为什么ulAddr_App里存的 ...

  4. 基于STM32的IAP升级程序

    基于STM32的IAP升级程序 IAP介绍 功能设计 硬件设计 软件设计 软件设计流程如下 完整程序 具体实现 设计功能程序 IAP实现程序 主程序 后续 IAP介绍 IAP(In Applicati ...

  5. STM32实现IAP功能之一

    最近因项目需求要实现STM32的在线升级即IAP功能,先将这几天的学习体会和IAP的具体实现总结出来,分享给大家,希望对同样实现IAP的童鞋有所帮助,文中最后会上传名为STM32_Update.zip ...

  6. STM32开发 -- IAP详解

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/87978183 现在只是简单的预研知道有这个功能,怎么实现我真的没做过... ...

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

    开发环境:Window 7 开发工具:Keil uVision4 硬件:stm32f103c8t6 篇幅略长,前面文字很多,主要是希望能让小白们理解,后面就是实现步骤,包括实现的代码. 在研发调试的时 ...

  8. STM32单片机IAP介绍

    1.什么是IAP? 首先区分下两个概念:ISP和IAP: ISP:In System Programming (在系统中编程),通过芯片专用的串行编程接口对其内部的程序存储器进行擦写. IAP:In ...

  9. STM32芯片IAP升级机制详解

    一.先了解ICP和ISP.IAP之间的区别: 1. ISP(In System Programing 在系统编程)的实现相对要简单一些,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写. ...

  10. stm32实现iap远程固件更新

    文章目录 #前提 想来做iap升级了,应该不是什么新手. 下面的程序需要用到一些简单的功能 串口收发数据 开关总中断 虽然本文标题是实现远程固件更新,但是具体远程方案本文不做详细说明,重点在于介绍mc ...

最新文章

  1. 正则化方法之DropBlock
  2. 有没有python与机械结合的工作-用 Python 自动化办公,我与大神之间的差距一下就...
  3. ETHREAD APC 《寒江独钓》内核学习笔记(4)
  4. Tosca :配置环境参数
  5. 如何在Ubuntu 18.04上安装OpenCV
  6. Xgboost和lightgbm的区别
  7. 学前教育试题库及答案_学前教育学考试试题及答案
  8. 从宏杉合作伙伴大会看本土存储厂商的“逆袭”
  9. 蔚来、小鹏、理想自动驾驶能力的纵向演进与横向比较
  10. 11、安全网络架构和保护网络组件
  11. 「程序员值得一看」| 传说中的“全球公认最健康的作息时间表”
  12. 渲染性能优化之Culling 剔除
  13. 【JZOJ100208】【20190705】传说之下
  14. 高并发、高性能、高可用
  15. IE6中float元素双倍margin问题
  16. 大数据计算系统 Blink 在端侧的应用实践
  17. python 股票库_GitHub - zxyxz/stock: stock,股票系统。使用python进行开发。
  18. python分发扑克牌_python实现扑克牌交互式界面发牌程序
  19. 国家公务员录用考试的一般流程
  20. javascript写算法(一) 动态规划:最长公共子序列

热门文章

  1. Vue2.0学习总结
  2. mysql基础1 -------- DDL、DML、DQL、DCL
  3. 小米7.0 android 图片裁剪失败,Android 7.0适配 -- FileProvider 拍照、选择相册、裁切图片, 小米机型适配...
  4. NPDP产品经理小知识-跨职能团队和矩阵结构
  5. 全面解析各类营养物质在炎症中的作用
  6. Excel 多列变一列(亲自实践)
  7. 将200到300之间所有可以被3和7整除的数
  8. std::tr1::shared_ptr点滴记录
  9. java程序员等级一览:
  10. 【安全】你的电脑需要杀毒软件吗?