单片机自编程及Bootloader设计

合集下载

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader1.项目简介在计算机系统中,bootloader是系统启动的关键组件之一。

它负责在计算机开机后首先加载并执行操作系统内核。

本项目旨在通过使用单片机,从零开始编写一个简单但完整的bootloader。

2.项目背景在嵌入式系统中,特别是在资源有限的环境中,使用单片机来编写bootloader是很常见的。

通过编写自己的bootloader,我们可以更好地了解启动过程,并可以通过添加自定义功能来满足特定的需求。

3.项目目标本项目的目标是编写一个能够在单片机上运行的bootloader,并能够加载并启动一个简单的操作系统。

为了达到这个目标,我们需要完成以下几个主要任务:3.1引导方式选择在编写bootloader之前,我们需要选择合适的引导方式。

这取决于我们所使用的单片机型号和开发环境。

常见的引导方式包括串口引导、SPI引导、CAN引导等。

3.2内存映射和堆栈设置在加载操作系统之前,我们需要进行内存映射和堆栈设置。

这些设置将确保操作系统能够正确地加载和执行。

3.3调试功能实现为了方便调试和错误排查,我们可以添加一些调试功能,如串口输出和断点设置。

这些功能将使我们能够更好地监视和分析bootloader的执行过程。

3.4操作系统加载和启动最后,我们需要编写代码来加载操作系统并启动它。

这包括读取操作系统的二进制文件,并将其加载到正确的内存位置。

一旦操作系统加载成功,bootloader应该能够跳转到操作系统的入口地址,并开始执行。

4.项目实施步骤在实施本项目时,可以按照以下步骤进行:4.1确定单片机型号和开发环境首先,我们需要确定使用的单片机型号和开发环境。

这将有助于我们选择适当的引导方式,并了解相关的开发工具和调试方法。

4.2编写引导代码根据选择的引导方式,编写引导代码。

这些代码将负责加载和执行后续的bootloader功能。

4.3实现内存映射和堆栈设置根据所使用的单片机和操作系统要求,进行内存映射和堆栈设置。

stm32f103vet bootloader例程

stm32f103vet bootloader例程

stm32f103vet bootloader例程摘要:1.概述:介绍STM32F103VET单片机及其bootloader2.STM32F103VET单片机简介a.性能特点b.应用领域3.Bootloader概述a.作用b.工作原理4.Bootloader例程介绍a.程序结构b.重要函数及功能5.Bootloader例程实现a.硬件连接b.程序编写c.编译下载及验证6.总结与展望正文:1.概述:介绍STM32F103VET单片机及其bootloaderSTM32F103VET是一款基于ARM Cortex-M3内核的微控制器,具有高性能、低功耗、多功能的特点。

本文将介绍如何使用STM32F103VET单片机实现bootloader功能,以及相关的例程。

2.STM32F103VET单片机简介STM32F103VET是基于ARM Cortex-M3内核的32位单片机,最高工作频率可达72MHz。

它具有丰富的外设接口,如I2C、SPI、UART等,适用于各种嵌入式应用领域。

3.Bootloader概述Bootloader(引导程序)是嵌入式系统中的一个重要组成部分,主要负责初始化系统硬件、加载和执行应用程序。

通常,bootloader存储在系统闪存中,可在系统上电或复位时自动执行。

4.Bootloader例程介绍本文以一款基于STM32F103VET单片机的bootloader例程为例,介绍其程序结构及重要函数功能。

该例程主要包括以下部分:a.程序结构- 初始化部分:配置系统时钟、GPIO等外设- 下载模式部分:与上位机通信,接收并执行固件更新- 运行模式部分:执行用户应用程序b.重要函数及功能- 系统时钟配置:根据实际需求配置系统时钟,以满足不同工作场景的性能要求- 与上位机通信:通过UART、I2C等接口与上位机通信,接收固件更新命令及数据- 固件更新:将接收到的固件数据写入系统闪存,实现固件更新- 用户应用程序:执行用户编写的应用程序,实现具体功能5.Bootloader例程实现a.硬件连接根据实际硬件设计,连接STM32F103VET单片机相关引脚,如时钟、复位、通信接口等。

stm32f030 bootloader 例程

stm32f030 bootloader 例程

主题:STM32F030 Bootloader 例程一、简介STM32F030是STMicroelectronics公司推出的一款32位ARM Cortex-M0内核的微控制器。

它具有丰富的外设,如GPIO、UART、SPI、I2C等,适用于各种嵌入式系统应用。

在嵌入式系统开发中,Bootloader是一个重要的组成部分,它能够实现固件的更新和管理,提高系统的灵活性和可靠性。

本文将介绍如何使用STM32F030的Bootloader例程进行固件升级。

二、准备工作在使用STM32F030的Bootloader例程之前,我们需要准备好以下工具和材料:1. STM32F030开发板2. USB转TTL串口模块3. ST-Link下载器4. 针对STM32F030系列的Bootloader例程源码三、下载和安装Bootloader例程源码1. 在STMicroelectronics官全球信息站下载针对STM32F030的Bootloader例程源码2. 将下载的源码解压缩到本地3. 打开Keil MDK-ARM开发环境,导入源码并进行编译四、烧录Bootloader程序1. 使用ST-Link下载器将编译好的Bootloader程序烧录到STM32F030开发板上2. 确保烧录成功后,通过串口工具连接USB转TTL串口模块到STM32F030的串口引脚上五、固件升级测试1. 将需要升级的固件通过串口工具上传到开发板2. 在Bootloader程序中编写相关代码来实现固件的升级和校验3. 运行Bootloader程序,进行固件升级测试六、总结通过本文的介绍,我们了解了如何使用STM32F030的Bootloader 例程进行固件升级。

在实际的嵌入式系统开发中,Bootloader的作用不仅局限于固件升级,还可以实现固件的管理和安全验证。

掌握Bootloader的开发和使用对于提高系统的稳定性和可靠性是非常重要的。

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader摘要:1.引言2.单片机bootloader 简介3.单片机bootloader 设计与实现a.目标平台与工具选择b.代码烧写流程c.代码结构与组织d.重要函数与实现4.遇到的问题及解决方案a.硬件问题b.软件问题5.总结与展望正文:基于单片机的毕设项目,从零开始编写bootloader,对于学习和实践嵌入式系统的设计与开发具有很大的价值。

本文将详细介绍这一过程,包括bootloader 的设计思路、实现步骤以及遇到的问题和解决方案。

首先,我们需要了解什么是bootloader。

bootloader(引导加载程序)是嵌入式系统中的一个关键部分,它负责在系统加电后初始化硬件并执行系统启动代码。

通常情况下,bootloader 会被固化在单片机的非易失性存储器中,以保证系统能够从断电状态恢复。

接下来,我们将详细讨论单片机bootloader 的设计与实现。

首先,我们需要选择一个合适的单片机平台和相应的开发工具。

这里我们以STC89C52 单片机为例,采用Keil uVision5 作为开发环境。

在设计和实现bootloader 时,我们需要关注代码烧写流程。

一般来说,bootloader 的烧写过程可以分为以下几个步骤:1.下载程序到单片机:通过ISP(In-System Programming)或JTAG 接口将程序下载到单片机内部的非易失性存储器中。

2.跳转到bootloader 入口:单片机加电后,会从非易失性存储器中执行bootloader 的入口地址。

3.初始化硬件:bootloader 会对单片机内部和外部的硬件进行初始化,例如初始化时钟、复位和串口等。

4.烧写应用程序:bootloader 会将从串口接收到的应用程序代码烧写至单片机的程序存储器中。

5.跳转到应用程序入口:完成代码烧写后,bootloader 会跳转到应用程序的入口地址,开始执行。

stc单片机bootloader程序编写

stc单片机bootloader程序编写

stc单片机bootloader程序编写随着科技的不断发展,单片机在各个领域的应用越来越广泛。

而在单片机的开发过程中,Bootloader程序的编写是非常重要的一环。

本文将介绍STC单片机Bootloader程序的编写方法。

首先,我们需要了解什么是Bootloader程序。

Bootloader程序是位于单片机内部的一段特殊代码,它的作用是在单片机上电或复位时,负责初始化硬件设备,并加载用户程序到内存中运行。

因此,Bootloader程序的编写质量直接影响到单片机的启动速度和稳定性。

在STC单片机中,编写Bootloader程序需要以下几个步骤:1. 确定Bootloader程序的存储空间:在STC单片机中,Bootloader 程序通常存储在内部Flash中。

因此,我们需要确定Bootloader程序的存储地址和大小。

一般情况下,Bootloader程序的大小应该尽量小,以便为用户程序留出更多的空间。

2. 编写Bootloader程序的初始化代码:在Bootloader程序中,我们需要编写初始化代码,用于初始化单片机的硬件设备,如时钟、GPIO 等。

这些初始化代码的编写需要根据具体的单片机型号和硬件配置来进行。

3. 实现用户程序的加载功能:Bootloader程序的核心功能是加载用户程序到内存中运行。

在STC单片机中,我们可以通过串口通信或其他外部设备来实现用户程序的加载。

例如,我们可以通过串口接收用户程序的数据,并将其写入到内存中。

4. 实现用户程序的跳转功能:当用户程序加载完成后,Bootloader 程序需要实现跳转到用户程序的功能。

在STC单片机中,我们可以通过设置程序计数器(PC)的值来实现跳转。

具体的跳转地址需要根据用户程序的存储地址来确定。

5. 添加Bootloader程序的升级功能:为了方便后续的固件升级,我们可以在Bootloader程序中添加升级功能。

通过升级功能,我们可以通过串口或其他外部设备将新的Bootloader程序写入到单片机中,从而实现Bootloader程序的更新。

PIC18单片机的一种新颖的Bootloader设计

PIC18单片机的一种新颖的Bootloader设计

PIC18单片机的一种新颖的Bootloader设计
字节的块,并且程序Flash单位写入只能由1变为0。但是HEX文件内容并不是按照需要生成的,每帧的数据长度可以不同,相邻帧的地址域的内容也可以不同。为此,在对程序存储器进行写操作时,需要根据地址域内容将数据域内容以8字节为单位合并成数据块,不足8字节的要填充0xFF。本文所设计的Bootloader程序采用一个环形Buffer的结构体来实现这一操作:③芯片的默认中断向量的起始是0x08和0x18,这是不能改变的,要想改变中断向量入口地址就要在这两个地址位置添加跳转指令,以跳转到用户程序的中断向量入口地址。PIC18系列的程序存储器的部分地址区域具有写保护性,为防止此区域之外的Bootloader程序被擦除或改写,需要对接收数据的地址域内容进行判断。如果小于用户程序起始地址,则需要向上位机回复“写地址错误”,并丢弃当前数据帧。结语 实验证明,本文设计的Bootloader功能稳定,且控制方便,可根据用户的需要灵活改变。譬如,在用户程序中添加系统复位机制即可实现在线升级,为PC端操作界面添加网络下载模块即可实现远程控制系统升级,这对于嵌入式产品的发布和软件升级极其重要。

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader
在现代电子系统中,单片机作为一种常见的微控制器,被广泛应用于各种领域。

然而,对于大多数开发者来说,直接编写和调试单片机的程序是一项复杂的任务。

bootloader的作用在于,在单片机启动时加载和初始化硬件设备,从而为应用程序的运行提供一个稳定的环境。

因此,从零开始编写bootloader对于单片机开发来说是一项非常重要的技能。

在本次毕设级项目中,我们将以一个常见的单片机——STM32为例,从零开始编写bootloader。

我们将首先了解单片机的启动过程,然后逐步编写引导程序,包括初始化硬件、设置中断向量表、加载应用程序等。

在编写bootloader的过程中,我们需要注意以下几点:
1.硬件初始化:在bootloader运行之前,需要先初始化单片机的硬件设备,
如时钟、GPIO、串口等。

2.中断向量表设置:bootloader需要设置中断向量表,以便在发生中断时
能够正确地跳转到相应的处理函数。

3.应用程序加载:bootloader需要从外部存储器或其他设备加载应用程序,
并将其加载到内存中。

4.错误处理:在bootloader运行过程中,可能会遇到各种错误,如硬件故
障、存储器错误等。

因此,我们需要编写相应的错误处理程序,以确保系统的稳定性。

通过本次毕设级项目,我们将深入了解单片机的启动过程和bootloader的编写
方法,提高自己的单片机开发能力。

同时,我们也将在实践中学习到团队协作和项目管理的方法,为今后的工作和学习打下坚实的基础。

STM8 Bootloader

STM8 Bootloader

自制Stm8 bootloader由于本人项目需要,要做STM8L052R8的bootloader,用于远程程序升级功能,为了安全考虑,不使用ST自带的bootloader,而是自制bootloader。

基本的功能是这样的,首先程序运行在一个V1.0的版本上,且带了BOOT,当程序收到一条命令后,程序跑入死循环,等待硬件看门狗复位;程序复位后进入bootload区,等待第二条命令的接收,接收到正确的数据帧后,bootloader开始擦除FLASH,并接收数据包,直到最后一个数据包接收完毕,通过指示灯以2HZ的频率闪烁,指示升级完成。

第一步:boot区程序设计,首先修改link文件,define region NearFuncCode = [from 0x8000 to 0xAFFF];define region FarFuncCode = [from 0x8000 to 0xAFFF];define region HugeFuncCode = [from 0x8000 to 0xAFFF];place at start of NearFuncCode { block INTVEC };以上是link文件部分,可以看出flash地址为0x8000开始,结束于0x17FFF; 长度为64kB,中断向量地址为0x8000,这样,知道了这个我们就可以修改BOOT程序的link和主程序的link了,这里我把BOOTLOAD区划分为8K,应用区为48K设置link文件如下,这样把boot区和APP区分开,互不干扰,你也可以根据需要调整他们的大小。

program:define region NearFuncCode = [from 0xB000 to 0xFFFF];define region FarFuncCode = [from 0xB000 to 0xFFFF]| [from 0x10000 to0x17FFF];define region HugeFuncCode = [from 0xB000 to 0x17FFF];place at start of NearFuncCode { block INTVEC };bootload:define region NearFuncCode = [from 0x8000 to 0xAFFF];define region FarFuncCode = [from 0x8000 to 0xAFFF];define region HugeFuncCode = [from 0x8000 to 0xAFFF];place at start of NearFuncCode { block INTVEC };像STM32这样的芯片中断向量地址可以任意定,所有boot区和APP区都可以使用中断,且互不干扰,但是STM8的中断向量表固定在0X8000地址,不能修改,所以BOOT 区不能开中断,否则会和APP区的中断打架,但是APP区的一但开启中断后就会跳转到0x8000地址,这样就跳到了BOOT区,因此需要使用跳转指令将中断跳回到APP区,__root const long reintvec[]@".intvec"={ 0x82008080,0x8200b004,0x8200b008,0x8200b00c, //当应用程序地址不是0xB000时则要相应改掉除第一个0x8200b010,0x8200b014,0x8200b018,0x8200b01c, //0x82008080以外的数值0x8200b020,0x8200b024,0x8200b028,0x8200b02c,0x8200b030,0x8200b034,0x8200b038,0x8200b03c,0x8200b040,0x8200b044,0x8200b048,0x8200b04c,0x8200b050,0x8200b054,0x8200b058,0x8200b05c,0x8200b060,0x8200b064,0x8200b068,0x8200b06c,0x8200b070,0x8200b074,0x8200b078,0x8200b07c,};这里大概的含义就是重定义STM8的中断,STM8中断向量重定义,至于这里为什么这样写,请网上自己去看,我也不是很清楚。

高手教你如何编写STM32 bootloader

高手教你如何编写STM32 bootloader

1)检测有无需要更新的标志,用户可自定义。比如说读取 flash 某位置存储 的字节作为标志位。 2)如需更新,则调用 STM32 的 FLASH 程序擦鞋用户代码部分。 3)将新的 bin 文件(即 2 进制文件直接烧写进去,需要将 keil 生成的 hex 文 件转换为 bin 文件,然后存储到外扩展的 flash 中)写入到 STM32 自带的 FLASH 中去,记住需要与上述设置的用户代码存储区一致。 4)更新成功后再跳转至用户程序。 5、用户程序需要注意一点,需要在程序运行前重新设置中断向量表,即: NVIC_SetVectorTable()。 6、用 STM32 自带的烧录文件中的 map 文件夹,我们所用的 STM32 为 512Kflash,所以选取 STM32_High-density_512K.STmap,将其分解为两个 STmap 文件(此文件可用记事本 打开) STmap 文件中,扇区是以每 2K 为一 page 来显示的,所以 boot 区我们只需 要到 page7,用户区我们需要 page8 到最后。 修改完成后再次打开此软件会发现多出了两个 flash 选项,可以根据此处来 选择需要存储的代码区。
然后还有一处需要修改:
高手教你如何编写 STM32 bootloader
今天教大家编写 STM32 的 bootloader,其实编写 bootloader 主要事项有 以下: 1、为你的 bootloader 程序选择存储器地址,因为 STM32 的存储器 FLASH 存储程序代码空间为 512K,需要进行划分。 2、如果需要使用 JTAG 在线调试,则需要配置区域: 3、为您的用户程序选择合适的存储空间: 同时配置在线调试区域: 4、bootloader 程序编写基本流程如下:

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader(实用版)目录1.项目背景2.项目目标3.项目实施4.项目成果5.总结与展望正文1.项目背景随着科技的不断发展,嵌入式系统在各个领域中的应用越来越广泛。

而单片机作为嵌入式系统的核心,其 bootloader 的编写对于整个系统的运行起着至关重要的作用。

bootloader,即引导程序,是操作系统运行之前执行的一段程序,主要负责对硬件进行初始化,加载操作系统等任务。

2.项目目标本项目旨在基于单片机,从零编写一个 bootloader,实现对硬件的初始化以及操作系统的加载。

通过该项目的实施,使学习者能够深入理解bootloader 的工作原理,掌握单片机编程技术,为以后在嵌入式领域的发展奠定基础。

3.项目实施项目分为以下几个步骤进行:(1) 硬件准备:选择一款适合的单片机型号,并准备相应的开发板、下载器等硬件设备。

(2) 软件准备:学习单片机编程语言,如 C 语言,了解 bootloader的结构和功能,为编写 bootloader 做好准备。

(3) 编写 bootloader:根据项目需求,编写 bootloader 程序,实现硬件初始化、操作系统加载等功能。

(4) 调试与优化:对编写好的 bootloader 进行调试,确保其功能正常。

在实际运行过程中,根据需要对 bootloader 进行优化,提高系统运行效率。

4.项目成果通过本项目的实施,学习者将掌握单片机 bootloader 的编写方法,实现对硬件的初始化和操作系统的加载。

此外,还可以提高自己在嵌入式领域的技能水平,为以后从事相关工作打下坚实基础。

5.总结与展望基于单片机从零写 bootloader 的项目对于学习者来说,既是一种挑战,也是一种锻炼。

通过这个项目的实施,不仅可以提高学习者的技术水平,还可以培养其解决问题的能力。

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader摘要:1.项目背景与意义2.单片机与Bootloader 简介3.Bootloader 设计与实现3.1 Bootloader 功能模块3.2 Bootloader 启动流程3.3 Bootloader 下载方式4.实验过程与结果4.1 硬件环境搭建4.2 Bootloader 程序编写4.3 Bootloader 下载验证5.总结与展望正文:【项目背景与意义】随着嵌入式系统的广泛应用,单片机在现代电子技术中占据着越来越重要的地位。

Bootloader 作为嵌入式系统的重要组成部分,负责实现系统启动、初始化以及应用程序的下载和运行。

从零开始编写Bootloader 对于深入理解单片机工作原理及提高嵌入式系统开发能力具有重要意义。

【单片机与Bootloader 简介】单片机是一种集成了CPU、存储器、外设接口等多种功能于一体的微型计算机。

Bootloader 是在单片机启动时运行的一段程序,通常包括系统初始化、Flash 存储器保护、应用程序下载和运行等功能。

【Bootloader 设计与实现】【Bootloader 功能模块】Bootloader 主要包括以下功能模块:1.系统初始化:配置单片机的工作模式,初始化外围设备,为后续操作做好准备。

2.Flash 存储器保护:防止非法访问或篡改Flash 存储器中的程序。

3.应用程序下载:通过串口、并口等通信接口接收外部发送的应用程序数据,并将其写入Flash 存储器。

4.应用程序运行:将Flash 存储器中的应用程序加载到RAM 中,并跳转到应用程序入口地址执行。

【Bootloader 启动流程】单片机上电后,首先执行Bootloader 程序。

具体流程如下:1.读取单片机内部或外部的配置信息,根据配置信息确定Bootloader 的入口地址。

2.将Bootloader 程序从Flash 存储器中读取到RAM 中,并跳转到Bootloader 入口地址执行。

AVR单片机Bootloader程序

AVR单片机Bootloader程序

1.程序逻辑BootLoader的升级协议是基于128字节数据块的Xmodem通信协议,采用CRC16校验。

Xmodem 协议的帧格式Byte1Byte2Byte3Byte4~Byte131Byte132~Byte133控制字符包序号包序号反码128字节数据校验和升级协议具体流程:序程redaoLtooB机片单RVA下位机发送升级请求密码,等待上位机的升级密码boot96,5秒的时间内若上位机没有发送升级密码,下位机进入用户程序。

上位机有升级指令发送时,下位机间断发送’C’等待上位机接收并开始发送数据,若数据连续三次校验错误那么进入用户程序,成功发送后进入用户程序执行刚写入的程序。

2.平台及程序结构基于ATmega328PB 单片机,20M 晶振,AtmelStudio平台。

包括下图四个文件。

3.程序代码3.1.Bootloader.h 头文件#include <avr/io.h>#include <avr/wdt.h>#include <avr/boot.h>#include <avr/pgmspace.h>#ifndef BOOTLOADER_H_#defineBOOTLOADER_H_#ifndef F_CPU #define F_CPU20000000UL //20M 时钟频率#endif#define BAUDRATE 4800//串口波特率#define BAUDREG ((unsigned int)((F_CPU *10)/(16UL *BAUDRATE)-5)/10)//超时次数#define TimeOutCnt25//发送'C'的最大次数#define TimeOutCntC 10//同步时间间隔(ms)#define timeclk 200//同步密码长度#define CONNECTCNT 6//Boot 区起始地址#define BootStart 0x3C00UL //由具体硬件设置#define RS4850#ifRS485AVR单片机BootLoader程序#define RS485PORT xxxxx #define RS485TXEn xxxxx#define RS485Enable()PORTREG(RS485PORT)|=(1<<RS485TXEn)#define RS485Disable()PORTREG(RS485PORT)&=~(1<<RS485TXEn)#endif //同步密码unsigned char KEY []={'b','o','o','t','9','6',0x0E ,0x1C ,0x39,0x14,0x28,0x57,0xAA };//用户程序起始地址#define PROG_START 0x0000#define BUFFERSIZE 128#define BUFSIZE BUFFERSIZE//接收缓冲区unsigned char buf [BUFSIZE ];unsigned char bufptr ,pagptr ;unsigned char ch ,cl ;//Flash 地址unsigned int FlashAddr ;//提示信息const char msg1[20]="Waiting for password";const char msg2[8]="Time out";const char msg3[23]="Waiting to receive file";const char msg4[17]="Upgrade successed";const char msg5[14]="Upgrade failed";//Xmoden 控制字符#define XMODEM_NUL 0x00#define XMODEM_SOH 0x01#define XMODEM_STX 0x02#define XMODEM_EOT0x04#define XMODEM_ACK 0x06#define XMODEM_NAK0x15#define XMODEM_CAN 0x18#define XMODEM_EOF0x1A #define XMODEM_RWC 0x43//'C'#define DataInCom()((UCSR0A)&(1<<RXC0))#define ReadCom()UDR0#endif /*BOOTLOADER_H_*/AVR单片机BootLoader程序3.2.Bootloader.c 文件#include <avr/io.h>#include <compat/ina90.h>#include <avr/interrupt.h>#include <avr/sleep.h>#include <util/delay.h>#include <avr/pgmspace.h>#include <stdlib.h>#include "BootLoader.h"#include "usart.h"sram global ;//全局变量结构体//使用定时器1:产生以毫秒为单位的时间void TimerInit (){OCR1A =(unsigned int )(timeclk *(F_CPU /(1024*1000.0f )));//200msTCCR1A =0;//普通端口TCCR1B =(1<<WGM12)|(1<<CS12)|(1<<CS10);//CTC1024分频}//更新一个Flash 页void write_one_page (unsigned char *buf ){boot_page_erase (FlashAddr );//擦除FLASH 指定页boot_spm_busy_wait ();for (pagptr =0;pagptr <SPM_PAGESIZE ;pagptr +=2)//SPM_PAGESIZE 128{boot_page_fill (pagptr ,buf [pagptr ]+(buf [pagptr +1]<<8));//填充BootLoader 缓冲页}boot_page_write (FlashAddr );//缓冲写入FLASH 指定页boot_spm_busy_wait ();}//跳转到用户程序void quit (){boot_rww_enable ();//RWW 区读使能(*((void (*)(void ))PROG_START ))();//用户程序起始地址PROG_START 0x0000}int main (void ){AVR单片机BootLoader程序unsigned char cnt ;unsigned char packNO ;unsigned char crch ,crcl ;unsigned int crc ;unsigned char li ;_CLI ();//关中断USART_Init ();_delay_ms (1000);TimerInit ();//定时器初始化,CTC 普通端口USART_Transmit ((unsigned char *)msg1,20);//Waiting for passwordcnt =TimeOutCnt ;//超时次数255s 1s 发送一个等待密码cl =0;while (1){if (TIFR1&(1<<OCF1A ))//自动重载{TIFR1|=(1<<OCF1A );if (cl ==CONNECTCNT )//密码长度6break ;cnt --;if (cnt ==0){USART_Transmit ((unsigned char *)msg2,8);//Time outquit ();}if (cnt %5==0)USART_Transmit ((unsigned char *)msg1,20);//Waiting for password}if (DataInCom ()){if (ReadCom ()==KEY [cl ])//接收密码cl ++;elsecl =0;}}USART_Transmit ((unsigned char *)msg3,23);//Waiting to receive file cnt =TimeOutCntC ;//发送'C'超时次数10while (1){AVR单片机BootLoader程序if (TIFR1&(1<<OCF1A )){TIFR1|=(1<<OCF1A );WriteCom (XMODEM_RWC );//发送'C'cnt --;if (cnt ==0){USART_Transmit ((unsigned char *)msg2,8);//Time out quit ();}}if (DataInCom ()){if (ReadCom ()==XMODEM_SOH )//接收数据SOH 0x01break ;}}TCCR1B =0;packNO =0;cnt =0;FlashAddr =0x0000;do {packNO ++;bufptr =0;ch =WaitCom ();cl =~WaitCom ();if ((packNO ==ch )&&(packNO ==cl )){WriteCom (XMODEM_ACK );for (li =0;li <BUFFERSIZE ;li ++)//接收128个字节数据buf [bufptr ++]=WaitCom ();crch =WaitCom ();crcl =WaitCom ();crc =crc16(buf ,BUFFERSIZE );//CRC 校验ch =crc /256;cl =crc %256;if ((crch ==ch )&&(crcl ==cl ))//如果校验符合{if (FlashAddr <BootStart ){write_one_page (buf );//写flash 写一页FlashAddr +=SPM_PAGESIZE ;AVR单片机BootLoader程序}WriteCom (XMODEM_ACK );//发送ACKcnt =0;}else {WriteCom (XMODEM_NAK );//发送NAK cnt ++;}}else {WriteCom (XMODEM_NAK );//发送NAKcnt ++;}if (cnt >3)//无应答次数break ;}while (WaitCom ()!=XMODEM_EOT );//等待全部接收XMODEM_EOT 0x04WriteCom (XMODEM_ACK );_delay_ms (50);if (cnt ==0){USART_Transmit ((unsigned char *)msg4,17);//升级成功Upgrade successedquit ();}else {USART_Transmit ((unsigned char *)msg5,14);//Upgrade failed while (1);//应该是升级失败不让进入用户程序避免程序错乱带来不必要的麻烦}quit ();//跳转到用户程序return 0;}3.3.usart.h 头文件#ifndef USART_H_#define USART_H_#define RS485_RX PORTD &=~((1<<PORTD2)|(1<<PORTD3))//Receiving #define RS485_TXPORTD |=(1<<PORTD2)|(1<<PORTD3)//Transmitting#define RS485_HIGHZ PORTD |=(1<<PORTD3);PORTD &=~(1<<PORTD2)//High-Z void USART_Init (void );//串口初始化AVR单片机BootLoader程序unsigned char WaitCom ();//接收单字节void WriteCom (unsigned char dat );//发送单字节void USART_Transmit (unsigned char *data ,char num );//发送函数unsigned int crc16(unsigned char *buf ,unsigned char n );//CRC 校验//#define IDEL 0x00//#define ID_ACCORD 0X01//#define COMMAND 0x02//#define READ_COMMAND 0x03//#define WRITE_COMMAND 0x04#define TRANSMITTING 0x10//#define DATA_READY 0x08//#define KEY_MODE 0x07//按键模式//#define GetFreq_MODE 0x80//测试模式//#define BOOTLAODER_MODE 0xf0//Booterloader 升级#define USARTBUFNUM GPIOR1//串口字节个数typedef struct {unsigned char ptr ;unsigned char state ;unsigned char command ;unsigned char savestate ;//保存状态unsigned char *usartbuf ;unsigned char comBuffer [150];}sram ;extern sram global ;//全局变量结构体#endif /*USART_H_*/art.c 文件#include <avr/io.h>#include <compat/ina90.h>#include <avr/interrupt.h>#include <avr/sleep.h>#include <util/delay.h>#include <avr/wdt.h>#include "usart.h"//#include "wdtg.h"SIGNAL (USART0_RX_vect ){}AVR单片机BootLoader程序SIGNAL (USART0_UDRE_vect ){}SIGNAL (USART0_TX_vect ){}void USART_Init (void ){DDRD |=(1<<DDD1)|(1<<DDD2)|(1<<DDD3);//485芯片控制引脚输出PORTD |=(1<<PORTD2)|(1<<PORTD3);//184芯片引脚控制输出高TX PORTD |=(1<<PORTD1)|(1<<PORTD0);//TX 输出高,RX 上拉输入//UBRR0=143;//4800UBRR0=259;//1434800(11059200/16/4800-1)UCSR0B =(1<<RXEN0);//串口0接收使能UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);RS485_RX ;}unsigned char WaitCom (){while (!(UCSR0A &(1<<RXC0)));return UDR0;}void WriteCom (unsigned char dat ){RS485_TX ;/*发送状态*/UCSR0B =(1<<TXEN0);/*发送使能*/UDR0=dat ;while (!(UCSR0A &(1<<TXC0)));UCSR0A |=(1<<TXC0);RS485_RX ;/*接收状态*/UCSR0B =(1<<RXEN0);/*接收使能*/}void USART_Transmit (unsigned char *data ,char num ){char i ;RS485_TX ;/*发送状态*/UCSR0B =(1<<TXEN0);/*发送使能*/for (i =0;i <num ;i ++){while (!(UCSR0A &(1<<UDRE0)));/*等待数据寄存器为空*/AVR单片机BootLoader程序UDR0=*data ;data ++;}UCSR0B =(1<<TXEN0);/*发送使能*/while ((UCSR0A &(1<<TXC0))==0);/*等待发送结束*/UCSR0A |=(1<<TXC0);/*发送结束标志位清零*/RS485_RX ;/*接收状态*/UCSR0B =(1<<RXEN0);/*接收使能*/}//CRC 校验unsigned int crc16(unsigned char *buf ,unsigned char n ){unsigned char j ;unsigned char i ;unsigned int crc ,t ;crc =0;for (j =n ;j >0;j --){crc =(crc ^(((unsigned int )*buf )<<8));for (i =8;i >0;i --){t =crc <<1;if (crc &0x8000)t =t ^0x1021;crc =t ;}buf ++;}//ch =crc /256;//cl =crc %256;return crc ;}AVR单片机BootLoader程序。

AVR单片机ATmega128芯片BootLoader详细介绍

AVR单片机ATmega128芯片BootLoader详细介绍

TIFR = TIFR|0x02;
}
}
//每秒向 PC 机发送一个控制字符"C",等待控制字〈soh〉
while(uart_getchar()!=XMODEM_SOH) //receive the start of Xmodem
{
if(TIFR & 0x02)
//timer0 over flow
{
Target: Mega128
Crystal: 16Mhz
Used: T/C0,USART0
*****************************************************/
#include #define SPM_PAGESIZE 256
//M128的一个 Flash 页为256字节(128字)
void quit(void)
{
uart_putchar('O');uart_putchar('K');
uart_putchar(0x0d);uart_putchar(0x0a);
while(!(UCSR0A & 0x20));
//等待结束提示信息回送完成
MCUCR = 0x01;
MCUCR = 0x00;
区本身。引导加载程序还可以对自身进行更新修改,甚至可以将自身删除,使系统的自编程能力消失。引导加载程序区的大小
可以由芯片的熔丝位设置,该段程序区还提供两组锁定位,以便用户选择对该段程序区的不同级别的保护。本节将给出一个实
际的的 Boot Loader 程序,它可以配合 Windows 中的超级终端程序,采用 Xmodem 传输协议,通过 RS232接口下载更新

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader

毕设级项目:基于单片机从零写bootloader一、概述在一个计算机系统中,引导加载程序(Bootloader)是为了引导操作系统或其他软件的一种特殊程序。

它负责在系统上电初始化之后,加载并执行操作系统内核或其他程序。

在嵌入式系统中,单片机起到了非常重要的作用。

因此,编写一个基于单片机的Bootloader是一项非常有意义的毕设项目。

二、单片机选择在选择单片机时,我们需要考虑一些因素,例如性能、功耗、扩展性等。

常见的单片机厂商有Microchip(美国)、NXP (荷兰)、STMicroelectronics(法国)等。

根据实际需求选择一款支持Bootloader开发的单片机。

三、Bootloader的功能1. 初始化硬件:Bootloader首先需要对单片机的硬件资源进行初始化操作,包括时钟配置、外设初始化、中断设置等。

2. 读取外部存储器:Bootloader需要读取外部存储器中的程序代码,这可以是Flash、EEPROM、SD卡等。

3. 检查程序完整性:在加载程序代码之前,Bootloader可以通过计算校验和或者进行散列计算等方法,对程序的完整性进行检查。

4. 加载程序代码:Bootloader从外部存储器中读取程序代码,并将其加载到内部存储器中,如RAM或Flash中。

5. 跳转到程序代码:加载完程序代码之后,Bootloader会将控制权转交给操作系统或其他程序,从而开始执行相应的程序。

四、编写Bootloader的步骤1. 硬件初始化:使用单片机的寄存器设置时钟源、时钟分频器、外部设备的初始化等。

2. 系统初始化:设置堆栈、全局变量初始化等。

3. 外部存储器读取:根据硬件接口和通信协议,读取外部存储器中的程序代码。

4. 完整性检查:对读取的程序代码进行校验和检查。

5. 程序加载:将程序代码加载到相应的内存位置。

6. 跳转执行:通过跳转指令将控制权转交给所加载的程序。

五、Bootloader的扩展功能1. 烧录新程序:通过串口、USB或SD卡等外设,实现对程序代码的更新烧录。

手把手教你写STM32的bootloader(SDIO读取TF更新Bootloader)

手把手教你写STM32的bootloader(SDIO读取TF更新Bootloader)

手把手教你写STM32的bootloader(SDIO读取TF卡更新固件)作者:谭建裕1、bootloader的简介及作用什么是bootloader?本人不知道该怎么说,反正会来看这篇都是知道自己要干嘛的。

不过bootloader的作用还是要提提的,bootloader最直观的作用就方便,比如你用单片机给人家做了一款产品,后期你的产品固件需要更新的时候,你总不能带着电脑直接去客户那里拆开产品给单片机下程序吧?也不能教客户怎么给单片机下程序吧?用户体验感太差。

其实本质上bootloader的也是一个完整的程序,也有main函数,有自己的中断向量表,栈顶指针,它可以检查有没有新的固件,如果有,则将新的固件的数据写入到我们指定的flash地址中,之后跳到新的程序中去就OK了。

此时bootloader的优势就来了,bootloade 更新固件有很多种方式,本人在这里只详细讲解一种,搞懂一种之后,其它的都好办,因为它们的思路都是一样的。

Bootloader的主体原理是:首先将bin文件的数据复制到特定的地址。

然后设置中断向量表,设置MSP主堆栈指针(具体请看CM3权威指南),设置复位向量。

然后就没有然后了。

2、bootloader涉及的知识本人在此讲解的是STM32通过读取TF内的bin文件数据来更新固件。

这里牵扯到STM32的SDIO外设,FATFS文件系统,STM32的flash读写操作。

2.1 SDIOSDIO是STM32的外设,需要注意的是只有100引脚及以上的才有。

电路原理图如图2-1-1所示。

图2-1-1注意:在使用TF之前必须保证TF卡格式为FAT32,单元大小为2048。

如图2-1-2所示。

图2-1-2记得在stm32f10x_it.c文件中添加中断函数。

如图2-1-3所示。

图2-1-32.2 FATFS文件系统移植和使用文件系统使用的是FATFS9,源码在压缩包的ff9文件夹,如图2-2-1所示。

stc8 bootloader 例程

stc8 bootloader 例程

stc8 bootloader 例程(原创版)目录1.STC8 Bootloader 简介2.STC8 Bootloader 例程的作用3.如何编写 STC8 Bootloader 例程4.STC8 Bootloader 例程的实际应用正文【1.STC8 Bootloader 简介】STC8 Bootloader 是一款针对 STC8 系列单片机的启动程序。

启动程序(Bootloader)是一种特殊的程序,它在系统启动时执行,用于初始化硬件和加载操作系统。

对于 STC8 系列单片机来说,Bootloader 起到了至关重要的作用,因为它可以帮助开发者简化系统启动过程,提高系统稳定性和可靠性。

【2.STC8 Bootloader 例程的作用】STC8 Bootloader 例程是 Bootloader 程序中的一个重要组成部分,它主要用于初始化单片机的硬件资源,包括时钟、中断、串口等。

此外,它还可以设置单片机的工作模式,例如低功耗模式、高速模式等。

通过编写 Bootloader 例程,开发者可以自定义单片机的启动行为,从而满足不同应用场景的需求。

【3.如何编写 STC8 Bootloader 例程】编写 STC8 Bootloader 例程需要掌握一定的单片机知识和编程技巧。

以下是编写 Bootloader 例程的基本步骤:(1)分析单片机的硬件结构,了解各个寄存器的功能和用途。

(2)阅读 STC8 Bootloader 的参考手册,熟悉相关函数和 API。

(3)编写代码,初始化单片机的硬件资源,设置工作模式等。

(4)使用调试工具,例如仿真器、编程器等,对 Bootloader 例程进行调试和测试,确保其功能正确、稳定可靠。

【4.STC8 Bootloader 例程的实际应用】STC8 Bootloader 例程在实际应用中具有广泛的应用前景。

它可以用于开发各种基于 STC8 系列单片机的嵌入式系统,例如智能家居、工业控制、医疗设备等。

单片机自编程及Bootloader设计

单片机自编程及Bootloader设计

单片机自编程及Bootloader设计Bootloader是在单片机上电启动时执行的一小段程序。

也称作固件,通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用应用程序准备好正确的环境。

Boot代码由MCU启动时执行的指令组成。

这里的loader指向MCU的Flash中写入新的应用程序。

因此,Bootloader是依赖于特定的硬件而实现的,因此,在众多嵌入式产品中目前还不可能实现通用Bootloader。

Bootloader的最大优点是:在不需要外部编程器的情况下,对嵌入式产品的应用代码进行更新升级。

它使得通过局域网或者Intemet远程更新程序成为可能。

例如,如果有5 000个基于MCU的电能表应用程序需要更新,电能表制造商的技术人员就可以避免从事对每一个电能表重新编程的巨大工作量,通过使用Bootloader的功能,由控制中心通过电能表抄表系统网络,远程对5 000个电表重新编程。

可见,Bootloader功能对于嵌入式系统的广泛应用具有十分重要的意义。

1 78K0/Fx2系列单片机简介78K0/Fx2系列是带CAN控制器的8位单片机,该系列单片机广泛应用于汽车电子,智能仪表等领域。

其内置POC(可编程上电清零电路)/LVI(可编程低电压指示器),单电压自编程闪存,引导交换功能(闪存安全保护),具有低功耗、宽电压范围、超高抗干扰等性能。

78K0系列单片机支持自编程(Self-programming)。

所谓自编程,是指用Flash存储器中的驻留的软件或程序对Flash存储器进行擦除/编程的方法。

通过单片机的自编程功能,可以设计Bootloader程序,通过串口等通信接口实现对产品重新编程、在线升级的功能。

以&mu;PD78F0881为例。

&mu;PD78F0881为78KO/Fx2系列中的一款44管脚单片机,内置32 KB Flash ROM,2 KB RAM,自带2个串行通信接口。

基于PIC18单片机的新颖Bootloader设计

基于PIC18单片机的新颖Bootloader设计
mcc18编译器,升级文件格式为IntelHEX格式。根据IntelHEX文件的格式,
将文件内容的每一行封装成一帧,加上帧头和帧尾以确保数据传输的可靠性,
并采用半双工的通信模式,对错误帧进行重传。
主程序代码如下:
主程序流程如图1所示。下载系统映像文件并写入程序存储器的程序流
程如图2所示。tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
IntelHEX文件是由一行行符合IntelHEX文件格式的文本所构成的
ASCII文本文件。在IntelHEX文件中,每一行包含一个HEX记录。这些记录
由对应机器语言码和/或常量数据的十六进制编码数字组成。每个记录包含5
个域:数据长度域,它代表记录当中数据字节的数量;地址域,它代表记录当
中数据的起始地址;代表HEX记录类型的域;数据域,它代表一个字节的数
统时被使用,此外,以后的系统更新也会使用Bootl-oader的这种工作模式。
本文设计的Bootloader同时支持这两种工作模式,一开始启动时处于正
常的启动加载模式,但并不立即启动进入内核,而是提示延时3s,上位机用户
如果发送某些信息给目标机,则切换到下载模式,否则继续启动内核。
1.2 Intel HEX文件
据,一个记录可以有许多数据字数字相符;校验和域,它表示这个记录的校验和,通过将记录当中
所有十六进制编码数字对应的值相加,模除256,所得余数的补码即校验和。
1.3 Bootloader的设计
本文所设计的Bootloader程序采用的编译器是MPLAB软件开发环境的
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

•Bootloader是在单片机上电启动时执行的一小段程序。

也称作固件,通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用应用程序准备好正确的环境。

Boot代码由MCU启动时执行的指令组成。

这里的loader指向MCU的Flash中写入新的应用程序。

因此,Bootloader是依赖于特定的硬件而实现的,因此,在众多嵌入式产品中目前还不可能实现通用Bootloader。

Bootloader的最大优点是:在不需要外部编程器的情况下,对嵌入式产品的应用代码进行更新升级。

它使得通过局域网或者Intemet远程更新程序成为可能。

例如,如果有5 000个基于MCU的电能表应用程序需要更新,电能表制造商的技术人员就可以避免从事对每一个电能表重新编程的巨大工作量,通过使用Bootloader的功能,由控制中心通过电能表抄表系统网络,远程对5 000个电表重新编程。

可见,Bootloader功能对于嵌入式系统的广泛应用具有十分重要的意义。

1 78K0/Fx2系列单片机简介78K0/Fx2系列是带CAN控制器的8位单片机,该系列单片机广泛应用于汽车电子,智能仪表等领域。

其内置POC(可编程上电清零电路)/LVI(可编程低电压指示器),单电压自编程闪存,引导交换功能(闪存安全保护),具有低功耗、宽电压范围、超高抗干扰等性能。

78K0系列单片机支持自编程(Self-programming)。

所谓自编程,是指用Flash存储器中的驻留的软件或程序对Flash存储器进行擦除/编程的方法。

通过单片机的自编程功能,可以设计Bootloader程序,通过串口等通信接口实现对产品重新编程、在线升级的功能。

以μPD78F0881为例。

μPD78F0881为78KO/Fx2系列中的一款44管脚单片机,内置32 KB Flash ROM,2 KB RAM,自带2个串行通信接口。

其内部Flash结构如图1所示。

为了方便实现擦除和编程,人为地将整个Flash分成若干个block,每个block 大小为1 KB。

block为自编程库函数中空白检测、擦除、校验的最小单位。

blockO从地址0000H开始,程序都从0000H开始执行。

block0~block3共4 KB存储空间为Bootloader程序存储区域。

block4~block31为应用程序存储区域。

为了防止Bootloader自身的升级失败,设计了引导交换功能。

该功能定义2个簇,即Boot cluster0和Boot cluster1。

Boot clustee0为block0~block3的4 KB存储空间,Boot cluster1为block4~block7的4 KB存储空间。

因此,实际运用过程中,一般把应用程序的开始定义在2000H,也就是从block8开始。

Flash地址为0000H~FFFFH。

7FFFFH~FFFFH存储空间为保留区域以及特殊功能寄存器区域等,用户无法对其进行编程。

2 自编程2.1 自编程环境2.1.1 硬件环境FLMDO引脚是78KO/Fx2系列单片机为Flash编程模式设置的,用于控制MCU进入编程模式。

在通常操作情况下,FLMDO引脚下拉到地。

要进入自编程模式,必须使FLMDO引脚置成高电平。

因此,通过一个普通I/O接口控制FLMD0引脚的电平。

如图2所示。

2.1.2 软件环境1)使用通用寄存器bank3,自编程库函数,需要调用通用寄存器bank3。

因此,在自编程时,不能对通用寄存器bank3操作。

2)使用100 B RAM(入口RAM)作为隐藏ROM中函数的工作区,入口RAM,是Flash存储器自编程样例库所使用的RAM区域。

用户程序需要保留着块区域,当调用库时,需要指定这片区域的起始地址。

入口RAM地址可以指定在FB00h~FE20h之间。

3)4~256 B RAM作为数据缓冲区,必须是FE20H~FE83H以外的内部高速RAM 区域。

4)最大39 B RAM作为隐藏ROM函数的堆栈。

5)隐藏ROM中的函数被0000H~7FFFH中的应用程序调用。

2.2 自编程流程自编程功能利用自编程软件库完成用户程序对Flash内容的重新编程。

如果在自编程的过程中有中断发生,那么自编程将暂停来响应中断。

中断结束,自编程模式恢复后,自编程过程将继续进行。

采用汇编语言编写78K0/Fx2自编程软件库,如表1所示。

自编程操作流程如图3所示,当单片机收到自编程执行信号时,开始进入自编程模式。

将FLMDO引脚设置成高电平,初始化入口RAM,为自编程库函数开辟空间。

当确认FLMD0为自编程状态时,开始检查需要编程区域是否为空白区域。

当被编程区域不是空白区域时,先将其擦除,然后在此区域进行编程。

编程结束后进行校验。

若校验无误,则将FLMDO引脚设置成低电平,退出自编程模式。

3 引导交换(boot swap)产品程序的升级包括应用程序的升级和引导程序(Bootloader自身)的升级。

为了防止引导程序在升级的过程中发生错误,从而导致MCU无法启动,设计了引导交换功能。

以图4说明引导交换的实现过程。

1)旧的Boot程序首先将新的Boot程序编程到交换引导簇1(Boot cluster 1),然后设置启动交换标志位,并强迫看门狗复位。

2)复位启动后,MCU看到交换标志位,便从交换引导簇1处开始启动。

交换引导簇1处的新Boot程序将检查交换标志位。

如果交换标志位被置1,则新的Boot程序将擦除交换引导簇0(Boot cluster 0)区域,并将自身复制到交换引导簇O,然后将交换标志位清零,强迫看门狗复位。

3)复位启动后,MCU看到交换标志位被清零。

又从交换引导簇0处开始执行。

这样就完成了boot程序自身的升级。

即使在升级过程中遇到断电等异常情况,在重新上电后也能重新完成Boot程序升级。

有效地防止在升级过程中出现断电等等异常情况而导致升级失败,MCU无法启动的问题,使Boot程序的升级变得安全可靠。

• 4 Bootloadler设计4.1 简单的Bootloader一个简单的Bootload包括5个元素。

1)启动Bootloader的信号Bootloader程序是在执行应用程序之前所执行的一小段程序,当Bootloader程序把控制权转交给应用程序后,在MCU复位前,Bootloader 程序将不再执行。

因此,需要产生一个信号触发MCU开始Bootloader程序。

该信号可以是中断,也可以通过串口传送的一条指令,或者是别的程序触发的信号。

2)执行Bootloader的信号单片机程序启动时,MCU是装载新的应用程序还是执行已经存在的程序取决于外部信号。

该信号可以是上电时的一个端口信号,用来控制MCU装载新程序还是执行旧程序,也可以是从串口接收到的指令等。

3)将新的代码传送给MCU 通过RS485、I2C、CAN或者USB传送新的应用程序数据。

因为要传送的代码一般会超过MCU的RAM容量,因此需要一些控制数据流量的措施。

一般使用XON/XOFF软件握手协议,传送代码的格式一般选择Intel hex格式。

4)Flash新代码的自动编程每次MCU接收到一批新的数据,就要将其编程到正确的Flash地址。

如果该地址非空白,MCU在编程前必须先擦除。

一般在编程中或者编程后还需要检查存储器的内容。

5)将控制权转移给有效的应用程序在接收和编程了新的代码后,Bootloader写一个校验和或者其他唯一字节序列到一个固定的存储单元。

Bootloader检测该值,如果该值存在,Bootloader就将控制权传给应用程序。

4.2 Intelhex格式在线升级的程序代码采用编译器输出的Intel hex格式文件。

Intel hex文件常用来保存单片机或其他微处理器的程序代码。

它保存物理程序存储区中的目标代码映象。

一般的编程器都支持这种格式。

Intel hex文件记录中的数字都是十六进制格式。

在InteI hex 文件中,每一行包含一个HEX记录。

Intel hex文件通常用于传输将被存于Flash或者EEPROM中的程序和数据。

Intel hex由任意数量的十六进制记录组成。

每个记录包含5个域,它们按照图5所示格式排列。

每一个部分至少由2个十六进制编码字符组成。

它们构成1个字节。

每一个部分的意义如下所述:1)每个Intel hex记录都由冒号开头,自编程的过程中以此判断一个Intel hex记录的开始。

2)数据长度代表当前记录中数据字节的数量。

3)地址代表当前记录中数据在存储区域中的起始地址。

4)HEX记录类型有如下4种:00-数据记录;01-文件结束记录;02-扩展段地址记录;03-转移地址记录。

NEC编译器输出的Intel hex文件中。

只包含数据类型00和01。

其中O1作为自编程过程中数据结束的判定标志。

5)数据域分用于存储需要写入Flash中的内容,一个记录可以有许多数据字节。

记录中的数据字节数量必须与数据长度中的值相符。

6)校验和是取记录中从数据长度到数据域最后一个字节的所有字节总和的2的补码。

根据以上说明,必须在程序中对接收到的Inter hex文件进行解码,获取数据以及数据地址,并对收到的数据进行校验,然后将接收正确的数据编程到Flash相应的地址上。

4.3 Bootloader设计思路单片机收到启动信号后,重新启动程序。

启动的时候首先执行Boot代码,Boot代码检查是否收到执行升级信号。

如果需要升级程序,则通过串口或者其他通信接口接收新的应用程序,loader程序向单片机Flash中写入新的应用程序代码。

最后通过检查校验位检测程序是否有效。

如果有效,则Bootloader将CPUMCU控制权交给应用程序。

整个升级过程完成。

Bootloader执行过程如图6所示。

需要注意的是Bootloader自身的更新和应用程序的更新还需区别处理。

通过辨别接收到数据的编程地址来判断是Bootloader更新还是应用程序更新。

若编程地址从0000H 开始,则为Bootloader更新。

Bootloader更新则需要执行引导交换(boot swap)功能;若为应用程序更新,自编程结束后,直接将CPU交给应用程序。

5 结束语本文探讨了78KO/FC2系列μPD78F0881单片机的自编程功能以及Bootloader的设计方法。

具体描述了通过单片机串口对相应的应用程序通过Bootloader进行升级。

此版本的Bootloader使用晶振20 MHz,通过串口Uart60,设置波特率为115 200,在μPD78F0881单片机上成功实现了用户应用程序的升级更新。

在接下来的工作中,Bootloader的设计应当面向更多的通信接口。

相关文档
最新文档