STM8 Bootloader和APP设计(都可以使用中断)

发布者:朝霞暮雨最新更新时间:2021-09-29 来源: eefocus关键字:STM8  Bootloader  APP设计 手机看文章 扫描二维码
随时随地手机看文章

1、本Bootloader适用范围:

STM8S 和STM8A


2、Bootloader和APP的标志位

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


Bootloader 的标志位: 0x11;


APP的标志位: 0x39;


3、Bootloader 和APP的地址分配

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


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

image.png

在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


关键字:STM8  Bootloader  APP设计 引用地址:STM8 Bootloader和APP设计(都可以使用中断)

上一篇:STM8S(207)BootLoader制作(在BootLoader和App中都可以使用中断)
下一篇:STM8S(105K4)使用笔记——窗口看门狗WWDG的基础配置

推荐阅读最新更新时间:2024-11-02 05:46

STM8单片机PWM应用(IAR)
PD3复用功能是TIM2_CC2,正好可以用来测试PWM功能。本例程通过电位器调整PWM脉宽来调整接在PD3的LED1亮度。 #include iostm8s207sb.h void CLK_init(void) { CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M } void GPIO_init(void) { PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出 PD_CR1 = 0x08; // 设置PD3为推挽输出 } void TIM2_init(void) { TIM2_CCMR2
[单片机]
IAR编译stm8出现的奇葩问题
近日使用iar for stm8的软件来调试stm8系列的芯片,使用timer定时器中断时发现一个问题,程序中timer定时器的中断入口如下 #pragma vector=ITC_IRQ_TIM1_OVF + 2 __interrupt void TIM1_UPD_OVF_BRK_IRQHandler(void) { /* 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序 */ TIM1_ClearFlag(TIM1_FLAG_UPDATE); //add your code here } 我在 #pragma vector=ITC_IRQ_TIM1_OVF + 2 和 __interrupt
[单片机]
stm8笔记2-定时3更新中断+pwm输出(IDE为IAR)
一:IAR编译器中断函数说明 下面说一下在IAR下,在IAR下必须要添加iostm8s105s6.h文件,在文件的最后有如下内容: /*------------------------------------------------------------------------- * Interrupt vector numbers *-----------------------------------------------------------------------*/ #define AWU_vector 0x03 #define SPI_TXE_vector
[单片机]
<font color='red'>stm8</font>笔记2-定时3更新中断+pwm输出(IDE为IAR)
STM8都支持哪些RTOS操作系统?
一、引伸问题 回答这个问题之前,引伸一个问题:STM8有必要使用操作系统吗? 这个问题其实没有标准答案,我用STM8裸机开发过项目,也在STM8的项目上跑过RTOS。 具体要看项目实际情况:MCU资源情况、功能复杂程度、实时性等。 比如:通过UART通信,简单控制几个IO口,这种或许没必要跑RTOS。 二、回归主题 STM8都支持哪些RTOS操作系统? 我找了下官方资料,共列举4种: 1.AtomThreads 这个RTOS应该是使用STM8跑操作系统的人都了解,或者听说过。 我觉得这个系统应该是目前(在STM8上)用的最多的一个RTOS. 在这4个系统中,我也只在STM8上跑过该操作
[单片机]
ARM7嵌入式系统中Bootloader分析与设计
1.引言 作为一种16/32位的高性能、低成本、低功耗的嵌入式RISC(Reduced Instruction Set Computer)微处理器,ARM(Advanced RISC Machines )微处理器目前已经成为应用最为广泛的嵌入式微处理器 。在嵌入式系统开发中Bootloader常常是嵌入式系统开发中可能遇到的第一个技术难点。应用程序运行环境能否正确构建,内核能否启动成功,都取决于Bootloader能否正确的工作。一个功能完善的嵌入式系统Bootloader还要求能够提供系统更新的能力,以及为了实现这一操作所需要的一个简单的命令控制台。本文在基于ARM7-uClinux嵌入式系统的硬件平台和软件平台基础上,描述了系统
[单片机]
ARM7嵌入式系统中<font color='red'>Bootloader</font>分析与<font color='red'>设计</font>
ARM移植之BootLoader(1)
BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序。通过BootLoader,我们可以初始化硬件设备、建立内存空间的映射 图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,BootLoader是严重地依赖于硬件而实现的, 特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 BootLoader 几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。    BootLoader 的实现依赖于CPU的体系结构,因此大多数 BootLoader 都分为stage1 和stage2 两大部分
[单片机]
ARM移植之<font color='red'>BootLoader</font>(1)
STM8 串口接收字符串问题
此处附上接收中断源码 #ifdef _RAISONANCE_ void USART_RX_IRQHandler(void) interrupt 28 #endif uint8_t cnt_USART ; #ifdef _IAR_SYSTEMS_ #pragma vector=30 __interrupt void USART_RX_IRQHandler(void) #endif { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruc
[单片机]
IAR for STM8 如何查看程序占用flash和RAM的大小
STM8s103F是笔者使用的一款mcu。由于程序代码和MCU资源的限制,有必要了解所实现程序代码占用mcu资源的情况。网上好多链接都没有讲清楚,在这里再整理一下。 STM8s103F的资源 查看手册,这款mcu的Flash为8K字节,RAM为1K字节。 IAR for STM如何查看占用空间大小 在Build窗口右击,选择“All”。 编程链接后,出现如图的信息。其中,7306 字节的readonly code memory是Flash占用大小。791字节的readonly data memory应该是常量的Flash (ROM),因为上述两者加起来总计8097约8k空间大小。422字节的readwrite data m
[单片机]
IAR for <font color='red'>STM8</font> 如何查看程序占用flash和RAM的大小
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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