历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2018年09月10日 | STM8L IAP升级过程记录

发布者:sdlg668 来源: 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收发问题

推荐阅读

Silicon Line通过Capital-E领投的B轮融资筹集820万欧元/950万美元资金 全球超低功率光链路技术领导者将投入资金提高产量、壮大设计团队以及在亚洲设立本地支持办事处 慕尼黑和科罗拉多州科罗拉多斯普林斯2018年9月10日电-- 面向消费电子以及商业与工业市场的全球领先创新型超低功率光链路技术开发商与提供商Silicon Line GmbH(网址:www.silicon-li...
新建一个system.h文件,包含以下内容#ifndef _system_H#define _system_H#include "stm32f10x.h"//位带操作,实现51类似的GPIO控制功能//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).//IO口操作宏定义#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volat...
在商业竞争的领域里罕有一家独存的先例,无论餐饮行业里的麦当劳和肯德基之争,还是FPGA领域里的Altera和Xilinx之博,它们基本实现了两家共存,明争暗斗,同进步共发展的生存格局。在示波器领域,安捷伦和泰克“厮杀不断”“明争暗斗”,一直作为两个行业标杆出现在大众的视野中,然而随着安捷伦在中端示波器领域推出Infiniium S系列和InfiniiVision 600...
据国外媒体报道,众所周知,高通是全球领先的智能手机处理器与基带芯片供应商,他们的智能手机处理器,被安卓阵营的厂商广泛采用,基带芯片也被苹果等厂商采用。  但事实上,高通的业务领域,不只是智能手机等移动设备领域,他们在汽车领域也有业务,同全球多家汽车厂商有合作。  在慕尼黑国际车展期间,6月30日上任的高通新一任CEO克里斯蒂亚诺·阿蒙...

史海拾趣

问答坊 | AI 解惑

麻烦问下,哪位高手这个电阻是什么作用哈?

本帖最后由 paulhyde 于 2014-9-15 09:48 编辑 这个就是 一个简单的分压测输出电压的电路。 请问哪位知道,那个 R2的作用是什么?  …

查看全部问答∨

A/D转换问题

我是新手,第一次发求助贴,请别见笑,也希望能获得各位朋友的帮助, 我采用的A/D是0804的,通过电位器调节输入A/D电压信号,转换后获取到的值放在P1口,建了个整型变量,假设为conv,执行以下语句后,可以实现数码管动态扫描显示数值: conv=P1; unsigned ...…

查看全部问答∨

prote在06版本制作的封装在winter09版本上显示有错误

是焊盘和外边的黄线有部分重合 不知道如何修改规则??? 求助…

查看全部问答∨

IoCallDriver的问题

原贴在[url=http://topic.eeworld.net/u/20100321/21/3856c90d-07f4-41bc-94ae-873f39577b92.html?83762][/url],我快挂掉了,大牛们快来帮帮忙!…

查看全部问答∨

读Isochronous pipe的问题

小弟是驱动菜鸟,望各位达人指教。 最近在写一个从Isochronous pipe读取数据的驱动,但是总是失败。 我在adddevice的时候创建了一个Request,然后用WdfUsbTargetPipeFormatRequestForUrb构建这个Request,并设置complete事件,但是在complete的时 ...…

查看全部问答∨

2440+UDA1341 mic

音频信号从UDA1341的ADC input输入,再从1341的DAC output输出音频信号,主要目的是可以通过1341来控制输入信号的volume\\bass\\treble\\mute等,有时还要混入操作系统(用的是WINCE5.0)的声音,不知道这种方案可行吗,若是可行,那在WAVEDEV驱动里 ...…

查看全部问答∨

怎么实现512X512LED双基色点阵屏的灰度控制,8位,256级灰度''''''

怎么实现512X512LED双基色点阵屏的灰度控制,8位,256级灰度\'\'\'\'\'\' 哪位有实现方法 我查到那种发送256次数据,与列驱动自带灰度调制的驱动芯片外,,,,,,还有其它方法吗,…

查看全部问答∨

小弟,ARM开发我自学要入门,高手们给指条明路

我大学是电子信息专业毕业的学过汇编和C 51之类但是不精模电还可以,现在想自学ARM开发!(偏软件方面的)请各位高手指条明路啊…

查看全部问答∨

PFC中的磁性元件及其作用

以最常用的BOOST PFC电路为例,一个完整的PFC电路如图1所示,其中的磁性元件有Boost储能电感、EMI 滤波电感(共模电感和差模电感)以及抑制输出二极管反向恢复电流的尖峰抑制器。另外在新型的无源无损软开关 PFC和ZVT有源软开关PFC电路中,辅助谐 ...…

查看全部问答∨

STM32F103RDT6能否接受到200KHz的外部中断?

                                 现在有一个应用,输入量是8个IO口的开关量,然后有一个选通信号,最高可能达到200KHz,准备将这个选通信号连接 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved