在STM8L上实现IAP(In Application Programming)

发布者:WiseSage123最新更新时间:2018-06-01 来源: eefocus关键字:STM8L  IAP 手机看文章 扫描二维码
随时随地手机看文章

1.实现将Boot和App下载到FLASH的不同地址上,我们需要对链接脚本进行配置
IAR默认的链接脚本在安装目录下
C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\config
找到对应芯片打开后可以看到的这样的字样:


  1. /////////////////////////////////////////////////////////////////  

  2. //      Example ILINK command file for  

  3. //      STM8 IAR C/C++ Compiler and Assembler.  

  4. //  

  5. //      Copyright 2014 IAR Systems AB.  

  6. //  

  7. /////////////////////////////////////////////////////////////////  

  8.   

  9.   

  10. define memory with size = 16M;  

  11.   

  12.   

  13. define region TinyData = [from 0x00 to 0xFF];  

  14.   

  15.   

  16. define region NearData = [from 0x0000 to 0x0FFF];  

  17.   

  18.   

  19. define region Eeprom = [from 0x1000 to 0x10FF];  

  20.   

  21.   

  22. define region BootROM = [from 0x6000 to 0x67FF];  

  23.   

  24.   

  25. define region NearFuncCode = [from 0x8000 to 0xFFFF];  

  26.   

  27.   

  28. define region FarFuncCode = [from 0x8000 to 0xFFFF]  

  29.                           | [from 0x10000 to 0x17FFF];  

  30.   

  31.   

  32. define region HugeFuncCode = [from 0x8000 to 0x17FFF];  


这里定义了不同区域对应的地址,先将该文件拷贝到工程目录下,我们要对其做相应的修改,
我规划Boot的大小为5k,所以将三个FuncCode的范围改为如下:


  1. define region NearFuncCode = [from 0x8000 to 0x93FF];  

  2. define region FarFuncCode = [from 0x8000 to 0x93FF];  

  3. define region HugeFuncCode = [from 0x8000 to 0x93FF];  

相应的app的链接脚本我们也做了如下的修改:


  1. define region NearFuncCode = [from 0x9400 to 0xFFFF];  

  2. define region FarFuncCode = [from 0x9400 to 0xFFFF]  

  3.                           | [from 0x10000 to 0x17FFF];  

  4. define region HugeFuncCode = [from 0x9400 to 0x17FFF];  

最后我们对配置进行修改,右击工程->Options->Linker->Config->Linker configuration file->选中Override define,
并将链接脚本路径改为工程目录下:$PROJ_DIR$\lnkstm8l052r8.icf
至此Boot和App地址空间划分完毕


2.中断向量表的配置
在stm32中,有一个寄存器保存着中断向量表的起始地址,所以在Boot和App中可以有两个中断向量表,
当从Boot跳转到App时只需要设置一下这个寄存器里的值就行了。
但是STM8l的中断向量位置是固定的,从0x8000处开始。
当中断发生时都是跳转到0x8000开始的中断向量表。那么问题就来了,如果App中发生中断,要是跳到Boot中去了,
那不就GG了,所以我们要对Boot的中断向量表进行修改:


  1. /**************************************************  

  2.  *  

  3.  * System initialization code for the STM8 IAR Compiler.  

  4.  *  

  5.  * Copyright 2010 IAR Systems AB.  

  6.  *  

  7.  * $Revision: 1413 $  

  8.  *  

  9.  ***************************************************  

  10.  *  

  11.  * To add your own interrupt handler to the table,  

  12.  * give it the label _interrupt_N, where N is the  

  13.  * offset from the RESET vector.  Your label will  

  14.  * override the corresponding weak label declaration  

  15.  * on the unhandled_exception function.  

  16.  *  

  17.  **************************************************/  

  18.   

  19.   

  20.         MODULE   ?interrupt  

  21.   

  22.   

  23.         SECTION __DEFAULT_CODE_SECTION__:CODE  

  24.   

  25.   

  26. /*  

  27.  * The interrupt vector table.  

  28.  */  

  29.   

  30.   

  31.   

  32.   

  33.         SECTION `.intvec`:CONST  

  34.   

  35.   

  36.   

  37.   

  38.         PUBLIC  __intvec  

  39.         EXTERN  __iar_program_start  

  40.           

  41.   

  42.   

  43.         //app start at 0x9000  

  44. __intvec:  

  45.         DC8     0x82  

  46.         DC24    __iar_program_start          ;; RESET    0x8000  

  47.         DC8     0x82  

  48.         DC24    0x9404  

  49.         DC8     0x82  

  50.         DC24    0x9408  

  51.         DC8     0x82  

  52.         DC24    0x940C  

  53.         DC8     0x82  

  54.         DC24    0x9410  

  55.         DC8     0x82  

  56.         DC24    0x9414  

  57.         DC8     0x82  

  58.         DC24    0x9418  

  59.         DC8     0x82  

  60.         DC24    0x941C  

  61.         DC8     0x82  

  62.         DC24    0x9420  

  63.         DC8     0x82  

  64.         DC24    0x9424  

  65.         DC8     0x82  

  66.         DC24    0x9428  

  67.         DC8     0x82  

  68.         DC24    0x942C  

  69.         DC8     0x82  

  70.         DC24    0x9430  

  71.         DC8     0x82  

  72.         DC24    0x9434  

  73.         DC8     0x82  

  74.         DC24    0x9438  

  75.         DC8     0x82  

  76.         DC24    0x943C  

  77.         DC8     0x82  

  78.         DC24    0x9440  

  79.         DC8     0x82  

  80.         DC24    0x9444  

  81.         DC8     0x82  

  82.         DC24    0x9448  

  83.         DC8     0x82  

  84.         DC24    0x944C  

  85.         DC8     0x82  

  86.         DC24    0x9450  

  87.         DC8     0x82  

  88.         DC24    0x9454  

  89.         DC8     0x82  

  90.         DC24    0x9458  

  91.         DC8     0x82  

  92.         DC24    0x945C  

  93.         DC8     0x82  

  94.         DC24    0x9460  

  95.         DC8     0x82  

  96.         DC24    0x9464  

  97.         DC8     0x82  

  98.         DC24    0x9468  

  99.         DC8     0x82  

  100.         DC24    0x946C  

  101.         DC8     0x82  

  102.         DC24    0x9470  

  103.         DC8     0x82  

  104.         DC24    0x9474  

  105.         DC8     0x82  

  106.         DC24    0x9478  

  107.         DC8     0x82  

  108.         DC24    0x947C  

  109.   

  110.   

  111.         END  


个人理解DCn是开辟一个n bit的汇编指令吧。0x82 为操作码,意思是跳转到后面的地址去执行。
0x94XX表示一个地址,我们会将这个地址里的数据赋值给PC指针。
那么这个中断向量表的意思就是,除了Reset,其他的中断发生时,都跳转到App的中断向量表去执行。
这么做的后果就是,Boot中不能使用中断了。不然就跳转到App中去执行了。
那有的同学头就很铁,我偏要两个地方都是用中断呢?
还真有办法,前面的流程都一样,但是用一个全局变量来表示当前程序是在在哪里运行的,
然后在中断函数里根据这个全局变量来选择执行哪段程序。大致思路就这样,具体没有去实现过。
这里还要说一句:既然写Boot就好好写一个功能专一点的Boot,干嘛非要用中断。这种花里胡哨的搞来搞去,没有用的!


3.执行Boot到App的跳转
比较常用的跳转方法有两种,在C语言里,我们一般使用函数指针的方式,还有一种就是使用汇编直接改变PC指针的值。
stm8l中用的是第二种:


  1. asm("LDW X,  SP ");  

  2. asm("LD  A,  $FF");  

  3. asm("LD  XL, A  ");  

  4. asm("LDW SP, X  ");  

  5. asm("JPF $9400");  


我只知道这些是C语言内嵌汇编的写法,对于stm8l的架构是一无所知,大概就是设置了堆栈,然后跳转吧$9400就是App的起始地址。


关键字:STM8L  IAP 引用地址:在STM8L上实现IAP(In Application Programming)

上一篇:STM8S与IAR程序常用错误
下一篇:STM32F02R8T6Nuceo板子Uart2串口问题

推荐阅读最新更新时间:2024-03-16 16:04

STM32 IAP相关知识
最近因项目需求要实现STM32的在线升级即IAP功能,先将这几天的学习体会和IAP的具体实现总结出来,分享给大家,希望对同样实现IAP的童鞋有所帮助,文中最后会上传名为STM32_Update.zip的压缩文件里面包含了STM32_App、STM32_MyBoot_V1.0和升级软件STM32_UpdateSoftware的源码文件供大家参考。所有程序都经过测试,可以直接在原子哥的 开发板 上跑,上位机的升级软件大家可以直接打开 STM32_UpdateSTM32_UpdateSoftwareReleaseSTM32_UpdateSoftware.exe来升级,如果需要查看源码请用VS2010打开工程文件。 最终要实现的是: 单片
[单片机]
STM32 <font color='red'>IAP</font>相关知识
关于STM32 IAP
IAP程序的功能 再看自己的用户程序--用户程序自己也做了些设置 对了关于我为什么拷贝到Flash里面------自己用的单片机的RAM不够用,存不了用户程序,所以自己就定义了一个小点的数组(环形队列),串口一边接收,一边往Flash里面写,环形队列可是帮了大忙了,,,, 把IAP升级程序下进去,以后就直接通过串口发送自己的用户程序就行了...什么都不需要做了,先说一下操作过程吧!最后有自己的源码 IAP程序软件不需要任何配置 波特率太快的话,数据来不及写入Flash,环形队列容易溢出,,太慢的话,程序发送的慢。。。 用户程序软件需要一些配置 8006000告诉编译器我的用户程序打算在这里开始,你帮我设置一下吧,默
[单片机]
STM32F030的IAP应用简介
程序收尾总想着以后更新的方便性,采用在应用编程(In Application Programming),通过Bootload引导单片机自己往程序存储器里写数据或修改程序。下面简介STM32F030的IAP方法。不同于STM32F1系列,F0没有中断向量偏移寄存器。所以在APP程序的开头要添加以下代码。为什么这样做?? 可以看到函数用了for循环将矢量表拷贝到0 x20000000 SRAM的基地址,即将矢量表由Flash映射到了SRAM。所以在MDK里面设置Flash偏移地址的时候,同时要设置SRAM偏移地址。如下截图 //APP程序开头加入IAP_Set(void)函数 //Falsh address #defin
[单片机]
STM8的IAP在线升级
IAP(In Application Program)在线应用编程 官方资料(STVD开发环境):例程AN2659, 《 AN2659 Application Note.pdf 》 要实现在线升级,MCU代码须分为 : bootloader和 用户代码App 两个部分。 图1.STM8下IAP程序的存储方式 用户启动区域(UBC): (可理解为用户自定义的bootloader的存放区域) 包含有复位和中断向量表,它可用于存储IAP及通讯程序。UBC有一个两级保护结构可保护用户代码及数据在IAP编程中免于无意的擦除或修改。这意味着该区域总是写保护的,而且写保护不能通过使用MASS密钥来解锁。它的大小可通过配置
[单片机]
STM8的<font color='red'>IAP</font>在线升级
STM8L读写EEPROM(24LC64)
使用24LC64(24XX64)是低功耗应用的EEPROM,存储容量 8K byte(64K bit),IIC 最大时钟频率400 KHz(24FC64达到1MHz),低功耗CMOS技术:工作电流 1 mA(典型)、 待机电流 1 μ A(典型),32字节的页写缓冲器,超过100万擦/写周期,数据保存 200年。 24C02只有8字节的页写缓冲器,操作的地址只有8位,而24LC64操作的地址包含高8位和低8位。两者的数据手册去区别如下: 1、AT24C02页写时序: 2、24LC64页写时序: STM8L的程序设计如下: (1)数据的页写操作: (2)数据的连续读取:
[单片机]
<font color='red'>STM8L</font>读写EEPROM(24LC64)
基于Ymodem协议的STM32F407的串口IAP
IAP简介 IAP:In Application Programming 是指在应用编程,即在程序运行中编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以提供一种改变flash数据的方法。这种机制的存在可以实现单片机设备的免拆机升级和远程升级。一般实现形式为在单片机内先执行引导程序,由引导程序判断是否需要进行固件升级。如果需要执行固件升级,则引导程序通过串口或者SD卡等IO设备将应用程序的固件写到规定的地址上,然后跳转到规定的地址上执行应用程序。 Ymodem协议 Ymodem是一种错误纠正协议。使用较大数据块的调制解调采用这种协议,以获得更高的工作效率。采用Ymodem协议的调制解调器以1024字节数
[单片机]
基于Ymodem协议的STM32F407的串口<font color='red'>IAP</font>
STM32 IAP应用编程几个要点
1关于ISP、ICP、IAP 1.ISP ISP:In System Programing,在系统编程。 比如:使用STC-ISP对STC芯片编程,利用Flash loader对STM32编程等。 支持ISP的芯片一般在芯片内部固化了一段(用ISP升级的)boot程序。 2.ICP In Circuit Programing,在电路编程。 ICSP:In-Circuit Serial Programming,在电路串行编程。如:对EEPROM编程等。 ICP编程方式网上各有说法,从字面含义(在电路)来说,所有处于编程的芯片都需要上电,都处于电路中。不严格来说利用J-Link、ST-Link、e-Link32等工具进行编程
[单片机]
STM32 <font color='red'>IAP</font>应用编程几个要点
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved