关于8051 bootloader的一个思路 (amoBBS 阿莫电子论坛)
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是单片机系统的第一个运行的程序,其主要作用如下: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启动可以是单阶段或多阶段,代 码可以都在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核的详细方法与步骤此教程我使用的是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程序编写随着科技的不断发展,单片机在各个领域的应用越来越广泛。
而在单片机的开发过程中,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 单片机的特点分析,提出了一种低成本的方法,使其软件可以利用系统已有的通信链路在线升级。
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心得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难学?开贴来详细讲一下菜鸟觉得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触发器构成。
一定要知道的BootLoader的基础知识
一、BootLoader是怎么下载应用程序的?应用程序的写入可通过S19文件。
S19文件为飞思卡尔推荐使用的标准文件传送格式,是一段直接烧写进芯片的ASCII码格式:记录类型、记录长度、存储地址、代码数据和校验码5个部分组成每一行总是以S开头,后一位跟着的数据表示改行记录的类型。
S0:说明性信息,非程序数据S1:程序数据,且地址为16位S2: 程序数据,且地址为24位S9:整个S19文件的结束行浅谈BootLoader中的Flash与RAM划分:二、为什么要划分出一块RAM区?对P-Flash擦除与写入操作的时候,不允许同时对其进行读取,故此,对Flash的擦除、写入以及CAN终端信号的处理代码,应复制到RAM中运行。
怎么做?(在飞思卡尔XET256中,这一功能可通过关键字RELOCATE_TO实现。
)因此在划分Flash的同时也应对RAM进行划分,以实现这一功能。
(定义RAM的关键字为READ_WRITE)这样做后得到什么样的结果?划分出一个与P-Flash大小相等的一块RAM区三、关于BootLoader中的地址分配问题飞思卡尔16位单片机复位后总是从优先级最高的中断向量地址0xFFFE处取第一条执行指令。
因此,BootLoader 可执行代码的首地址应安排在此处,以保证上电后BootLoader最先执行。
这可以通过在prm文件中定义VECTOT 0 实现,即将VECTOR 0 定义为Bootloader程序的入口地址。
而应用程序也同样希望对VECTOR 0 定义,以实现在单片机上电后直接执行应用程序的目的。
由于存在这一中断资源冲突,因此,BootLoader在刷写时需要对应用程序的中断向量表进行重新分配。
四、通信协议BootLoader的通信协议的目的是什么?实现BootLoader于上位机之间的命令和状态传输怎么做?在标准的CAN协议基础上,定义一套简单的通信协议。
该协议中所使用的命令和状态均以报文ID表示,即每一个ID代表一个特定的命令或状态。
把Lua移植到stm32上,效果不错!(amoBBS阿莫电子论坛)
把Lua移植到stm32上,效果不错!(amoBBS阿莫电子论坛)因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置。
前段时间还自己花时间去实现一个C语言解释器,看了一堆编译原理的东西,以及虚拟机等,头都搞大了,把基本功能实现了,但总是不满意。
后来看到lua,网上一搜:才知道魔兽世界的插件就是lua写的....,愤怒的小鸟也是lua写的,lua在苹果和android都支持lua语言开发,lua已经成为移动平台开发的新贵...lua是纯c写的最高效的脚本语言...恍然大悟,原来lua就是我要找的东西啊!正所谓:梦里寻他千百度,蓦然回首,那人却在灯火阑珊处!于是立即产生了把lua移植到stm32的想法。
到网上查了半天stm32移植lua的资料,居然一篇都没有找到,失望啊。
难道我是第一个干这事的蠢人?没办法,只好硬着头皮上了!lua果然名不虚传,代码极其简略,移植性极高,由标准ansi c写成。
移植过程非常顺利,在IAR下编译后只有几十K字节。
编译了一个bin下载到stm32后,立马就顺利运行起来。
为了测试lua的内存的需求,我把ram设置到48k字节,结果运行很顺利。
看来lua对内存的需求确实很小。
在STM32处于24M的频率下,测试了一下lua脚本的运行效率,大致为每秒2万次浮点计算。
(在我的电脑上测试lua是每秒1千万次运算)。
如果stm32设置到72M的话,大致应该是每秒6万次浮点运算。
花了几分钟时间,通过lua c api实现了几个api函数让lua调用,感觉lua和c的交互调用确实极其方便。
int main(){.....Sys_TimerInit();SerialPort_Init();IWDG_Configuration();WWDG_Configuration();__set_PRIMASK(0);Sys_TimerRequest(OTimerID7,50,1);// 这是main里面的调用luaL = lua_open();luaopen_base(L);//注_册自己的c函数到lua中lua_register(L, "average", average);lua_register(L, "Lsleep", Lsleep);lua_register(L, "Lmyputs0", Lmyputs0);InitTasks();AddTask(facetask,1);AddTask(uart0task,1);float a,c2;char buf[100];//这里是lua脚本,脚本里面又调用了自己定义得c函数, Lmyputs0---串口输出函数 average --平均值函数, Lsleep--延时函数strcpy(buf," Lmyputs0(\"start!\",6); c2=2; a1 = {\"one\",\"two\",\"three\"} a=average(10, 20, 30, 40, 50); count=0; while 1>0 do \r\n count=count+1; Lmyputs0(a1[(count%3)+1],6); Lsleep (300); \r\n end; \r\n Lmyputs0(\"end!\",4)");//让lua运行脚本!luaL_dostring(L, buf);...}//下面是几定义的函数static int average(lua_State *L) {/* 得到参数个数 */int n = lua_gettop(L); double sum = 0;int i;/* 循环求参数之和 */for (i = 1; i <= n; i++){/* 求和 */sum += lua_tonumber(L, i); }/* 压入平均值 */lua_pushnumber(L, sum / n); /* 压入和 */lua_pushnumber(L, sum);/* 返回返回值的个数 */return 2;}static int Lsleep(lua_State *L){int d;PT_Timer_t tmr0;d=lua_tonumber(L, 1);PT_TimerSet(&tmr0,d);while(PT_TimerExpired(&tmr0)==false){WDT_FLAG = 0;RunTaskList();}lua_pushnumber(L, 1);return 1;}static int Lmyputs0(lua_State *L){char *buf;int len;buf=(char *)lua_tostring(L,1);len=lua_tonumber(L, 2);myputs0(buf,len);lua_pushnumber(L, 1);return 1;}//---------------附lua的说明------------------------Lua 是一个小巧的脚本语言。
最全proteus元件库对照表,希望对大家有所帮助(amoBBS阿莫电子论坛)
最全proteus元件库对照表,希望对大家有所帮助(amoBBS阿莫电子论坛)1.Analog IcsAmplifier : 放大器Comparators: 比较器Display Drivers: 显示驱动器Filters: 滤波器Miscellaneous: 混杂器件Regulators: 三端稳压器Timers: 555定时器Voltage References: 参考电压2.Capacitors:Animated: 可显示充放电电荷电容Audio Grade Axial: 音响专用电容Axial Lead polypropene 径向轴引线聚丙烯电容Axial Leda polystyrene 径向轴引线聚苯乙烯电容Ceramic Disc 陶瓷原片电容Decoupling Disc 解耦圆片电容Generic 普通电容High Temp Radial 高温径向电容High temp Axial Electrolytic 高温径向电解电容Metallised Polyester Film 金属聚酯膜电容Metallised polypropene 金属聚丙烯电容Metallised polypropene Film 金属聚丙烯莫电容Miniture Electorlytic 微型电解电容Multilayer Metallised Polyester Film 多层金属聚酯膜电容Mylar Film 聚酯膜电容Nicket Barrier 溴删电容Non Polarised 无极性电容Polyester Layer 聚酯层电容Radial Electrolytic 径向电解电容Tantalum Bead 树脂浊刻电容Variable 可变电容VX Axial Electrolytic VX 轴电解电容3 .CMOS 4000 seriesAdders 加法器buffers&Drivers 缓冲和驱动器Comparators 比较器Counters 计数器Decoders 译码器Encoders 编码器Flip-Flops&Latches 触发器和锁存器Frequency Dividers&Timer 分频和定时器Gates & Inverters 门电路和反相器Memory 存储器Misc.Logic 混杂逻辑电路Mutiplexers 数据选择器Multivibrators 多谐振荡器Phase_Locked Loops(PLL) 锁相环Registors 寄存器Signal Switcher 信号开关4.Connectors 接头Audio 音频接头D-Type D型接头DIL 双排插座Header Blocks 插头Miscellaneous 各种接头PCB Transfer PCB传输接头SIL 单排插座Ribbon Cable 蛇皮电缆Terminal Blocks 接线端子台5.Data Converters 数据转化器A/D Converters 模数转换器D/A Converters 数模转换器Sample &Hold 采样保持器Temperature Sensors 温度传感器6.Debugging TOOls 调试工具Breakpoint TriggersLogic ProbesLogic Stimuli7.Diodes 二极管Bridge Rectifiers 整流管Generic 普通二极管Rectifiers 整流二极管Schottky 肖特基二极管Switching 开关二极管Tunnel 隧道二极管Varicap 变容二极管Zenner 稳压二极管8.Inductors 电感GenericSMT Inductors Transformersplace Primitives 拉普拉斯模型1st Order2nd OrderControllersNon_LinearOperatorsPoles/ZerosSymbols10.Memory ICs 存储器芯片(包括常用的I2C,SPI芯片)Dynamic RAM 动态数据存储器EEPROM 电可擦除的EPROM 可擦除的I2C Memories I2c总线存储器Memory Cards 存储卡SPI Memories spi总线存储器Static RAM 静态数据存储器模拟芯片(Analog ICs)放大器(Amplifiers)比较器(Comparators)显示驱动器(Display Drivers)过滤器(Filters)数据选择器(Multiplexers)稳压器(Regulators)定时器(Timers)基准电压(Voltage Reference)杂类(Miscellananeous)电容(Capacitors)可动态显示充放电电容(Animated)音响专用轴线电容(Audio Grade Axial)轴线聚苯烯电容(Axial Lead Polypropene)轴线聚苯烯电容(Axial Lead Polystyrene)陶瓷圆片电容(Ceramic Disc)去耦片状电容(Decoupling Disc)普通电容(Generic)高温径线电容(High Temp Radial)高温径线电解电容(High Temperature Axial Electrolytic)金属化聚酯膜电容(Metallised Polyester Film)金属化聚烯电容(Metallised Polypropene)金属化聚烯膜电容(Metallised Polypropene Film)小型电解电容(Miniture Electrolytic)多层金属化聚酯膜电容(Multilayer Metallised Polyestern Film) 聚脂膜电容(Mylar Film)镍栅电容(Nickel Barrier)无极性电容(Non Polarised)聚脂层电容(Polyester Layer)径线电解电容(Radial Electrolytic)树脂蚀刻电容(Resin Dipped)钽珠电容(Tantalum Bead)可变电容(Variable)VX轴线电解电容(VX Axial Electolytic)连接器(Connectors)音频接口(Audio)D 型接口(D-Type)双排插座(DIL)插头(Header Blocks)PCB转接器(PCB Transfer)带线(Ribbon Cable)单排插座(SIL)连线端子(T erminal Blocks)杂类(Miscellananeous)数据转换器(Data Converter)模/数转换器(A/D converters)数/模转换器(D/A converters)采样保持器(Sample & Hold)温度传感器(Temperature Sensore)调试工具(Debugging Tools)断点触发器(Breakpoint Triggers) 逻辑探针(Logic Probes)逻辑激励源(Logic Stimuli)二极管(Diode)整流桥(Bridge Rectifiers)普通二极管(Generic)整流管(Rectifiers)肖特基二极管(Schottky)开关管(Switching)隧道二极管(Tunnel)变容二极管(Varicap)齐纳击穿二极管(Zener)ECL 10000系列(ECL 10000 Series) 各种常用集成电路机电(Electromechanical)各种直流和步进电机电感(Inductors)普通电感(Generic)贴片式电感(SMT Inductors)变压器(Transformers)拉普拉斯变换(Laplace Primitives) 一阶模型(1st Order)二阶模型(2st Order)控制器(Controllers)非线性模式(Non-Linear)算子(Operators)极点/零点(Poles/Zones)符号(Symbols)存储芯片(Memory Ics)动态数据存储器(Dynamic RAM)电可擦除可编程存储器(EEPROM)可擦除可编程存储器(EPROM)I2C总线存储器(I2C Memories)SPI总线存储器(SPI Memories)存储卡(Memory Cards)静态数据存储器(Static Memories)微处理器芯片(Microprocess ICs)6800 系列(6800 Family)8051 系列(8051 Family)ARM 系列(ARM Family)AVR 系列(AVR Family)Parallax 公司微处理器(BASIC Stamp Modules)HCF11 系列(HCF11 Family)PIC10 系列(PIC10 Family)PIC12 系列(PIC12 Family)PIC16 系列(PIC16 Family)PIC18 系列(PIC18 Family)Z80系列(Z80 Family)CPU 外设(Peripherals)杂项(Miscellaneous)含天线、ATA/IDE硬盘驱动模型、单节与多节电池、串行物理接口模型、晶振、动态与通用保险、模拟电压与电流符号、交通信号灯建模源(Modelling Primitives)模拟(仿真分析)(Analogy-SPICE)数字(缓冲器与门电路)(Digital--Buffers&Gates)数字(杂类)(Digital--Miscellaneous)数字(组合电路)(Digital--Combinational)数字(时序电路)(Digital--Sequential)混合模式(Mixed Mode)可编程逻辑器件单元(PLD Elements)实时激励源(Realtime Actuators)实时指示器(Realtime Indictors)运算放大器(Operational Amplifiers)单路运放(Single)二路运放(Dual)三路运放(Triple)四路运放(Quad)八路运放(Octal)理想运放(Ideal)大量使用的运放(Macromodel)光电子类器件(Optoelectronics)七段数码管(7-Segment Displays)英文字符与数字符号液晶显示器(Alphanumeric LCDs) 条形显示器(Bargraph Displays)点阵显示屏(Dot Matrix Display)图形液晶(Grphical LCDs)灯泡(Lamp)液晶控制器(LCD Controllers)液晶面板显示(LCD Panels Displays)发光二极管(LEDs)光耦元件(Optocouplers)串行液晶(Serial LCDs)可编程逻辑电路与现场可编程门阵列(PLD&FPGA)无子类电阻(Resistors)0.6W金属膜电阻(0.6W Metal Film)10W 绕线电阻(10W Wirewound)2W 金属膜电阻(2W Metal Film)3W 金属膜电阻(3W Metal Film)7W 金属膜电阻(7W Metal Film)通用电阻符号(Generic)高压电阻(High Voltage)负温度系数热敏电阻(NTC)排阻(Resisters Packs)滑动变阻器(Variable)可变电阻(Varistors)仿真源(Simulator Primitives)触发器(Flip-Flop)门电路(Gates)电源(Sources)扬声器与音响设备(Speaker&Sounders) 无子分类开关与继电器(Switch&Relays)键盘(Keypads)普通继电器(Generic Relays)专用继电器(Specific Relays)按键与拨码(Switchs)开关器件(Switching Devices)双端交流开关元件(DIACs)普通开关元件(Generic)可控硅(SCRs)三端可控硅(TRIACs)热阴极电子管(Thermionic Valves)二极真空管(Diodes)三极真空管(Triodes)四极真空管(Tetrodes)五极真空管(Pentodes)转换器(Transducers)压力传感器(Pressures)温度传感器(Temperature)晶体管(Transistors)双极性晶体管(Bipolar)普通晶体管(Generic)绝缘栅场效应管(IGBY/Insulated Gate Bipolar Transistors结型场效应晶体管(JFET)金属-氧化物半导体场效应晶体管(MOSFET)射频功率LDMOS晶体管(RF Power LDMOS)射频功率VDMOS晶体管(RF Power VDMOS)单结晶体管(Unijunction)CMOS 4000系列(CMOS 4000 series TTL 74系列(TTL 74 series) TTL 74增强型低功耗肖特基系列(TTL 74ALS Series) TTL 74增强型肖特基系列(TTL 74AS Series) TTL 74高速系列(TTL 74F Series) TTL 74HC系列/CMOS工作电平(TTL 74HC Series) TTL 74HCT系列/TTL 工作电平(TTL 74HCT Series)TTL 74低功耗肖特基系列(TTL 74LS Series) TTL 74肖特基系列(TTL 74S Series)加法器(Adders)缓冲器/驱动器(Buffers&Drivers)比较器(Comparators)计数器(Counters)解码器(Decoders)编码器(Encoders)存储器(Memory)触发器/锁存器(Flip-Flop&Latches)分频器/定时器(Frequency Dividers & Timers)门电路/反相器(Gates&Inverters)数据选择器(Multiplexers)多谐振荡器(Multivibrators)振荡器(Oscillators)锁相环(Phrase-Locked-Loop,PLL)寄存器(Registers)信号开关(Signal Switches) 收发器(Tranxceivers)杂类逻辑芯片(Misc.Logic)。
bootloader学习笔记
Bootloader学习笔记一.what is bootloader?Bootloader是一种独立的程序,类似于Application程序,尽管体积小,但具备启动代码、中断、主程序(Boot_main函数)和操作系统(可选)等“全部五脏”。
百度百科的词条解释:Bootloader是在加电后执行的第一段代码,完成CPU及相关硬件的初始化后,将操作系统映像或固化的嵌入式应用程序装载到内存,并跳转到操作系统空间启动运行。
下面是学习bootloader的系统路线:1.了解bootloader的定义:Bootloader是嵌入式系统在启动时执行的第一段代码,它完成硬件初始化,加载操作系统或固件。
2.掌握bootloader的工作原理:当系统开机时,CPU执行的是bootloader的代码,它读取存储设备(如硬盘,U盘,SD卡等)中的操作系统镜像或固件,加载到内存中,并进行跳转。
3.了解常见的bootloader的类型:如U-Boot,Grub等,并了解它们的特点和适用场景。
4.学习bootloader的开发:包括硬件初始化,文件系统的读取,代码的跳转等。
5.掌握bootloader的应用:比如系统升级,系统恢复等。
二.为什么需要bootloader?Bootloader是用于启动操作系统的引导程序,它是计算机启动过程中的第一个执行的程序。
需要Bootloader的原因有以下几点:1.引导操作系统:Bootloader负责读取和加载操作系统,并将控制权转交给操作系统。
2.进行硬件初始化:Bootloader初始化计算机硬件,确保操作系统能够正确识别和使用硬件。
3.提供系统恢复选项:Bootloader可以提供系统恢复选项,例如进入安全模式或恢复到原始配置。
4.实现多操作系统启动:Bootloader可以用于启动多个操作系统,例如通过引导菜单选择启动Windows或Linux操作系统。
因此,Bootloader是计算机启动过程中不可或缺的一部分,它起到了重要的辅助作用。
bootloader的编写
bootloader的编写
编写一个 bootloader 是一个底层任务,需要对计算机硬件和操
作系统的工作原理有深入的了解。
下面是一个简单的bootloader 编写示例。
1. 使用汇编语言编写代码:bootloader 需要使用汇编语言编写,因为它是操作系统加载和启动的第一个阶段。
2. 设置处理器状态:在 bootloader 的开头部分,需要设置处理
器状态,包括设置堆栈指针和其他相关的寄存器。
3. 初始化硬件:在 bootloader 中,需要初始化计算机硬件,如
内存控制器、显示器、键盘等设备。
4. 加载操作系统:bootloader 的主要任务是加载操作系统,它
需要从磁盘或其他存储介质中读取操作系统的二进制代码,并将其加载到内存中的指定地址。
5. 跳转至操作系统:一旦操作系统的二进制代码加载到内存中,bootloader 需要跳转到操作系统的入口点,将控制权交给操作
系统。
注意事项:
- 由于不同的计算机架构和操作系统可能有不同的要求,编写bootloader 需要根据具体的硬件和操作系统平台进行调整。
- 在编写 bootloader 时要小心使用硬编码的内存地址,因为这
些地址可能与操作系统或其他程序的内存地址冲突。
- 需要仔细测试 bootloader 的正确性,以确保其能正确加载和跳转到操作系统。
在实践中编写 bootloader 是一个复杂的任务,需要有一定的编程经验和对计算机硬件和操作系统的深入了解。
因此,如果你不熟悉这些概念或没有相关经验,最好参考已有的 bootloader 实现或使用现成的解决方案。
bootloader工作原理
bootloader工作原理一、引言在计算机系统中,bootloader(引导加载程序)是启动计算机系统的第一个程序,它负责初始化硬件设备、加载操作系统内核,并将控制权交给操作系统。
本文将深入探讨bootloader的工作原理,包括引导过程、启动流程、主要功能等。
二、引导过程引导过程是计算机系统启动的第一个阶段,它从系统上电开始,直到操作系统内核加载完毕。
下面是引导过程的详细步骤:1.上电自检(Power-On Self-Test, POST):计算机硬件进行自检,检查硬件是否正常工作。
2.加载BIOS:计算机启动时会加载基本输入输出系统(BIOS),BIOS是计算机硬件和操作系统之间的桥梁。
3.寻找可引导设备:BIOS会根据预设的启动设备顺序(如硬盘、光盘、USB等)寻找可引导设备。
4.加载bootloader:一旦找到可引导设备,BIOS会将控制权交给该设备上的bootloader。
5.bootloader初始化:bootloader会初始化计算机硬件设备,如显示器、键盘等。
6.加载操作系统内核:bootloader会从磁盘或网络中加载操作系统内核到内存中。
7.跳转到操作系统内核:一旦操作系统内核加载完毕,bootloader会将控制权转交给内核,操作系统开始执行。
三、启动流程bootloader的启动流程可以分为三个阶段:主引导程序(Master Boot Record, MBR)、可加载程序(Loader Program)和操作系统内核。
下面详细介绍每个阶段的功能和流程:1. 主引导程序(MBR)MBR是位于硬盘的第一个扇区(512字节),它包含了主引导记录、分区表和结束标志。
主引导记录(Master Boot Record)占446字节,其中包含了bootloader 的代码。
分区表(Partition Table)占64字节,记录了硬盘的分区信息。
结束标志(Boot Signature)占2字节,用于标识MBR的结束。
关于8051的bootloader实现方式
KEIL----单片机实现自定义bootloader,用于程序更新2013-04-07 15:45:05| 分类:我的自学实践|举报|字号订阅关于8051的bootloader实现方式一,基本硬件需求要实现IAP功能,需要51单片机可以在程序里修改代码空间的Flash,或者至少可以修改用户程序区的Flash,新出的51大部分都能满足这个要求二,空间划分一般bootloader位于单片机代码空间的起始地址,用户程序在后面。
这个需要根据实际的需求来决定,bootloader功能简单,就少占用一些,bootloader功能复杂的就多占用一些。
除此之外,一般还要根据Flash的页为界线划分。
附带的工程模板里,bootloader使用0x0000-0x0fff区间,用户程序使用0x1000以后的空间。
三,中断的处理51单片机的中断入口一般位于0地址开始的区间,无法修改,但是根据上面的空间划分方式,这个区间位于bootloader的范围,是不能随意更改的。
所以代码里用了一个软件的方式对中断入口做了重映射处理,后面将结合具体的代码介绍实现方式。
四,Bootloader的处理1,建立工程的时候,选择把Startup.a51添加到工程2,在Startup.a51里添加如下代码:ORG 0003HLJMP 2003HORG 000BHLJMP 200BHORG 0013HLJMP 2013HORG 001BHLJMP 201BHORG 0023HLJMP 2023H………………………….根据具体型号的中断数量和地址,添加中断跳转代码,格式为ORG XXH LJMP 2000+XXH,这样做,是为了将中断映射到用户程序区的0x2000开始的空间,在用户程序里,还要做一些对应的设置,后面将介绍。
3,Bootloader的处理流程。
Bootloader的主要作用一般是开机初始化,自检和升级用户程序,以及引导用户程序。
因为上面已经把中断映射到用户程序空间,所以bootloader里最好就不要用中断了。
BOOTLOADER的原理及设计要点
MEGA128的Boot Loader区大小可以由BOOT- SZ熔丝位来配置, 这给用户带来了很大的选择灵 活 性 。 在 出 厂 默 认 配 置 下 , BOOTSZ=00, 也 即 Boot Loader区为从¥F000开始的4K 字。用户可以 通过改写BOOTSZ来更改其大小。如果boot loader 区程序非常小, 用户甚至可以将Boot Loader区设 定 为512字 以 扩 大 应 用 程 序 的 空 间 。 笔 者 认 为 , 如果应用程序不是非常大, 最好能保留其4K字的 配置, 这一方面可减少一步改写熔丝位的工作 量, 另一方面也预留了Boot Loader的扩展能力。
利 用 在 应 用 编 程 (IAP, In Application Pro- gram) 技术, 用户可在数据采集中心对远 程RTU 进行升级, 而且更新时间快, 基本不会影响系统 运 行 。 此 外 , 当 在 单 片 机 中 烧 入 这 样 一 个 Boot loader程序并建立IAP后, 其最基本的开发环境就 简化成了 “PC+RS232电缆+目标板”。
Boot Loader区 的 程 序 一 般 可 分 为 两 个 部 分 , 一 部 分 是 与 硬 件 单 片 机 相 关 的 FLASH 擦 写 功 能 模 块函数, 一般用汇编语言编写, 这也是整个Boot Loader的 核 心 模 块 ; 另 一 部 分 为 应 用 程 序 模 块 , 一般用C语言编写, 以增强程序的可读性。
2.2 Boot Loader程序进入方式的选择
Boot Loader的本质就是驻留在FLASH中的 一 段程序。要进入Boot Loader程序, 程序指针PC必 须指向该程序的起始位置。用户可以通过在应用 程序接收到特殊指令后, 通过JMP语句直接跳转 到Boot Loader程 序 的 开 始 位 置 去 执 行 更 新 流 程 。 此 外 , MEGA128还 可 通 过 更 改BOOTRST熔 丝 位 来 将 复 位 向 量 直 接 指 向Boot Loader程 序 , 这 样 , 每次MEGA128复位时, 都将直接运行Boot Loader 流程。但用户在Boot Loader中必须判断是否需要 更新应用程序, 如果不需要, 经过超时时间后则 退出Boot Loader, 接着进入应用程序。
bootloader启动过程详细说明
bootloader启动过程详细说明今天早上看了⼀上午的bootloader简单源码,终于捋顺了bootloader的执⾏过程,之前只是知道bootloader代码会先被irom中的代码拷贝到iram中⼀部分,然后执⾏这部分代码,会把整个bootloader代码拷贝到sdram中,最终在sdram执⾏剩下的代码,⽽这段代码会把kernel拷贝到sdram的某个地址,最终引导起来整个内核。
但是我今天早上看代码的时候看到⼀个问题,我所有的代码都是⾃⼰动⼿实现的,只要⼀步⼀步按照顺序来,不就可以实现么?为什么还要拷贝来拷贝去的。
感觉直接按照跳转的⽅式,跳转值进⾏指令的跳转就⾏,但是想过之后,我意识到⾃⼰真是⽆知了。
⽐如说在irom中执⾏的时候,会有⼀次跳转到iram中某⼀个地址,当然pc是肯定可以直接跳转到指定的任何⼀个地址,但是在这个地址中没有存放指令码,这时候,肯定是⼀个有去⽆回的过程,不仅这样,这个pc跳到这⾥后,就会很迷茫,前不着村,后不着店的,不知道⾃⼰的所去所从,就会死到这⾥。
只有先把代码拷贝到将要跳转的地址中,pc指针才会顺着跳转后的指令继续执⾏,也就是说每⼀个指令都要负责⼈,确保执⾏完这个指令后,⼀定要有另⼀个指令去接纳pc。
这样pc才会⼀直活在我的代码中。
下边我就再把我更进⼀步了解到的bootloader执⾏过程再重新叙述⼀下:我使⽤的是s5pv210芯⽚、K9K8G08U0A型号的nand flash第⼀步:cpu启动起来后,先来到0x00000000这个地址处(也就是irom的地址),此时会看到有⼀段代码(这是irom中固定的代码)在这⾥,这段代码会找到bootloader的第⼀段代码(以下就称为BL1)存放的地址,由于BL1存放在nand flash中,不⽀持⽚上执⾏,所以irom会把这段代码拷贝到iram中,但是在拷贝之前,irom会先把iram的起始4个地址分别写上⼀定的内容(不过通常只写0x00地址为BL1所占空间的⼤⼩(⼀般是8k),⽽其他三个地址全写为0),把BL1这段代码拷贝到iram后,irom的使命就快要完成了,irom的最后⼀个任务就是把pc指针指向放BL1的那块地址的起始位置,然后就按照这个地址的指令开始执⾏。
单片机程序烧录的3种方式(ISP、ICP、IAP)是什么?
单片机程序烧录的3种方式(ISP、ICP、IAP)是什么?说起给单片机烧录程序,大家应该都不陌生吧,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。
这种方式,通过串口连接单片机,选择一个合适的波特率就可以烧录了。
后来学习STM32,编程时使用KEIL软件自带的下载按钮就能下载程序,方便了不少,但需要额外使用J-Link等下载器。
再后来,接触到产品研发,给已经发布出的产品升级,都是要靠远程无线升级的(想想看,产品已经到客户那里了,当软件需要升级时,要是还使用有线的方式烧录程序,得有多麻烦)既然给单片机烧录程序的方式有多种,那烧录方式具体怎么分类呢?可以分为3种:•ISP(In-System Programming)在系统编程,使用引导程序(Bootloader)加上外围UART/SPI等接口进行烧录。
•ICP (In-circuit programmer)在电路编程,使用SWD/JTAG接口。
•IAP(In-Application Programming)指MCU可以在系统中获取新代码并对自己重新编程,即用程序来改变程序。
这3种烧录方式的原理是什么呢?在分析原理之前,需要先了解一下单片机Flash的访问地址,看看程序是烧录到哪个位置了。
单片机Flash在地址映射表中位置下图是一张STM32F4xx的地址映射表,从0x0000 0000到0xFFFF FFFF,总计4Gbyte。
单片机的片上Flash、片上RAM、片上外设以及外部扩展接口的访问地址,都被映射到这4Gbyte的范围之内。
这张图中,我们需要先注意下半部分•Main memory 主存储区通常,我们编写的代码,是放到主存储区的起始位置(0x0800 0000)开始运行的,烧录程序时,直接将程序烧录到这里即可(KEIL 软件给STM32烧录程序的默认烧写地址就是0x0800 0000开始)•System memory系统存储区System memory(起始位置0x1FFF 000)是STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。
认识IAR开发环境下的.icf文件(amoBBS阿莫电子论坛)
认识IAR开发环境下的.icf文件(amoBBS阿莫电子论坛)展开全文本帖最后由 tmfwt 于 2013-4-23 13:33 编辑IAR 开发环境下使用 .icf文件定义 MCU及其外扩资源的应用范围,这些在项目设计之前必须被确定下来。
所以认识它非常重要。
那么该文件是如何定义的呢?下面通过一个.icf来认识其具体结构:这是一个基于STM32芯片的.icf文件定义结构:/*###ICF### Section handled by ICF editor, don't touch! ****//*-Editor annotation file-*//*IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.x ml" *//********************************-Specials-************************************//*由于STM32内部flash的起始地址为 0x08000000, 所以如下语句定义程序的起始地址,但对于一个应用程序,其起始运行地址不一定是芯片定义的初地址,其可根据实际需要修改,当修改后,必须特殊设计一段引导代码使其能跳到应用程序中来。
由于作者的系统的APP 起始地址为0x08008000 ,所以我的应用程序app start addrress 定义如下:*/define symbol __ICFEDIT_intvec_start__ = 0x08008000;/********************************-Memory Regions-******************************//* 定义内部FLASH地址 */define symbol __ICFEDIT_region_ROM_start__ = 0x08008000;define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;/* 定义内部RAM地址 */define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF;/* 定义扩展RAM地址 */define symbol __ICFEDIT_region_EXRAM_start__ = 0x68000000;define symbol __ICFEDIT_region_EXRAM_end__ = 0x68040000;/*********************************-Sizes-***************************************//* 栈和堆大小,一般不需要修改 */define symbol __ICFEDIT_size_cstack__ = 0x400;define symbol __ICFEDIT_size_heap__ = 0x200;/******************************* End of ICF editor section. ###ICF###***********/define memory mem with size = 4G;define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };/*定义内部 RAM ROM, 以及外部RAM 地址范围 */define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to__ICFEDIT_region_RAM_end__];define region EXRAM_region = mem:[from __ICFEDIT_region_EXRAM_start__ to __ICFEDIT_region_EXRAM_end__];/**************************************************************** *****************Define Bootloader address*************************************************************** ******************//* 这段语句相当于一个标志位,使的以ILOADER 声明的代码放在如下空间内,具体声明方式如下:#pragma location = "ILOADER"__root const unsigned char RBL_Code[] = {0x00, 0x04, 0x00, 0x20, 0x85, 0x2C, 0x00, 0x08, 0x9D, 0x2C, 0x00, 0x08, 0x9F, 0x2C, 0x00, 0x08,0xA1, 0x2C, 0x00, 0x08, 0xA3, 0x2C, 0x00, 0x08, 0xA5, 0x2C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x2C, 0x00, 0x08,};*/define region ILOADER_region = mem:[from 0x08000000 to 0x08003FFF];place in ILOADER_region { readonly section ILOADER };/************************************************************** *****************//* 下列语句定义所定义地址空间内可完成的操作类型*/initialize by copy { readwrite };do not initialize { section .noinit };place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };place in ROM_region { readonly };place in RAM_region { readwrite,block CSTACK, block HEAP };/* 对外部RAM操作类型的声明 */place in EXRAM_region {readwrite data section SDRAM }; /* EXTSRAM_region *//* 定义一个标志位,代表扩展RAM的起始地址,可以再应用函数中直接调用SDRAM_BASE_ADDR 这个变量 */define exported symbol SDRAM_BASE_ADDR = __ICFEDIT_region_EXRAM_start__;/******************************* End of this file ******************************/。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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需要增加一个检查临时存储区的动作,为了避免重复升级,升级完成后,还要擦除临时存储区。
这是我正在使用的方法,如果各位有更好的方法,欢迎提出来。