当前位置:首页 > 单片机 > 单片机
[导读]首先,stm8的中断向量的跳转地址是固定的。也就是说发生中断时,芯片会跳转到0x8000对应中断的偏移地址。而大部分bootloader都是在该区域实现。也就是说中断向量会被bootloader所占用。当用户程序执行中断时会跳转到

首先,stm8的中断向量的跳转地址是固定的。也就是说发生中断时,芯片会跳转到0x8000对应中断的偏移地址。而大部分bootloader都是在该区域实现。也就是说中断向量会被bootloader所占用。当用户程序执行中断时会跳转到bootloader程序的中断向量。也就会执行bootloader对应的中断。如果要执行用户代码区的中断函数则需要在bootloader的向量表区存放跳转置用户软件中断向量表。如下图跳转:

填写图片摘要(选填)

以上是带有bootloader的用户软件的运行步骤,这样在bootloader区按道理是无法实现中断的。因为向量表是跳转到用户软件向量表。实质上是可以同时在boot和app区实现中断的,但为了boot区越简单越好的原则这样做就足够了。

其次,如何实现boot区中断向量的改写将其跳转至用户中断向量表区?实现代码如下:

__rootconstlongreintvec[]@".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,

};

这是将该数组的值固定存储在intvec区域。

在icf文件中我们可以找到以下语句:

defineregionNearFuncCode=[from0x8000to0xFFFF];

defineblockINTVECwithsize=0x80{rosection.intvec};

placeatstartofNearFuncCode{blockINTVEC};

以上三条是系统默认的,只要在bootloader代码中加入以上数组,那么向量表就会被改变。在使用IAR仿真时可以看到以下内容:

填写图片摘要(选填)

0x82008080是上电复位跳转指令,后面0x82009004是用户中断向量表区对应中断。如果用户代码并非存放在0x9000区,则该数组值也要相应改变。

在地址0x9000用户代码区数据如下:

填写图片摘要(选填)

该区域才是真正的中断入口地址。

最后就是写bootloader代码了。可以通过串口、I2C、SPI或者CAN来接收用户代码并写入到FLASH中。写入成功后执行跳转指令进入用户APP。升级步骤如下:

填写图片摘要(选填)

最终,使用的是st官方的跳转指令如下:

asm("LDWX,SP");

asm("LDA,$FF");

asm("LDXL,A");

asm("LDWSP,X");

asm("JPF$9000");


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

  随着半导体技术的不断进步(按照摩尔定律),MCU内部集成的逻辑功能外设越来越多,存储器也越来越大。消费者对于汽车节能(经济和法规对排放的要求)型、舒适性、互联性、安全性(功能安全和信息安全)

关键字: bootloader 汽车电子

ST公司的STM8AF5286是用于汽车的8位MCU,配置了多达128KB闪存,数据EEPROM,10位ADC,计时器,LIN,CAN,USART,SPI,I2C等接口,工作电压3-5.5V,

关键字: st stm8

你知道STM8 Nucleo开发板吗?意法半导体新推出的两款STM8* Nucleo开发板,让8位开发社区也能体验到STM32 * Nucleo系列开发板久经验证的易用性和可扩展功能。

关键字: Nucleo stm8 意法

折腾了两天了,一直没解决问题。短路计算机这边的串口收和发,自收自发一切正常,这说明计算机这边的串口没问题。短路stm8s的收和发,自收自发也正常,那就是stm8s这边的串口也没问题。怀疑是波特率误差比

关键字: stm8 串口通信

前一段时间画了一个CC1101收发小板子,但是一直没有成功,最后发现把27nH的电感焊接成了27uH,最终导致失败.现在更换之后可以覆盖我们公司所有的角落,已经够用了.下面是STM8程序CC1101.

关键字: cc1101 stm8 433无线模块

发布至今已十年,STM8将华丽转身,延续传奇。

关键字: 8位 MCU stm8 意法半导体 技术专访

1.之所以要实现一个专用的bootloader,一是为了更好的移植和自身的升级,二是为了方便操作系统的调试,当然,你完全可以将这部分所要实现的与操作系统相关的功能集成到操作

关键字: bootloader 如何实现 嵌入式开发

在使用MDK5编译STM32时,新增的.c文件需要添加到 include Paths 处,否则编译时会报错。使用STM8时,用的是IAR,新增的.c文件需要添加头文件路径到 options->c/c++ Compi...

关键字: stm8 错误
关闭
关闭