STM8L IAP升级过程记录

发布者:sdlg668最新更新时间:2018-09-10 来源: eefocus关键字:STM8L  IAP  升级过程 手机看文章 扫描二维码
随时随地手机看文章

STM8L IAP升级 
芯片:STM8LXXX 
通讯方式:SPI 
IDE: IAR for STM8

工作需求,需要实现基于SPI通信的IAP升级,百度了一些资料,爬过了一些坑,现在测试升级ok,因此写篇笔记记录一下整个过程,以下便是整个过程,纯属个人记录,难免有不到的地方,如有错误,麻烦指出。

一、介绍 
1) IAP简介 
所谓的IAP即应用程序中编程(In-application programming),即可以在产品出厂后,更新程序。既然可以更新程序,那么就要有程序负责这部分功能,这个程序就叫做BootLoader,而被更新的程序就叫做Application.

2)官方BooLoader 
如果只是想使用这个功能,而不用自己编写BootLoader,ST官方已经内置了Bootloader,参考文档《AN2659.pdf》中:点击下载 
这里写图片描述

根据上面的文档,可以了解,ST官方已经在STM8中内置了Bootloader,然后参考文档《UM0560.pdf》,点击下载,可以查看自己要使用的MCU是否支持内置的Bootloader,还有支持什么通信方式。 
我使用的这颗MCU官方的Bootloader只支持USART方式通信,而我们的项目需求是使用SPI方式通信,因此需要自己开发Bootloader。 
如果使用官方的Bootloader,则《UM0560.pdf》文档里面有详细的升级协议,可以根据协议进行对接。

3)自己编写BootLoader注意点 
如果自己编写Bootloader,则需要注意几个方面: 
1.中断向量表的重定向 
参考文档《STM8L IAP 应用程序中编程指导.pdf》中的说明,点击下载,如下图 
这里写图片描述

可以看到,当Application中发生中断的时候,会跳转到0x8000地址处,因此在Bootloader中需要将中断进行重定向,使之能够跳转到Application中的中断向量表中去。 
2.Bootloader与Application的大小以及数据的写入 
这个要根据自己的项目实际情况来确定大小以及区块位置,下面将会详细说明。

3.程序跳转 
程序跳转可以分为Bootloader跳转到Application, Application跳转到Bootloader.下面将会详细说明。

二、功能实现 
根据上面的说明,自己编写BootLoader需要实现以下几个方面:中断向量表、分区大小、数据写入、程序跳转 
1)中断向量表 
中断向量表的重定向,需要根据自己的Bootloader大小进行设置,例如,大小为4KB,则Bootloader地址范围为0x8000 ~ 0x8FFF,则可以中断向量表可以重定向如下:

/* interrupt vetor redirected app addres is 0x9000

*  bld size is 4kb

*/

__root const long reintvec[]@".intvec"=

{

0x82008080,0x82009004,0x82009008,0x8200900c,

0x82009010,0x82009014,0x82009018,0x8200901c,

0x82009020,0x82009024,0x82009028,0x8200902c,

0x82009030,0x82009034,0x82009038,0x8200903c,

0x82009040,0x82009044,0x82009048,0x8200904c,

0x82009050,0x82009054,0x82009058,0x8200905c,

0x82009060,0x82009064,0x82009068,0x8200906c,

0x82009070,0x82009074,0x82009078,0x8200907c,

};


如果大小为5KB,则Bootloader地址范围为0x8000 ~ 0x93FF,则可以中断向量表可以重定向如下:


/* interrupt vetor redirected app addres is 0x9400

*  bld size is 5kb

*/

__root const long reintvec[]@".intvec"=

{

0x82008080,0x82009404,0x82009408,0x8200940c,

0x82009410,0x82009414,0x82009418,0x8200941c,

0x82009420,0x82009424,0x82009428,0x8200942c,

0x82009430,0x82009434,0x82009438,0x8200943c,

0x82009440,0x82009444,0x82009448,0x8200944c,

0x82009450,0x82009454,0x82009458,0x8200945c,

0x82009460,0x82009464,0x82009468,0x8200946c,

0x82009470,0x82009474,0x82009478,0x8200947c,

};



2)分区设置 

如果确定自己的BooLoader大小,然后就可以设置对应的icf文件已经flash的大小。 

例如,现在使用的MCU flash地址空间为 0x8000 ~ 0xBFFF, 并且确定Bootloader的大小为5KB,则Bootloader地址为 0x8000 ~ 0x93FFF, Application地址为0x94000 ~ 0xBFFF. 

首先需要找到对应MCU的icf文件,具体路径为C:\Program Files\IAR Systems\Embedded Workbench 8.0_2\stm8\config 这个要根据你自己的IAR软件安装位置来确定。 

找到对应的MCU icf文件后,创建Bootloader和Application两份工程,然后将每一份工程的icf中,根据自己的分区的大小进行修改: 

Bootloader修改如下: 

这里写图片描述

Application中修改如下:

这里写图片描述 
修改完毕后,还需要将此文件载入工程,直接在IAR中点击创建的过程,右键options —> Linker —> Configuration, 选择自己修改好的icf文件然后载入,如下: 
这里写图片描述

3)数据写入 
数据的写入,根据MCU的datasheeet有几种写入方式,因为是大数据写入,所以采用了块写入的方式,即每次直接写入一个块,每个块128Bytes则需要计算写入块的位置。 
(0xbfff - 0x8000) / 128 = 128block 可知一共有128个块 
而Application的地址范围为 0x9400 ~ 0xbfff, 则Application的起始位置是(0x9400 - 0x8000) / 128 = 40 block 
也就是,Bootloader的位置为block0 ~ block 39, Application的位置为block40 ~ block127 
数据的写入和擦除使用的是IN_RAM方式,代码如下:

/*

Block programming, also called standard block programming: The block is automatically erased before being programmed.

Fast block programming: No previous erase operation is performed.

Block erase

*/

IN_RAM(void bld_flash_write_block(uint16_t BlockNum,FLASH_MemType_TypeDef FLASH_MemType,uint8_t *Buffer))

//void Write_Flash_Block(uint16_t BlockNum,FLASH_MemType_TypeDef FLASH_MemType,uint8_t *Buffer)

{

    FLASH_Unlock(FLASH_MemType);


    //FLASH_EraseBlock(BlockNum,FLASH_MemType);

    FLASH_ProgramBlock(BlockNum, FLASH_MemType,FLASH_ProgramMode_Fast,Buffer);

    FLASH_WaitForLastOperation(FLASH_MemType);


    FLASH_Lock(FLASH_MemType);

}



IN_RAM(void bld_flash_erase_block(FLASH_MemType_TypeDef FLASH_MemType))

{

    uint8_t i = 0;


    FLASH_Unlock(FLASH_MemType);

    for (i = FLASH_START_BLOCK; i <= FLASH_END_BLOCK; i++)

    {

        FLASH_EraseBlock(i, FLASH_MemType);

        FLASH_WaitForLastOperation(FLASH_MemType);

    }


    FLASH_Lock(FLASH_MemType);

}


代码中写入的时候采用的是FLASH_ProgramMode_Fast方式,即直接写入,FLASH_ProgramMode_Standard模式则是写入前先自动擦除,速度较慢。可以根据自己的需求进行选择。


4)程序跳转 

Bootloadre — > Application 

跳转直接采用汇编的方式,这里不再说明


void bld_goto_app()

{

    asm("LDW X, SP");

    asm("LD  A, $FF");   

    asm("LD  XL, A");

    asm("LDW SP, X");

    asm("JPF $9400");

}


Application —> Bootloader 

当需要升级的时候,需要进入到Bootloader状态,此时可以通过一些方法,例如外部电源reset、看门狗超时复位、或者直接采用汇编的方式跳转,如下:


void app_goto_bld()

{

    asm("LDW X, SP");

    asm("LD  A, $FF");   

    asm("LD  XL, A");

    asm("LDW SP, X");

    asm("JPF $8000");

}


不过,在使用这种方式之前,最好要 enableInterrupts();,否则会有一些有趣的事情发生。。。


5)BootLoader如何确定要升级? 

这个各有各的方法,目前简单采用向EEPROM中写入特殊字符来判断。


以上是全部的过程,如有错误的地方,麻烦指出。


关键字:STM8L  IAP  升级过程 引用地址:STM8L IAP升级过程记录

上一篇:STM8S105 SPI 初始化
下一篇:关于STM8S使用硬件SPI收发问题

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

意法半导体 STM8L 系列超低功耗微控制器量产
微控制器供应商意法半导体(纽约证券交易所代码:STM)宣布STM8L系列超低功耗微控制器正式投产。新系列产品于2009年底发布,以EnergyLite™ 技术为亮点,最大限度降低各种模式的功耗。 超低功耗微控制器符合当前高速增长的能效需求,有助于设计人员延长电池供电产品的寿命,降低智能电表、家用电器等电动设备的能耗。通常的省电技术包括睡眠模式和关断片上闲置模块,意法半导体的EnergyLite技术还可以在工作模式下节省电能,从而帮助设计人员达到“能源之星80 Plus”等能效目标,符合国际高能效电源推广计划以及待机功耗限制,如IEA的“1W节能计划”。 即日起上市的STM8L EnergyLite微控制
[单片机]
意法半导体 <font color='red'>STM8L</font> 系列超低功耗微控制器量产
STM32 | 串口IAP实例分享
什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 在重新编程过程中可以使用任意类型的通信协议,如UART、I2S、SPI等。这篇笔记分享的是使用UART方式IAP。 串口IAP实验 先理一理流程(本实验是以STM32F103ZET6为例): 1、实验说明 做这个实验需要准备两个keil工程,一个工程用于编写IAP程序,另一个工程用于编写我们的应用程序(要实现某些功能的程序),这里我们以一个点灯程序为例。最终,两份工程编译出来的可
[单片机]
STM32 | 串口<font color='red'>IAP</font>实例分享
STM32的在应用编程(IAP)快速学习
1.IAP介绍 IAP(In Application Programming)即在应用编程,IAP 是用户自己的程序在运行过程中对 Flash 部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。实现 IAP 功能时,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如 USB、USART )接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在Flash 中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作: 1.检查是否需要对第二部分代码进行更新 2.如果不需要更新则转到4
[单片机]
STM32的在应用编程(<font color='red'>IAP</font>)快速学习
STM32串口IAP实验中的地址问题
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)和if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)分析 首先要清楚:0x8000000是Flash的起始地址,0x20000000是SRAM的起始地址。jump2app()是一个虚拟函数(函数指针) (*(vu32*)(0X20001000+4))== (*(__IO uint32_t*)(0X20001000+4)) ==(*(volatile unsigned int*)(0X20001000+4)) (*(vu32*)(0X20001000+4)) 通过内存寻
[单片机]
STM32串口<font color='red'>IAP</font>实验中的地址问题
STM32学习记录18 IAP(1)
项目需要,需要开发一款手持设备,对产品进行软件升级。现在的产品都是使用STM32,所以可以很方便的应用STM32的 IAP功能对软件进行在线升级。 总体需求就是,主机Master通过CAN接口,发送数据给从机Slave。从机在接收到应用程序APP后,把接收的数据覆盖掉原来的应用程序区。从而实现Master对Slave的在线升级。 这里先介绍IAP,对IAP的整体实现有个了解,方便后续开发。参考了原子STM32开发板,对IAP功能的介绍。 要实现IAP,需要有两个项目代码。第一个称之为Bootloader程序,第二个称之为APP程序。Bootloader负责引导APP程序启动,以及需要在线更新APP时,接收主机发送的APP
[单片机]
STM32学习记录18 <font color='red'>IAP</font>(1)
IAR中STM8中断向量中断函数使用及STM8L的ucos时间调度
按IAR的规矩中断向量要加2,如PA口的中断向量为3,那么在IAR程序中应写成#pragma vector=0x05。而PD7和PD其他端口不一样,PD7后面拖了个小尾巴TLI,TLI拥有芯片最高级别中断,享有独立专用的中断向量号0,因此,按IAR的规矩,向量号加2,程序改成#pragma vector=0x02,而不是PD口的其他中断号0x08. 另外在STM8L15X.H中 有以下宏定义  #ifdef _IAR_ #define STRINGVECTOR(x) #x #define VECTOR_ID(x) STRINGVECTOR( vector = (x) ) #define INTERRUPT_HANDLER( a
[单片机]
LZW压缩算法在终端程序远程更新中的应用
引 言 配变监测终端(即配电变压器监测终端,distributiontransformer monitoring terminal),通过有线或无线的方式与主站进行通信,将采集、计算、分析后的数据上传到主站,实现远程抄表、线损分析、电能质量监测、防窃电以及故障诊断等功能,从而保证了配变监测终端的安全运行,提高了供电企业的管理水平,产生了很好的经济效益和社会效益。同时,配变监测终端作为嵌入式终端产品,当安装的设备程序出现缺陷,或者用户提出新的需求时,需要对终端程序进行远程更新,以保证终端运行的正确性。 本文采用Philips公司的32位微处理器LPC2378进行配变监测终端的开发,并利用该芯片自带的IAP功能实现了终端程
[嵌入式]
基于mPSD32xx系列单片机无线远程IAP的实现
引言   传统的MCU控制系统在下载程序时一般都是通过取下芯片用编程器烧写,或者采用ISP方式进行在线编程。随着用户需求和使用环境的不断变化,就会要求系统程序被升级,而采用上述两种方式进行程序升级时都必须要有开发人员进行现场操作。这种升级方式对于终端分散的控制系统来说无疑极大地增加了开发成本,也延缓了程序的更新时间。因此,本文结合无线基站动态环境监控系统, 给出了基于mPSD32xx系列单片机无线远程IAP(应用内编程)的具体实现方法,解决了上述问题。 系统架构   无线基站电源、空调、基站的室内环境等条件对整个系统能否正常运行是至关重要的,为了让无线基站有一个稳定、可靠的运行环境,因而设计了此采集系统。   针对以上环境,本采
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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