一、引出(IAP的原理和stm8上实现IAP的问题)

具有IAP功能的单片机,程序可以分为两部分:IAP和APP。APP是用来实现真正功能的程序,而IAP是用来远程重新编程APP的程序。单片机上电时会先执行IAP程序,在IAP中判断APP是否正常,然后再跳转到APP中执行。

这样就会有一个问题,那就是中断向量表的问题。当发生中断时,单片机会去中断向量表中查询中断服务函数的地址,然后才能按照地址跳转到中断服务函数去执行。中断向量表一般都在程序的开头,当把编译好的IAP下载到单片机里,单片机上电执行IAP程序,在执行IAP时发生中断,单片机就会到IAP的开头去查询中断服务函数地址,然后当从IAP跳转到APP后,开始执行APP程序,这个时候发生中断,单片机仍然会到IAP的开头去查询中断服务函数地址,这里就出现问题了。单片机在执行APP时,应该到APP的开头去查询中断服务函数地址才对。

因此需要某种方法通知单片机,当我们执行APP时,要在APP的开头去查询中断服务函数地址。在stm32单片机中,只需要在执行APP程序前加一句:

SCB->VTOR = FLASH_BASE | 0x4000;   //0x4000是APP的开始地址

因为stm32有地址偏移寄存器SCB->VTOR,当发生中断时,stm32会去SCB->VTOR读取中断向量表的地址。执行上面的语句后,发生中断时就会到FLASH_BASE | 0x4000地址去查询中断服务函数地址。

而stm8没有地址偏移寄存器,所以我们需要其他的办法来解决。中断向量表实际上就是:跳转指令+地址。当发生中断单片机会去执行中断向量表,也就是执行跳转指令,跳转到目标地址。明白了这个,那我们的方法也就出来了:改写IAP的中断向量表,把它的地址改为APP的中断向量表的地址。这样,当在APP中发生中断,单片机会跳转到IAP的开头去执行中断向量表,然后跳转到APP的中断向量表,最后才跳转到APP的中断服务函数。当然,这样一来IAP的中断就用不了了。

二、stm8的IAP

stm8的Flash是字节编程的,而且不需要先擦除再写,可以直接写。因此stm8的IAP处理流程为:进入IAP---解锁Flash---接收APP数据写Flash---改写IAP的中断向量表---Flash上锁----跳转到APP。

读函数、解锁、上锁、写函数为:

//读出一个32位数
uint32_t FLASH_Read(uint32_t Address)
{return(*(PointerAttr uint32_t *) (uint16_t)Address);
}//解锁Flash,在写Flash前,只需要在IAP中调用一次
void FLASH_Unlock(FLASH_MemType_TypeDef FLASH_MemType)
{FLASH->PUKR = FLASH_RASS_KEY1;FLASH->PUKR = FLASH_RASS_KEY2;
}//Flash上锁,写完Flash后,调用一次
void FLASH_Lock(FLASH_MemType_TypeDef FLASH_MemType)
{FLASH->IAPSR &= (uint8_t)FLASH_MemType;
}//往Flash中写入一个8位数
void FLASH_ProgramByte(uint32_t Address, uint8_t Data)
{*(PointerAttr uint8_t*) (uint16_t)Address = Data;
}//往Flash中写入一个32位数
void FLASH_ProgramWord(uint32_t Address, uint32_t Data)
{/* Enable Word Write Once */FLASH->CR2 |= FLASH_CR2_WPRG;FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NWPRG);/* Write one byte - from lowest address*/*((PointerAttr uint8_t*)(uint16_t)Address) = 0x00;*((PointerAttr uint8_t*)(uint16_t)Address) = *((uint8_t*)(&Data));/* Write one byte*/*(((PointerAttr uint8_t*)(uint16_t)Address) + 1) = 0x00;*(((PointerAttr uint8_t*)(uint16_t)Address) + 1) = *((uint8_t*)(&Data)+1); /* Write one byte*/    *(((PointerAttr uint8_t*)(uint16_t)Address) + 2) = 0x00;*(((PointerAttr uint8_t*)(uint16_t)Address) + 2) = *((uint8_t*)(&Data)+2); /* Write one byte - from higher address*/*(((PointerAttr uint8_t*)(uint16_t)Address) + 3) = 0x00;*(((PointerAttr uint8_t*)(uint16_t)Address) + 3) = *((uint8_t*)(&Data)+3);
}

改写IAP向量表的函数为:

//重新初始化STM8的中断向量表  把它重新定义到APP的中断向量中
void STM8_HanderIqr_Init(void)
{uint8_t Index;disableInterrupts();   //关闭中断    FLASH_Unlock(FLASH_MEMTYPE_PROG);for(Index = 1; Index < 32;Index++){FLASH_ProgramWord(0x8000+4*Index,0x82000000+APPLICATION_ADDRESS+Index*4);}FLASH_Lock(FLASH_MEMTYPE_PROG);
}

跳转到APP的函数为:

void JPMainProgram(void)
{//跳转至APPasm("LDW X,  SP ");asm("LD  A,  $FF");asm("LD  XL, A  ");asm("LDW SP, X  ");asm("JPF $9000");     //0x9000是APP的地址,根据自己的情况来改
}

最后:

stm8的Flash很小,建议使用寄存器操作,不要用库函数,否则不好控制代码大小。

IAR的SWIM仿真对于Memory的支持不是很好,当调用上面的函数改写Flash后,从Memory窗口上看可能并未改变,但实际上已经被改写了。(本人被坑了半天)

IAP的原理和stm8的IAP相关推荐

  1. Mybatis插件原理和PageHelper结合实战分页插件(七)

    今天和大家分享下mybatis的一个分页插件PageHelper,在讲解PageHelper之前我们需要先了解下mybatis的插件原理.PageHelper 的官方网站:https://github ...

  2. HBase学习指南之HBase原理和Shell使用

    HBase学习指南之HBase原理和Shell使用 参考资料: 1.https://www.cnblogs.com/nexiyi/p/hbase_shell.html,hbase shell 转载于: ...

  3. 单链表反转的原理和python代码实现

    链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...

  4. 计算机网络原理和OSI模型与TCP模型

    计算机网络原理和OSI模型与TCP模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.计算机网络的概述 1.计算机网络的定义 计算机网络是一组自治计算机的互连的集合 2.计算机 ...

  5. HTTPS原理和CA证书申请

    转载自:HTTPS原理和CA证书申请(满满的干货) 众所周知,WEB服务存在http和https两种通信方式,http默认采用80作为通讯端口,对于传输采用不加密的方式,https默认采用443,对于 ...

  6. class加载原理和Dex加载的原理-----android插件化技术

    2019独角兽企业重金招聘Python工程师标准>>> class加载原理和Dex加载的原理 转载于:https://my.oschina.net/quguangle/blog/15 ...

  7. 转载椭圆曲线原理和openssl命令操作

    原文地址:https://www.johannes-bauer.com/compsci/ecc/ 椭圆曲线原理和openssl命令操作

  8. mvc原理和mvc模式的优缺点

    mvc原理和mvc模式的优缺点 一.mvc原理    mvc是一种程序开发设计模式,它实现了显示模块与功能模块的分离.提高了程序的可维护性.可移植性.可扩展性与可重用性,降低了程序的开发难度.它主要分 ...

  9. 混合高斯模型原理和Lucas-Kanade方法介绍

    运动估计之混合高斯模型原理和Lucas-Kanade方法介绍 1. 简述混合高斯模型的基本原理,以及通过混合高斯模型进行背景建模的基本思想. 背景建模的思想:利用帧之间的像素变化来进行判断,像素灰度值 ...

最新文章

  1. 比JD-GUI还要好用的Luyten
  2. Onchain Capital创始人看涨BCH
  3. LINUX内核分析第八周总结:进程的切换和系统的一般执行过程
  4. 【转】 LINUX中IPTABLES和TC对端口的带宽限制 端口限速
  5. MongoDB安装和启动
  6. 第十二章 图形用户界面
  7. Suse 12 安装VMware tool
  8. 算法复习第五章贪心法
  9. 安装了虚拟机后mysql用不了_在虚拟机上安装mysql,安装好了并且初始化之后,一直无法启动mysql如何解决?...
  10. Nacos内核设计之一致性协议
  11. UI实用素材|扁平化UI设计模板,UI设计师都要会!
  12. [转]Kaldi语音识别
  13. 使用一个DataContext,还是多个?
  14. 手写bind_这些手写代码会了吗?少年
  15. 飘云阁内存补丁工具使用
  16. c51单片机蜂鸣器汇编语言,51单片机控制蜂鸣器播放5首歌曲汇编程序
  17. 英语基础语法(九)-被动语态
  18. 2021广东高考成绩排名如何查询,2021广东省地区高考成绩排名查询,广东省高考各高中成绩喜报榜单...
  19. Python数据挖掘-OneR算法简介
  20. 杂项-Mac关闭系统更新提示(macOS10.15.2可用)

热门文章

  1. python消找出img中的src标签_使用beautifulsoup从img标签获取src
  2. A Way Of Leader
  3. crc错误 modbus poll_Modbus通讯错误检测方法
  4. 智能音箱自己把自己黑了:随机购物拨号,自主开灯关门,平均成功率达88%
  5. 苹果智能车芯片已基本就绪!最新造车进展曝光,股价一夜暴涨4000亿
  6. 图形学大牛归国投身产业,还是个让女孩们败家的赛道
  7. 新型内存攻击,专治制程提高的芯片
  8. “金星生命论”乌龙事件新进展:那只是二氧化硫而已
  9. AI也能写高考作文?我们用清华刚刚开源的「九歌」试了试
  10. 最强通用编译器优化工具!MIT三篇顶会论文打造,准确率是传统方法5倍