关于8051 bootloader的一个思路 (amoBBS 阿莫电子论坛)

合集下载

stc8 bootloader 例程

stc8 bootloader 例程

文章标题:深入探讨STC8 Bootloader 例程1.引言在嵌入式系统设计和开发中,Bootloader 例程扮演着至关重要的角色。

STC8系列单片机作为一种常用的嵌入式芯片,其Bootloader 例程更是备受关注。

本文将深入探讨STC8 Bootloader 例程,从概念到实践,带您全面了解这一重要的技术。

2. 什么是Bootloader 例程Bootloader 例程,简称Bootloader,是一种在嵌入式系统中用于引导程序和初始化硬件的特殊程序。

在STC8单片机中,Bootloader 例程具有独特的设计和功能,可以实现固件更新、自主程序下载等重要功能。

考虑到STC8单片机在各类应用中广泛应用,Bootloader 例程的设计与应用显得尤为重要。

3. STC8 Bootloader 例程的特点STC8 Bootloader 例程具有以下几个突出的特点:- 稳定可靠:STC8 Bootloader 例程经过严格测试和验证,具有良好的稳定性和可靠性,可以满足各类应用的需求。

- 高度定制:STC8 Bootloader 例程支持用户自定义设置,可以根据具体应用的需求进行灵活配置,满足不同场景的需求。

- 易于集成:STC8 Bootloader 例程提供了完善的API接口和文档说明,方便用户在实际项目中快速集成和应用。

- 安全性保障:STC8 Bootloader 例程采用了多重安全机制,保障固件更新和程序下载的安全性,有效防止恶意攻击和非法篡改。

4. 深入探讨STC8 Bootloader 例程的实现在实际项目中,如何针对STC8 Bootloader 例程进行实现和优化是一个关键问题。

首先需要考虑Bootloader例程的整体架构和设计思路,具体包括Bootloader程序的存储器分配、引导流程设计、固件更新机制等方面。

其次需要考虑如何与应用程序进行有效的通信和数据传输,确保Bootloader 例程与用户程序的无缝衔接。

单片机bootloader原理

单片机bootloader原理

单片机bootloader原理一、引言单片机是一种集成了微处理器核心、存储器和输入输出接口的微型计算机系统。

在单片机的开发过程中,bootloader(引导程序)被广泛应用,其作用是在系统上电或复位时,负责加载和启动应用程序。

本文将介绍单片机bootloader的原理和工作流程。

二、bootloader的作用bootloader是单片机系统的第一个运行的程序,其主要作用如下:1. 初始化系统的硬件资源,如时钟、中断等。

2. 加载和运行应用程序。

3. 支持固件更新,可以通过串口或其他接口加载新的应用程序。

4. 提供调试和故障排除的功能。

三、bootloader的原理bootloader的原理可以简要概括为以下几个步骤:1. 系统上电或复位后,单片机会从固定的地址开始执行代码,这个地址就是bootloader的入口地址。

2. bootloader首先会进行硬件初始化,包括时钟设置、中断向量表的初始化等。

3. 然后,bootloader会检查是否存在新的固件更新。

如果有更新,bootloader会加载新的固件到指定的存储空间。

4. 如果没有固件更新,bootloader会加载应用程序到内存中,并跳转到应用程序的入口地址开始执行。

5. 应用程序执行完毕后,bootloader可以对系统进行复位或其他操作。

四、bootloader的工作流程下面以一个简单的bootloader工作流程来说明其原理:1. 单片机上电或复位后,开始执行bootloader的代码。

2. bootloader首先进行硬件初始化,设置时钟、中断等。

3. bootloader会检查是否存在固件更新的标志。

如果有标志,则执行固件更新操作。

4. 如果没有固件更新标志,bootloader会加载应用程序到内存中,并跳转到应用程序的入口地址开始执行。

5. 应用程序执行完毕后,bootloader可以对系统进行复位或其他操作。

五、bootloader的优点bootloader具有以下几个优点:1. 灵活性高:bootloader可以根据需求加载不同的应用程序,实现系统的灵活升级和更新。

Bootloader技术分析

Bootloader技术分析

Bootloader的特点
Bootloader启动可以是单阶段或多阶段,代 码可以都在flash中运行,或者一部分在flash 中运行,另一部分在ram中运行
一般bootloader至少有一部分在flash中运行, 但有少数例外(需要处理器支持)
一般bootloader有“引导”和“下载”两种 工作模式
U-boot所使用的文件格式
U-boot的tools目录提供一个工具 mkimage用来将elf格式的image文件转 成uImage
1. Vmlinux elf格式 2. zImage和bzImage 经过压缩的image 3. 用objcopy可以将elf转成bin文件
U-boot下载映像的制作过程
采用两级启动方式的Bootloader
Stage2:完成诸如命令处理等更加复杂的 功能,通常用C语言完成
1. 初始化本阶段需要用到的其他硬件设备 2. 准备系统内存映射 3. 将操作ห้องสมุดไป่ตู้统内核从Flash中搬移到RAM中 4. 为内核设置启动参数 5. 调用内核入口函数
Bootloader结构
处理器启动初始化代码及中断向量表 必要的设备管理机制和驱动函数 对传输协议的支持
由于需要完成“下载”功能,需要同主机 之间进行文件传输,所以需要支持至少某 种文件传输协议和相应的驱动程序,一般 通过串口,需要支持 xmodem/ymodem/zmodem等,当然 通过网络也是一个较好的选择
Bootloader结构
由于bootloader在工作过程中(尤其是调 试阶段)需要与开发者进行交互,所以提 供一个用户界面是必要的,通常通过串口 终端的方式来完成
在多数基于 Intel 的计算机中,GRUB 和 LILO 要 接受由 BIOS 所强加的限制。例如,多数 BIOSes 无法进入两个以上的硬盘,而且它们无法访问任一 驱动器上在超越柱面 1023 以上所贮存的数据。但 是,某些新的 BIOSes 没有这些限制。

在FPGA中嵌入8051核的详细方法与步骤

在FPGA中嵌入8051核的详细方法与步骤

在FPGA中嵌入8051核的详细方法与步骤此教程我使用的是http://www.oreganosystems.at/网站提供的开源8051内核。

Altera自带的8051内核并不是免费的,我也曾跟altera的客服发邮件申请过8051内核(英文的邮件交流。

我也不太说),反正用邮件对话了几次大致意思是他们不免费给,说网上有免费的51IP核可以自己去下载。

可以自己去那个网上下载或者下载我上传的该8051内核源码文章末尾会提供下载地址,打开后的文件有上面这些文件夹。

其中就一个最重要的就是8051核的源码,全部放在vhdl 这个文件夹里面。

那个pdf文档是这个IP核的使用教程,是官方标配的使用文档,也是纯英文的,对于英语四级没过的我下定决心花了大力气看最后只是一场空。

这问文档写的是用Synplify Pro这个综合软件综合的,虽然据说用这个软件进行综合可以节约FPGA的很多逻辑单元,但是对于我们这些初学者来讲,真的又麻烦又不适用,我们还是直接用QuartusII 来进行综合好了。

51IP核的源码全部在都在vhdl这个文件夹中,打开是一大堆的源文件。

对于这么多的文件该怎么用,该如何使用,这是本文的重点。

首先用QuartusII建立一个工程,这这里先提醒下,文件目录最好不要包含中文,空格,不然会有些无法理解的错误。

然后将vhdl整个文件夹复制到工程目录下(个人习惯,等下添加进工程里面的时候方便点)。

下面是添加8051核文件的步骤。

选择文件添加进工程。

这里注意下后面拖着_cfg的这种文件不要添加进工程里面,还有就是含有_top_的文件也不要添加到里面。

然后双击打开mc8051_p.vhd 这个文件。

把下面这些模块的例化语句全部删掉,这点非常重要!!component mc8051_topport (clk : in std_logic;reset : in std_logic;int0_i : in std_logic_vector(C_IMPL_N_EXT-1 downto 0);int1_i : in std_logic_vector(C_IMPL_N_EXT-1 downto 0);all_t0_i : in std_logic_vector(C_IMPL_N_TMR-1 downto 0);all_t1_i : in std_logic_vector(C_IMPL_N_TMR-1 downto 0);all_rxd_i : in std_logic_vector(C_IMPL_N_SIU-1 downto 0);p0_i : in std_logic_vector(7 downto 0);p1_i : in std_logic_vector(7 downto 0);p2_i : in std_logic_vector(7 downto 0);p3_i : in std_logic_vector(7 downto 0);p0_o : out std_logic_vector(7 downto 0);p1_o : out std_logic_vector(7 downto 0);p2_o : out std_logic_vector(7 downto 0);p3_o : out std_logic_vector(7 downto 0);all_rxd_o : out std_logic_vector(C_IMPL_N_SIU-1 downto 0);all_txd_o : out std_logic_vector(C_IMPL_N_SIU-1 downto 0);all_rxdwr_o : out std_logic_vector(C_IMPL_N_SIU-1 downto 0));end component;------------------------------------------------------------------------------- START: Component declarations for simulation models-----------------------------------------------------------------------------component mc8051_ramport (clk : in std_logic;reset : in std_logic;ram_data_i : in std_logic_vector(7 downto 0);ram_data_o : out std_logic_vector(7 downto 0);ram_adr_i : in std_logic_vector(6 downto 0);ram_wr_i : in std_logic;ram_en_i : in std_logic);end component;component mc8051_ramxport (clk : in std_logic;reset : in std_logic;ram_data_i : in std_logic_vector(7 downto 0);ram_data_o : out std_logic_vector(7 downto 0);ram_adr_i : in std_logic_vector(15 downto 0);ram_wr_i : in std_logic);end component;component mc8051_romport (clk : in std_logic;reset : in std_logic;rom_data_o : out std_logic_vector(7 downto 0);rom_adr_i : in std_logic_vector(15 downto 0));end component;----------------------------------------------------------------------------- -- END: Component declarations for simulation models----------------------------------------------------------------------------- 然后双击打开mc8051_core.vhd 这个文件。

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程序的更新。

8051单片机在线升级软件的方法

8051单片机在线升级软件的方法

8051单片机在线升级软件的方法本文通过对8051 单片机的特点分析,提出了一种低成本的方法,使其软件可以利用系统已有的通信链路在线升级。

1 基本原理类似于其他引导装载升级程序的方法,在系统中必须始终存在一段用于程序装载的代码(bootloader),该代码在启动时被运行。

其基本功能是根据外部条件来判断是运行现有版本的程序还是从主机下载新程序。

8051 具有选择执行片内或者片外程序的功能,而对片内E2PROM 编程过程相对比较复杂,因此这里将程序引导装载代码烧结在内部程序空间中,并不准备改变;而将系统应用程序存放在片外一编程相对简单和独立的E2PROM 内,是随时可以更新的部分。

通过外围电路的支持,单片机上电复位时首先执行片内的装载程序,如图1 所示。

该装载代码将应用程序从E2PROM 拷贝到外部存储器(RAM)中以备执行,同时还通过通信接口监系统程序装载执行过程听主机命令。

当收到主机更新程序的请求后,立即接收新的应用程序内容,并在最终确认后写入扩展E2PROM 内。

当片内程序执行完毕后,系统软件复位并执行片外RAM 中的程序,而RAM 的内容正是由装载所决定的。

如果CPU 再次复位,那么将重复上述装载执行过程。

值得注意的是,在对外部程序存储器访问时,8051 单片机只提供读指令(MOVC)而并不具备写指令。

但是从单片机对外部程序和数据存储器的访问时序上看具有一致性,不同的是读代码使用PSEN 信号而读数据使用RD 信号。

同时,单片机的PSENpRD 和WR 信号不会同时有效,因此将PSEN 和RD 逻辑合并后,可以使程序和数据合二为一读写成为可能。

这样同一个地址单元RD、WR(MOVX)和PSEN(MOVC)均可以进行访问。

单片机可以使用MOVX 写指令来更改相当于其外部程序空间中的内容。

特别要注意的是,当程序和数据共存于一片RAM 中时,必须使用编译器提供的相关连接命令使数据区偏离代码可能占用的区域,否则会导致系统混乱。

C8051单片机BootLoader心得

C8051单片机BootLoader心得

C8051单片机BootLoader心得8051至今仍占据着MCU的大量市场,以其通用、价格低廉等众多原因而被学校和大多公司作为微控制开发的首选。

随着ARM等32位控制器的出现,使得8051的追随者对于其使用编程器烧片子的方式逐渐的难以接受。

不论是从易用性、以及程序的可靠性来说,都添加了诸多不便。

此时很多人想到了ARM中常用的BootLoader得概念,其实这是一个很好的方法。

要想在MCU中实现BootLoader,首先要求单片机具有IAP功能,或是可以对其自身的FLASH进行擦除、写入的功能。

其次要考虑FLASH的空间,毕竟加入一个boot的代码是需要付出代价的。

下面以C8051F340为例说明一下我的心得与体会。

1.整体规划分区作用说明中断向量区中断向量保存 1.1APP区应用程序区 1.2BOOT区BootLoader代码存放区1.31.1中断向量区中断向量区提供复位以及异常中断的跳转, 鉴于51的特点,这部分必须存放在0地址开始的区域。

1.2 APP区应用程序区存放用户应用程序,亦即boot操作区。

这部分可以存放在FLASH的任意区域。

下载程序时,bootloader需要将下载的数据写入该区。

正常启动时,bootloader需要让CPU跳转至此执行。

1.3 BOOT区BootLaoder代码存放区。

这部分可以存放在FLASH的任意区域。

2.实现方法地址作用说明0000H -- 0002H Boot入口地址2.10003H -- D_APP_LIMIT APP程序 2.2D_RUN_ADDRESS APP入口地址2.3D_BOOT_ADDR Boot程序 2.42.1 Boot入口地址8051上电后执行的第一条便是0x0000—0x0002处的指令,考虑到程序的通用性,此处必须跳转到Boot 程序区,以便从boot开始引导或是装入程序。

STARTUP.A51文件中:CSEG AT 0?C_STARTUP: LJMP STARTUP1这两条语句便是实现了程序的跳转。

总结 fpga难学 的几大原因 (amobbs 阿莫电子论坛)

总结 fpga难学 的几大原因 (amobbs 阿莫电子论坛)

总结FPGA难学的几大原因(转)(amoBBS 阿莫电子论坛)为什么很多菜鸟始终无法入门?为什么大量的人会觉得FPGA难学?开贴来详细讲一下菜鸟觉得FPGA难学的几大原因:1、不熟悉FPGA的内部结构,不了解可编程逻辑器件的基本原理。

FPGA为什么是可以编程的?恐怕很多菜鸟不知道,他们也不想知道。

因为他们觉得这是无关紧要的。

他们潜意识的认为可编程嘛,肯定就是像写软件一样啦。

软件编程的思想根深蒂固,看到Verilog或者VHDL就像看到C语言或者其它软件编程语言一样。

一条条的读,一条条的分析。

如果这些菜鸟们始终拒绝去了解为什么FPGA是可以编程的,不去了解FPGA的内部结构,要想学会FPGA 恐怕是天方夜谭。

虽然现在EDA软件已经非常先进,像写软件那样照猫画虎也能综合出点东西,但也许只有天知道EDA软件最后综合出来的到底是什么。

也许点个灯,跑个马还行。

这样就是为什么很多菜鸟学了N久以后依然是一个菜鸟的原因。

那么FPGA为什么是可以“编程”的呢?首先来了解一下什么叫“程”。

启示“程”只不过是一堆具有一定含义的01编码而已。

编程,其实就是编写这些01编码。

只不过我们现在有了很多开发工具运算或者是其它操作。

所以软件是一条一条的,通常都不是直接编写这些01编码,而是以高级语言的形式来编写,最后由开发工具转换为这种01编码而已。

对于软件编程而言,处理器会有一个专门的译码电路逐条把这些01编码翻译为各种控制信号,然后控制其内部的电路完成一个个的读,因为软件的操作是一步一步完成的。

而FPGA的可编程,本质也是依靠这些01编码实现其功能的改变,但不同的是FPGA之所以可以完成不同的功能,不是依靠像软件那样将01编码翻译出来再去控制一个运算电路,FPGA里面没有这些东西。

FPGA内部主要三块:可编程的逻辑单元、可编程的连线和可编程的IO模块。

可编程的逻辑单元是什么?其基本结构某种存储器(SRAM、FLASH等)制成的4输入或6输入1输出地“真值表”加上一个D触发器构成。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于8051 bootloader的一个思路(amoBBS 阿莫电子论坛)
前一段时间做了个8051的bootloader,在C8051F340上运行,效果还可以。

基本思路如下:
1,中断向量的处理。

考虑到应用的可靠性,bootloader不应被擦除,而bootloader 和中断向量表通常都在单片机程序区的起始位置,所以中断向量表也不能变。

有些bootloader的解决方法是对主程序里的所有中断函数定位,这样做很麻烦。

我的解决的办法是,在startup.a51里,添加这样的语句
org 0003H
ljmp 3000H
org ....
ljmp .....0003H是第一个中断的入口,而3000H是主程序里的地址,在这里用一系列org、ljmp的语句全部跳到3000H 开始的连续位置。

在主程序的工程属性里,option for target->C51,Interrupt vectors at设置里,设置为0x3000。

这样,编译器就会把中断入口函数定位在3000H开始的位置。

唯一的缺点只是所有的中断会延迟一个ljmp指令的执行周期。

这样做,主程序里就不必对中断函数做特别的处理。

2,bootloader的处理流程:
首先,bootloader检查主程序是否正常。

主程序在下载的时候,会提供一个校验码,这个校验码也会保存在一个特定位置,如果发现校验码出错,则提示并进入下载模式
然后,bootloader检查有没有用户要求升级的(这个请求可以来自任何通讯接口),如果有,则进入升级模式。

如果主程序没有错误,在一定时间内也没有用户要求升级的请求,则进入主程序开始运行。

因为前面提到,中断向量表已经做了重映射,所以bootloader 里一般不使用中断。

3,主程序的处理
主程序除了第一点提到的,要对中断向量做一个重定位,还需要对入口定位,以确保bootloader顺利进入主程序。

另外,主程序需要在工程属性里设置ROM地址范围,当然,那个重映射的中断向量表,肯定要在这个范围内。

4,升级文件的处理。

我看到不少bootloader都是直接升级hex文件,PC上使用一个专门的程序来把文件传输到单片机里。

这样做不是很好。

Hex文件如果直接提供个用户,会导致程序的泄密。

另外,这样还可能导致错误的hex文件被下载进去。

我的做法是自己写一个PC端的程序,把HEX文件变成bin文件,并加上文件头和校验信息,可执行代码部分加密处理。

传输到单片机后,单片机检查文件头和校验是否正确,并对执行代码解密,写入主程序区。

5,升级文件的传输方式。

很多bootloader是用串口升级的,并且专门写了一个程序来做升级。

其实如果用串口来升级,可以使用xmodem协议,windows下自带的超级终端就有这个功能了,不需要自己单独写PC上的软件。

而且xmodem 协议本身很小,而且可靠性很高,是个不错的选择。

6,从主程序里升级系统。

不少情况下,升级系统的时候,传输文件的过程并不是在bootloader完成的,而是在主程序下完成的。

这是因为bootloader下传输文件,一般需要用户在启动设备的时候,在规定时间内快速做出动作,对用户来说并不方便;另一方面,bootloader的代码都很简单,如果遇到复杂的传输方式,例如通过网页上传,协议很复杂,在bootloader里无法完成。

但是主程序显然不能传输一个文件来覆盖自己。

我的解决方法有两种:
1,主程序不大,单片机程序存储区大。

将单片机的存储区划分一半出来,用来临时存储升级文件
2,外挂存储器,例如SPI接口的FLASH,用来暂存升级文件。

在主程序传输完成后,让系统自动复位,进入bootloader进行升级主程序的操作。

当然在这种情况下,bootloader需要增加一个检查临时存储区的动作,为了避免重复升级,升级完成后,还要擦除临时存储区。

这是我正在使用的方法,如果各位有更好的方法,欢迎提出来。

相关文档
最新文档