STM8 如何自制BootLoader并实现在线升级

发布者:zhihua最新更新时间:2018-08-22 来源: eefocus关键字:STM8  BootLoader  在线升级 手机看文章 扫描二维码
随时随地手机看文章

博主这里编写STM8代码使用的MCU是STM8S003F3,开发环境为IAR

BootLoader升级数据从哪里来?

要实现在线升级就必须要有数据端口去接收新的升级文件的数据,本博文以串口为数据接收端口接收数据。关于串口部分代码如下:

STM8 默认Linker 
我们在IAR的安装目录STM8\config(我的就是D:\IAR Systems\Embedded Workbench 7.3\stm8\config)下面找到lnkstm8s003f3.icf,然后将其复制到BootLoader工程目录下,以文本方式打开该链接文件, 
对于APP应用程序需要将其中的NearFuncCode、FarFuncCode和HugeFuncCode的起始地址均从0x8000修改为0x8400,如下图: 
STM8 APP应用程序修改链接文件
对于BootLoader程序,链接文件可不做修改,但修改的好处是,当BootLoader程序大小超过设定值(我这里设定的是1KB)时,IAR在编译链接时,可以检测出来,具体修改如下图: 
STM8 BootLoader修改链接文件
然后我们回到工程选项Linker分支下的Config页面中,勾选选中复选框Override default,在下方的编辑框中输入修改好的*.icf文件(若修改BootLoader工程的链接文件,则BootLoader工程也需要修改这里)。


如何从BootLoader程序跳转到APP应用程序


STM8 提供汇编跳转指令,只需要执行汇编代码即可,在IAR中的跳转代码如下:


asm("JP $8400");


如何得到可直接写入FLASH的应用程序代码?


博主使用的IAR环境可以直接生成hex文件,设置如下:

设置IAR生成Hex文件

我们便可以在工程的Debug\Exe目录下得到该Hex文件,但是该文件中的内容并不是可以直接写入到FLASH中,我们需要从中提取有效的数据,以文本格式打开该文件,可以看到:

Hex文件内容

该Hex文件是以行为单位,以冒号开头的十六进制文件,其具体格式如下: 

1. 每行的第一个字符固定为冒号,从第二个字符开始,每两个字符表示一个字节。 

2. 每行的第一个字节表示本行的数据长度,只是指定数据部分的长度,以字节为单位 

3. 每行的第二、三个字节表示表示本行数据的起始地址,即第一行数据的起始地址为0x8400 

4. 每行的第四个字节表示数据类型,数据类型有0x00,0x01,0x02,0x03,0x04,x05; 

0x00表示当前行是用来记录数据的,即可以写入FLASH中的数据从该数据类型中获得。 

0x01表示文件结尾,用来表示Hex文件的结束。 

我们主要用到的就是这两个类型,其他类型可自行查阅相关资料。


5 最后一个字节为校验字节,校验算法为计算本行除校验字节外的所有数据的累加和,不计进位,得到的字节数据即为校验字节。


如何重定义STM8中断向量?


如果我们不重定义STM8的中断向量将会导致APP应用程序无法使用中断,导致程序出错。在IAR中重定义中断向量只要在BootLoader程序中添加如下代码即可:


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

{   

    0x82008080,0x82008404,0x82008408,0x8200840c,

    0x82008410,0x82008414,0x82008418,0x8200841c,

    0x82008420,0x82008424,0x82008428,0x8200842c,

    0x82008430,0x82008434,0x82008438,0x8200843c,

    0x82008440,0x82008444,0x82008448,0x8200844c,

    0x82008450,0x82008454,0x82008458,0x8200845c,

    0x82008460,0x82008464,0x82008468,0x8200846c,

    0x82008470,0x82008474,0x82008478,0x8200847c,

}; 


如果将BootLoader的大小设置为2K,即应用程序的起始地址为0x8800,则该数组应该是这样:


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

{   

    0x82008080,0x82008804,0x82008808,0x8200880c,

    0x82008810,0x82008814,0x82008818,0x8200881c,

    0x82008820,0x82008824,0x82008828,0x8200882c,

    0x82008830,0x82008834,0x82008838,0x8200883c,

    0x82008840,0x82008844,0x82008848,0x8200884c,

    0x82008850,0x82008854,0x82008858,0x8200885c,

    0x82008860,0x82008864,0x82008868,0x8200886c,

    0x82008870,0x82008874,0x82008878,0x8200887c,

}; 


12

请仔细对比如果两个地址设置不一样其中的差别。


最后附上一个STM8BootLoder的例子


http://download.csdn.net/download/yuanquanzheng/10004057 

包含BootLoader源码,一个桌面端下载程序(wiform编写的,VS2013),一个APP应用程序,需要首先将BootLoader的代码通过烧录工具下载到STM8中,再可以利用桌面端下载App应用程序到STM8中。可实现从APP接收指令跳转到升级状态,然后传送升级文件进行升级,但这里没有写协议,功能仅仅只是为了实现BootLoader。


关键字:STM8  BootLoader  在线升级 引用地址:STM8 如何自制BootLoader并实现在线升级

上一篇:msp430 看门狗设置
下一篇:STC-ISP下载失败的原因与解决汇总

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

STM8电源模式管理及功耗控制
一、功耗控制调整 1、硬件功能调整 2、软件功能调整 3.经验 3.3V供电比5V更省电 HSI比HSE更省电 晶振频率越低越省电 读写RAM比FLASH更省电 片上资源会影响功耗,不用的应该用PCG功能关掉。 二、电源管理 怎么进入模式? 进入等待模式:asm( WFI ); 进入活跃停机模式:asm( HALT ); //开启AWU再执行此句会进入活跃停机 进入停机模式:asm( HALT ); //没有开启AWU再执行此句会进入停机 三、自动唤醒AWU结构和配置 自动唤醒单元用于单片机活跃停机模式, 1、时钟源 AWU可以选用两个时钟源:LSI和HSE 通过选项字节OPT4中的“CKAWUSEL
[单片机]
<font color='red'>STM8</font>电源模式管理及功耗控制
STM8->GPIO
如果MCU没有了IO,还用它干甚么呢? STM8是8位的MCU系列,其一个IO Port一般包括8个引脚,每个引脚可以被独立编程作为数字输入或者数字输出口(相较51需要先配置再使用),还可能会有如模拟输入、外部中断、外设等复用功能。但是在任一时刻引脚上仅有一个功能。复用功能通过选项字节控制。 选项字节,包括芯片的硬件配置和存储器保护信息,这些字节保存在存储器中一个块中。除了ROP(读出保护)字节,每个选项字被保存两次,一个通常的格式和一个备份的互补格式。可以在ICP模式(通过SWIM)下访问EEPROM对应的地址来进行修改。 相较于STM32的GPIO配置,STM8使用的寄存器更少,包括输出寄存器 (ODR)、输
[单片机]
STM8->GPIO
找回失去的青春--玩单片机STM8
把失去的青春补回来! 你以为我要说离开IT业?常被人说成“IT刁丝”,“IT民工”,我不以为然。不仅如此,我为做IT而骄傲。看看我们身边的产品,无不与IT有着密切的关系。你说你平时不用电脑。OK,你平时可以不用手机么?你知道手机是“IT刁丝”搞出来的么?再退一步,你说你也不用手机。OK,超市你去不?收银员用的收银机是“IT刁丝”搞出来的。你说你是搞金融的,不是碰IT,错,金融业的后台服务器,同样是“IT刁丝”搞出来的。 言归正传,我说的“青春”,是我在大学错过的一段的经历,就是“玩”单片机。注意我用的文字“玩”。下次不要说你在“学习”单片机,要说玩单片机。单片机,其实我8年的手机行业工作经历一直都在用,可是手机芯片的单片机
[单片机]
找回失去的青春--玩单片机<font color='red'>STM8</font>
STM8使用TIM1测量PWM波
一基本TIM1测量PWM波形原理 根据上图所示测量PWM的基本思想如下: 每个上升沿开始计数,监测到下降沿时记录下当前值为高电平时间,再检测到一个下降沿记录下当前值为周期,同时清零计数器开始测量下个周期。 二TIM1 的硬件结构 1 信号如何输入的 打开手册 翻到  17.5.2 输入模块 如图61,输入部分对相应的TIx输入信号采样,并产生一个滤波后的信号TIxF。然后,一个带极性选择的边缘监测器产生一个信号(TIxFPx),它可以作为触发模式控制器的输入触发或者作为捕获控制。该信号通过预分频进入捕获寄存器(ICxPS)。 根据该图和说明了解到和PWM测量相关的信息 1) TIM1有四个外部IO引脚可以输入
[单片机]
<font color='red'>STM8</font>使用TIM1测量PWM波
STM8的GPIO各模式
[单片机]
<font color='red'>STM8</font>的GPIO各模式
STM8 SPI 例程 通信出错
这个STM8的SPI通信也够奇葩的,跟STM32有大区别。光判断发送空和接收空的标志还不行,还必须判断忙标志位,而且读数的时候要等忙标志完毕才能读,废话少说上代码: 这是一段发2字节收2字节的代码,注意如果第二个字节接收才有效的话,也需要发送第二个字节才能提供时钟进行接收: GPIO_WriteLow(GPIOA, GPIO_PIN_3); while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET){} SPI_SendData(0x80 | 0x75); while(SPI_GetFlagStatus(SPI_FLAG_BSY) == SET){}
[单片机]
STM32 F4 从bootloader跳转用户代码遇到的问题
代码跳转后运行用户程序遇到的问题: DMA2_Stream3_IRQHandler DMA2_Stream4_IRQHandler ETH_IRQHandler ETH_WKUP_IRQHandler CAN2_TX_IRQHandler CAN2_RX0_IRQHandler CAN2_RX1_IRQHandler
[单片机]
Motorola微处理器的bootloader分析与应用
摘要:以Motorola 32位处理器ColdFire5307为例,分析、介绍Motorola公司用于嵌入式系统开发的dBUG通用bootloader软件的结构、运行原理及应用。 关键词:嵌入式系统 ColdFire bootloader dBUG 引 言 bootloader是用来完成系统启动和系统软件加载工作的程序。它是底层硬件和上层应用软件之间的一个中间件软件,完成处理器和周边电路正常运行所要的初始化工作;可以屏蔽底层硬件的差异,使上层应用软件的编写和移植更加方便;不仅具有类似PC机上常用的BIOS(Basic Input Output System,基本输入、输出系统监控程序)功能,而且还可具有一定的调试功能。
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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