历史上的今天
返回首页

历史上的今天

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

正在发生

2021年09月29日 | STM8 Bootloader和APP设计(都可以使用中断)

2021-09-29 来源:eefocus

1、本Bootloader适用范围:

STM8S 和STM8A


2、Bootloader和APP的标志位

在EEPROM中的0x4000地址存放一个标志位


Bootloader 的标志位: 0x11;


APP的标志位: 0x39;


3、Bootloader 和APP的地址分配

Bootloader 的存储空间为:  0x8000~ 0x9FFF;


APP 的存储空间为:        0xA000~0x27FFF;

image.png?imageView2/2/w/550

在0x8000开始的前128个字节,放置着bootloader重定位过的向量表(bootloader的真正的向量表放置在另外的地方)


在0xA000开始的前128个字节,放置着application的向量表


在0x001000开始的128个字节,放置着真正的向量表。(因此,不论在bootloader还是application都要在编译阶段告知链接器保留0x00~0x80这段内存空间)


详细的分布规则,请参考ICF 目录下的stm8af52a6_xxxx.ICF


4、更新程序的流程

5、ICF文件说明

Bootloader ICF  请查看 stm8af52a6_Boot.ICF 在项目文件夹的ICF文件夹中;


1)、define region VectData = [from 0x1000 to 0x107F];//重定向的中断向量表的存放位置


      //为真实的中断向量标在RAM中申请一个空间;


2)、place at start of VectData      { rw section .vector };


 //定义中断向量表的存放位置。


3)、do not initialize { section .vector };           


//因为中断向量表放在RAM中,防止上电初始化,会将此段数据清零,定义为上电不初始化。


4)、define region NearFuncCode = [from 0x8000 to 0x9FFF];


define region AppFuncCode  = [from 0xA000 to 0xFFFF];


define region FarFuncCode = [from 0x8000 to 0x9FFF]


                          | [from 0x10000 to 0x1FFFF]


                          | [from 0x20000 to 0x27FFF];


//定义Bootloader的存储空间。


APP ICF  请查看 stm8af52a6_APP.ICF 在项目文件夹的ICF文件夹中;


define region NearFuncCode = [from 0xA000 to 0xFFFF];

 

define region FarFuncCode = [from 0xA000 to 0xFFFF]

 

                            |[from 0x10000 to 0x1FFFF]

 

                            |[from 0x20000 to 0x27FFF];

 

define region HugeFuncCode = [from 0xA000 to 0xFFFF]

 

                            |[from 0x10000 to 0x1FFFF]

 

                            |[from 0x20000 to 0x27FFF];

         APP的定义空间不同,其余与Bootloader相同;


 


6、APP的跳转

1)、当APP收到上位机通过CAN总线发送过来的数据


d[0] == 0xAA && d[1] == 0x55 && d[2] == 0xA5 同时成立时;


进行程序更新;


2)、先进行中断向量表的初始化,将RAM  0x1000~0x107F中的中断向量表存放为Bootloader的中断向量表,此时一定要关闭中断。


void STM8_BootLoardHanderIqr_Init(void)

 

{

 

    ubyte *dst = (ubyte *)VECTAB_RELOAD_START;

 

    word cnt = 32;//sizeof(ReVector);

 

    word i;

 

    disableInterrupts();   //关闭总中断 

 

    for(i = 0; i < cnt; i++)

 

    {

 

        //*dst++ = *src++;   

 

        *dst++ = 0x82;

 

        *dst++ = 0x00;

 

        *dst++ = 0x80;

 

        *dst++ = 0x80+i*4;

 

    }

 

}

        3)、将EEPROM中的标志位更改为Bootloader的标志位 0x11;


4)、在进行EEPROM操作后必须延时,我之前不实现会出现EEPROM写入失败,最后导致程序不能正常跳转到Bootloader;


5)、产生软件复位,不需要跳转


void SoftReset(void)

 

{

 

    WWDG->CR |= 0x80;

 

    WWDG->CR &= ~0x40;  

 

}


6)、硬件复位后,程序会先进入Bootloader,进行EEPROM中标志位的判断,当读取到标志位为0x11,程序停留在Bootloader中等待程序更新;


7、Bootloader的跳转

由于STM8的向量表固定在0x008000~0x008080的位置,想要实现重定位向量表,则必须在固定的向量表中填入真正的向量表地址,方法如下:


1)、在APP烧写到0xA000的地址空间后,先进行程序看门狗产生软件复位;


2)、程序重新开始,判断EEPROM中0x4000地址内数据的标志位,如果是0x39就跳转到APP,否则留在Bootloader中;


3)、重新初始化STM8的中断向量表  把它重新定义到Bootloader的中断向量中   放在0x1000 –>  VECTAB_RELOAD_START


void STM8_AppHanderIqr_Init(void)

 

{

 

    ubyte *dst = (ubyte *)VECTAB_RELOAD_START;

 

    word cnt = 32;//sizeof(ReVector);

 

    word i;

 

    disableInterrupts();   //关闭总中断 

 

    for(i = 0; i < cnt; i++)

 

    {

 

        //*dst++ = *src++;   

 

        *dst++ = 0x82;

 

        *dst++ = 0x00;

 

        *dst++ = 0xA0;

 

        *dst++ = i*4;

 

    }

 

}


4)、跳转到APP


void goto_app(void)

 

{

 

    //重定义STM8的中断向量

 

    STM8_AppHanderIqr_Init();

 

    //跳转至APP

 

    asm("LDW X,  SP ");

 

    asm("LD  A,  $FF");

 

    asm("LD  XL, A  ");

 

    asm("LDW SP, X  ");

 

    asm("JPF $A000");

 

}

8、PC界面:

9、USB-CAN 通讯工具

10、Bootloader APP PC(VS)源代码文件列表


源代码链接:https://download.csdn.net/download/zijidewo123/13907488


推荐阅读

史海拾趣

Custom Connector Corporation公司的发展小趣事

Custom Connector Corporation成立于1969年,当时电子连接器行业正处于快速发展阶段。创始人看到这一市场潜力,决定投身于这一领域。在创业初期,CCC面临着资金紧张、技术瓶颈和市场认可度低等问题。然而,创始人凭借对技术的执着追求和对市场的敏锐洞察,带领团队不断研发新产品,改进生产工艺,逐渐在市场中树立了自己的品牌形象。

Astron Wireless Technologies Inc公司的发展小趣事

随着无线通信技术的快速发展,Astron Wireless Technologies Inc公司面临着来自同行的竞争压力。为了保持竞争优势,公司不断加大研发投入,推出了一系列具有更高性能、更低成本的无线通信产品。同时,公司还加强了与客户的沟通与合作,及时了解市场需求变化,并根据客户需求进行产品调整和优化。这些措施使得公司在激烈的市场竞争中保持了领先地位。

Data Device Corporation公司的发展小趣事

在电子行业中,竞争日益激烈,DDC也面临着诸多挑战。然而,DDC始终保持着清醒的头脑和坚定的信念,积极应对挑战并寻找机遇。通过不断优化产品结构、提高生产效率、降低成本等措施,DDC不断提高自身的竞争力。同时,DDC还积极关注行业发展趋势和市场变化,及时调整战略方向,确保公司能够在激烈的竞争中立于不败之地。

请注意,这些故事是基于DDC公司的发展历程和事实进行的概述,具体的细节和情节可能需要根据实际情况进行补充和调整。

Beck IPC GmbH公司的发展小趣事

Beck IPC始终坚持以研发和创新为核心驱动力。公司每年投入大量资金用于研发新技术和产品,并建立了完善的研发团队和体系。通过不断的技术创新和产品升级,Beck IPC始终保持着在嵌入式通讯和工业物联网领域的领先地位。同时,公司还积极参与国际标准制定和行业交流活动,为推动行业发展贡献自己的力量。

GWP Group公司的发展小趣事

Beck IPC GmbH,一家在嵌入式通讯市场享有盛誉的公司,以其创新的IPC@CHIP技术为核心,为工业OEM提供了强大的支持。在某一时期,公司研发团队经过长时间的努力,成功开发出一款具有划时代意义的嵌入式控制模块。这款模块不仅性能卓越,而且稳定性极高,迅速获得了市场的广泛认可。多家知名工业设备制造商纷纷与Beck IPC建立合作关系,将其产品应用于各种高端设备中,从而推动了公司的快速发展。

CHINFA公司的发展小趣事

在环保日益受到重视的今天,CHINFA公司积极响应国家号召,践行绿色环保理念。公司致力于研发和生产节能、环保的电子产品,通过技术创新和材料替代,减少了对环境的污染和破坏。同时,公司还加强了对生产废弃物的处理和回收利用,实现了资源的循环利用和可持续发展。

问答坊 | AI 解惑

tms320f28027的烧写

首先感谢soso了 提供F2802x_CSP_RTM升级烧写插件 有这个就太简单了 找到28027例程,也就是下载2802X的库文件 这里面有个flash的例程,打开这个程序,把那个Example_2802xFlash.c    Remove掉 加上自己主程序例如Example_2802xGpioT ...…

查看全部问答>

usb报文格式!!

请问   usb报文 格式  是如何的???…

查看全部问答>

如何确定库文件与组件的关系

BUILD: [01:0000000022:WARNN ] e:\\WINCE500\\PLATFORM\\SMDK2440\\DRIVERS\\PCMCIA\\init.c(83) : warning C4197: \'volatile PUCHAR\' : top-level volatile in cast is ignored BUILD: [01:0000000023:WARNN ] e:\\WINCE500\\PLATFORM\\SMDK24 ...…

查看全部问答>

ActiveSync安装出错

我在安装ActiveSync的时候出了个错,错误提示为“写入文件时出错:C:\\Program Files\\Microsoft ActiveSync\\wcesmgr.exe,请验证您有权访问该目录” 请问这是怎么回事,我重启过机器,还是不行,并且我用的就是administrator账户,在其他的机子上 ...…

查看全部问答>

S3C2410的APB驱动。。。

有谁有,请共享下,可以发我邮箱。。zhaoyd422@sina.com。。。谢谢了。…

查看全部问答>

WinCE 6.0 Pocket PC 通信选择

开发环境:  VS 2005 C# WinCE PPC 6.0 问题:     现在开发的软件要和服务器通信(从数据库获取数据),目前我用的是webservice通信(网络连接是GPRS)。     现软件测试结果:GPRS+webserivce通信速度很慢,时 ...…

查看全部问答>

求教 Timer_B捕获问题

我想利用定时器Timer_B捕获方波时间 ,现在程序中还有p1.3中断 但程序死机 ,将Timer_B中断封掉 程序正常 请问高手 问题在那里 程序如下 /********** TIMER_B 初始化 *********/ TBCTL = SHR_0+CNTL_0+TBSSEL_0+ID_1+MC_2+TBCLR+TBIE; ...…

查看全部问答>

MSP430学习笔记4-两个定时器产生步进单频音

这个程序是开发板中用来产生不同频率声音的程序,整体程序较为简单,主要是两个定时器的使用,代码及我的注释如下。/********************************************************* 程序功能:用固定频率的方波驱动蜂鸣器,共16种音调;在蜂鸣器 &nbs ...…

查看全部问答>

针对TMS320C6678的8核DSP芯片,image可执行映像文件发布时采用怎样的部署?

1. 针对TMS320C6678的8核DSP芯片,image可执行映像文件发布时采用怎样的部署? 是跟Linux一样,把bootloader、内核、上层应用程序分开来部署? 即先烧录bootloader,再烧录内核,在内核基础上,再部署上层应用程序? 还是跟vxworks一样,把bootloa ...…

查看全部问答>

stm32l151 的库函数GPIO_PinAFConfig 问题导致spi1配置到PA5-6-7错误

使用STm32L151RCT6,PA5、6、7作为SPI1的接口,使用GPIO_PinAFConfig()函数时出现问题。 // GPIO_PinAFConfig(GPIOA,GPIO_Pin_5,GPIO_AF_SPI1); // GPIO_PinAFConfig(GPIOA,GPIO_Pin_6,GPIO_AF_SPI1); // GPIO_PinAFConfig(GPIOA,GPIO_Pin_7,G ...…

查看全部问答>