启动代码了

启动代码了
启动代码了

看了好几天的启动代码了,终于把大部分的东西都看懂了,在此整理下自己对TQ2440开发

板启动代码的理解(参考了网上找的一些资料),并贴出来供大家看一下,希望对大家有帮助,如果有什么错了的地方,也请大家不吝赐教。

;=========================================

; NAME: 2440INIT.S

; DESC: C start up codes

; Configure memory, ISR ,stacks

; Initialize C-variables

;=========================================

启动代码主要是在主程序运行之前初始化系统硬件及软件的运行环境,它的主要功能包括以下的几个方面:

1、建立中断向量表

2、初始化系统堆栈

3、应用程序执行环境初始化

4 跳转至主函数

接下来对各个部分进行分析

;GET 是包含头文件的意思,相当于C语言中的include,是将一个源文件包含到当前源文

件中,并将被包含的文件在其当前位置进行汇编处理

GET option.inc ;option.inc文件包含了开发板的配置信息—堆栈、时钟等

GET memcfg.inc ;存储控制文件

GET 2440addr.inc ;寄存器地址地址定义

BIT_SELFREFRESH EQU (1<<22) ;SDRAM自刷新标志位

;预定义的工作模式

;ARM 有7 种模式,用户模式,快速中断模式,中断模式,管理模式,中止模式,未定

;义模式和系统模式。系统堆栈的初始化主要是给各个处理器模式分配堆栈空间。堆栈是为;中断或程序跳转服务的,当发生中断或程序跳转时,需要将当前处理器的状态及一些参数;保持在堆栈中,当中断处理完毕以后或程序执行完后返回时,再将堆栈保存的现场数据进;行恢复,以保证原来的程序正确运行

;Pre-defined constants

USERMODE EQU 0x10 ;用户模式

FIQMODE EQU 0x11 ;快速中断模式

IRQMODE EQU 0x12 ;中断模式

SVCMODE EQU 0x13 ;管理模式

ABORTMODE EQU 0x17 ;中止模式

UNDEFMODE EQU 0x1b ;未定义模式

MODEMASK EQU 0x1f ;模式掩码

NOINT EQU 0xc0 ;无中断模式

;The location of stacks

;定义各种模式下使用的堆栈起始地址,_STACK_BASEADDRESS是由option.inc定义的UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~ UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~

AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~ IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~ FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~

;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.

; 判断是否THUMB指令

; [ 代表IF,| 指的是ELSE,] 相当于ENDIF

GBLL THUMBCODE ;定义一个局部变量THUMBCODE

[ {CONFIG} = 16 ;如果是16位代码,则将THUMBCODE设为真THUMBCODE SETL {TRUE} ;

CODE32 ;否则是ARM指令

|

THUMBCODE SETL {FALSE}

]

; 宏定义,用于子程序的返回

MACRO

MOV_PC_LR

[ THUMBCODE ;如果目标地址是THUMB的指令,则跳到THUMB地址

bx lr ;在ARM模式中,要用BX指令跳转到THUMB指令,并转换模式

|

mov pc,lr ;如果目标地址是ARM指令,则直接把函数返回地址给PC

]

MEND

MACRO

MOVEQ_PC_LR ;带条件的函数返回,与MOV_PC_LR类似

[ THUMBCODE

bxeq lr

|

moveq pc,lr

]

MEND

PS:下面这一段是网上找的,我觉得它已经介绍的非常好了,所以就直接拿过来用来,呵呵

;===============================================================

;下面这个宏是用于第一次查表过程的实现中断向量的重定向,你会发现

;在_ISR_STARTADDRESS=0x33FF_FF00里定义的第一级中断向量表

;是采用型如Handle***的方式的. 而在程序的ENTRY处(程序开始处)采用的是

;b Handler***的方式.

;在这里Handler***就是通过HANDLER这个宏和Handle***进立联系的.

;这种方式的优点就是正真定义的向量数据在内存空间里,而不是在ENTRY处

;的ROM(FLASH)空间里, 这样,我们就可以在程序里灵活的改动向量的数据了.

;其中HANDLER是一个宏,用于查找中断处理程序的入口地址。这些地址存放在

;由HandleXXX指向的表项中,该表定位在RAM高端,基地址为_ISR_STARTADDRESS。;假如_ISR_STARTADDRESS为0x800000000,当IRQ中断时,根据b HandlerFIQ,先跳转;再根据^ _ISR_STARTADDRESS基地址+HandleIRQ 的偏移地址(4*6)得到的中断地址

;0x80000000+0x00000024=0x80000024

;=============================================================== MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

sub sp,sp,#4 ;decrement sp(to store jump address)

stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)

ldr r0,=$HandleLabel;load the address of HandleXXX to r0

ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX

str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

MEND

;IMPORT指令类似于C语言的extern关键字,下面这些古怪的变量是由编译器生成的IMPORT |Image$$RO$$Base| ; Base of ROM code,即代码开始的地方

IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)

IMPORT |Image$$RW$$Base| ; Base of RAM to initialise,RAM起始地址

IMPORT |Image$$ZI$$Base| ; Base and limit of area初始化的起始地址

IMPORT |Image$$ZI$$Limit| ; to zero initialise初始化的结束地址

;===============================================================

107 ;在这里用IMPORT伪指令(和c语言的extren一样)引入外部变量MMU的快速总线108 ;模式和异步总线模式两个变量

109 ;=============================================================== IMPORT MMU_SetAsyncBusMode

IMPORT MMU_SetFastBusMode ;

IMPORT Main ; The main entry of mon program

IMPORT RdNF2SDRAM ; Copy Image from Nand Flash to SDRAM

初始化程序中必须指明入口地址,因为处理器复位(仿真时,装载image)后PC 要找到

入口开始执行代码,当各种异常或是中断产生的时候也要找到各个异常的入口开始执行代码。从这里开始就是真正的代码入口了!

AREA Init,CODE,READONLY;声明一个名为Init的代码段,

ENTRY 程序的入口点,(调试用)

;ENTRY只是定义一个普通的入口点,且在程序中可以多处定义,如果要使用它作为整

个映像文件的唯一入口点,还需要设置链接器中的相关选项。

EXPORT __ENTRY

__ENTRY

ResetEntry ;复位后的入口

;1)The code, which converts to Big-endian, should be in little endian code.

;2)The following little endian code will be compiled in Big-Endian mode.

; The code byte order should be changed as the memory bus width.

;3)The pseudo instruction,DCD can not be used here because the linker generates error.

ASSERT :DEF:ENDIAN_CHANGE

[ ENDIAN_CHANGE

ASSERT :DEF:ENTRY_BUS_WIDTH

;如果没有定义ENTRY_BUS_WIDTH就报错

[ ENTRY_BUS_WIDTH=32

b ChangeBigEndian ;DCD 0xea000007

]

[ ENTRY_BUS_WIDTH=16

andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00

]

[ ENTRY_BUS_WIDTH=8

streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea

]

|

b ResetHandler;复位异常,开发板上电或复位时进入0x00

]

中断向量表一般位于启动代码的开始部分,它是用户程序与启动代码之间以及启动代码

的各部分之间联系的纽带。它由一个一个的跳转函数组成,它就象一个普通的散转函数,只不过散转的过程中有硬件机制参与,当系统发生异常时,ARM 处理器会通过硬件机制强制将PC 指针指向中断向量表中对应的异常跳转函数存储的地址,然后程序会跳转到相应的

断服务程序去执行。

b HandlerUndef ;handler for Undefined mode 未定义异常,遇到无法识别的指令时0x04

b HandlerSWI ;handler for SWI interrupt,软中断异常0x08

b HandlerPabort ;handler for PAbort指令预取错误时进入0x0c

b HandlerDabort ;handler for DAbort数据访问不能完成时进入0x10

b . ;reserved, 保留0x14

b HandlerIRQ ;handler for IRQ interrupt发生IRQ 中断时进入0x18

b HandlerFIQ ;handler for FIQ interrupt发生FIQ 中断时进入0x1c

;@0x20

b EnterPWDN ; Must be @0x20.

158 ;=============================================================== 159 ;下面是改变大小端的程序,这里采用直接定义机器码的方式,至说为什么这么做

160 ;就得问三星了反正我们程序里这段代码也不会去执行,不用去管它

161 ;=============================================================== ChangeBigEndian

;@0x24

[ ENTRY_BUS_WIDTH=32

DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0

DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80; //Big-endian

DCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0 ]

[ ENTRY_BUS_WIDTH=16

DCD 0x0f10ee11

DCD 0x0080e380

DCD 0x0f10ee01

]

[ ENTRY_BUS_WIDTH=8

DCD 0x100f11ee

DCD 0x800080e3

DCD 0x100f01ee

]

DCD 0xffffffff ;swinv 0xffffff is similar with NOP and run well in both endian mode.

DCD 0xffffffff

DCD 0xffffffff

DCD 0xffffffff

DCD 0xffffffff

b ResetHandler

;如第前面所说,这里采用HANDLER宏去建立Hander***和Handle***之间的联系HandlerFIQ HANDLER HandleFIQ

Ha ndlerIRQ HANDLER HandleIRQ

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

IsrIRQ

sub sp,sp,#4 ;reserved for PC,给PC寄存器保留

stmfd sp!,{r8-r9};工作寄存器入栈保护

ldr r9,=INTOFFSET;INTOFFSET在2440addr.inc中定义

ldr r9,[r9]

ldr r8,=HandleEINT0;HandleEINT0 的地址就是中断的入口地址

add r8,r8,r9,lsl #2;逻辑左移就相当于乘以4

ldr r8,[r8]

str r8,[sp,#8]

ldmfd sp!,{r8-r9,pc},将地址从堆栈中弹出给PC

LTORG

;用于声明一个数据缓冲池

;=======

上电和复位后,程序开始从位于0x0 执行b ResetHandler 程序跳转到这里执行,将看门狗,中断之类的程序关掉,以免打扰初始化程序的进行。

; ENTRY

;=======

ResetHandler

ldr r0,=WTCON ;watch dog disable

ldr r1,=0x0

str r1,[r0]

WTCON 为看门狗控制寄存器,此处将其写入0x0,就是禁止它的所有功能,包括定时

器定时,溢出中断及溢出复位。

ldr r0,=INTMSK

ldr r1,=0xffffffff ;all interrupt disable

str r1,[r0]

INTMSK 为中断屏蔽寄存器,写入0xffffffff,就是禁止所有的中断产生,因为中断

向量表还未初始化,如果此时产生中断会使程序进入未知的状态而跑飞。因为外设的中断太多,INTMSK 不够用,还需要INTSUBMSK 来将剩余的中断源也禁止掉。

ldr r0,=INTSUBMSK

ldr r1,=0x7fff ;all sub interrupt disable

str r1,[r0]

[ {FALSE} ;亮灯用的,可以用来调试用

;rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);

; Led_Display

ldr r0,=GPBCON

ldr r1,=0x155500

str r1,[r0]

ldr r0,=GPBDAT

ldr r1,=0x0

str r1,[r0]

]

;To reduce PLL lock time, adjust the LOCKTIME register.

ldr r0,=LOCKTIME;设置pll 锁定时间

ldr r1,=0xffffff

str r1,[r0]

LOCKTIME 为PLL 锁定时间计数寄存器,重新设定分频值时,PLL 进入锁定,输出稳定频率的时钟需要一定的时间。这里设置成默认的值,以满足锁定的要求。

[ PLL_ON_START

; Added for confirm clock divide. for 2440.

; Setting value Fclk:Hclk:Pclk

ldr r0,=CLKDIVN;用于设定FCLK,HCLK和PCLK的比例

ldr r1,=CLKDIV_VAL ; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6.,在option.inc中有定义

str r1,[r0]

;program has not been copied, so use these directly

[ CLKDIV_VAL>1 ; means Fclk:Hclk is not 1:1.

mrc p15,0,r0,c1,c0,0

orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA

mcr p15,0,r0,c1,c0,0

|

mrc p15,0,r0,c1,c0,0

bic r0,r0,#0xc0000000;R1_iA:OR:R1_nF

mcr p15,0,r0,c1,c0,0

]

;Configure UPLL

ldr r0,=UPLLCON

ldr

r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV) ;Fin = 12.0MHz,

UCLK = 48MHz

str r1,[r0]

nop ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed. ;在UPP 设定之后,必须等待7 个时钟的延迟,设定才会有效

nop

nop

nop

nop

nop

nop

;Configure MPLL,设置MPLL

ldr r0,=MPLLCON

ldr

r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin = 12.0MHz, FCLK = 400MHz

str r1,[r0]

]

;查看是否是由睡眠状态启动,如果是则跳转到WAKEUP_SLEEP状态

;Check if the boot is caused by the wake-up from SLEEP mode.

ldr r1,=GSTATUS2

tst r0,#0x2

;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.

bne WAKEUP_SLEEP

EXPORT StartPointAfterSleepWakeUp

StartPointAfterSleepWakeUp

初始化内存控制器其实就是对S3C2440 的memory bank 进行设置,使其扩展的存储器

或外部设备能够被处理器通过内存控制器正确读写。由于S3C2440 的最终应用程序是在SDRAM(bank6)中运行,并与C 语言变量等的用户数据,各种模式的堆栈,中断向量表,都被定位在SDRAM 的空间,所以它必须在涉及这些处理之前完成初始化工作。

;Set memory control registers

;ldr r0,=SMRDATA

adrl r0, SMRDATA ;be careful!

ldr r1,=BWSCON ;BWSCON Address

add r2, r0, #52 ;End address of SMRDATA

ldr r3, [r0], #4

str r3, [r1], #4

bne %B0

这段是功能寄存器初始化,把13 个存储控制器的内容批量的读取到了对应的特殊功能

寄存器中,首先是下面有一个数据区SMRDATA,在程序的后面有定义,这个数据区给13 个寄存器分配52 字节的地址空间。在上面的代码中,r0 是这个数据区的起始地址,r2 是数据区的结束地址,r1 是寄存器的起始地址。这样,用一个判断语句就可以把内存中的数据赋给这13 个存储控制寄存器了。

STM32启动文件详解

STM32启动文件详解 (2012-07-28 11:22:34) 转载▼ 分类:STM32 标签: stm32 启动 在<>,用的是STM32F103RBT6,所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。比如,如果你用的 STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无**常使用。又比如,你TIM1~4的中断可以正常使用,而5~8的,则无法使用。 而在固件库里出现3个文件 startup_stm32f10x_ld.s startup_stm32f10x_md.s startup_stm32f10x_hd.s 其中,ld.s适用于小容量产品;md.s适用于中等容量产品;hd适用于大容量产品; 这里的容量是指FLASH的大小.判断方法如下: 小容量:FLASH≤32K 中容量:64K≤FLASH≤128K 大容量:256K≤FLASH ;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_hd.s ;* Author : MCD Application Team ;* Version : V3.5.0 ;* Date : 11-March-2011 ;* Description : STM32F10x High Density Devices vector table for MDK-ARM ;* toolchain. ;* This module performs: ;* - Set the initial SP ;* - Set the initial PC == Reset_Handler ;* - Set the vector table entries with the exceptions ISR address ;* - Configure the clock system and also configure the external ;* SRAM mounted on STM3210E-EVAL board to be used as data ;* memory (optional, to be enabled by user) ;* - Branches to __main in the C library (which eventually ;* calls main()). ;* After Reset the CortexM3 processor is in Thread mode,

如何编写ARM7的启动代码

如何编写ARM7的启动代码(LPC2119为例) 随着生活水平的提高和IT技术的进步,8位处理器的处理能力已经不能满足嵌入式系统的需要了;而16位处理器在性能和成本上都没有很大的突破。并且在8位机的开发中,大多使用汇编语言来编写用户程序。这使得程序的可维护性、易移植性等都受到了极大的挑战。正是基于此,ARM 公司适时的推出了一系列的32位嵌入式微控制器。目前广泛使用的是ARM7和ARM9系列,ARM7TDMI内核的ARM7处理器广泛应用于工业控制、仪器仪表、汽车电子、通讯、消费电子等嵌入式设备。本文主要以philips 公司ARM7TDMI核的LPC2119为例来分析如何编写ARM7的启动代码。 1、启动代码 在嵌入式系统软件的开发中,应用程序通常是在嵌入式操作系统的开发平台上采用C语言编写的。然而,在ARM系统上电复位后,需要设置中断向量表、初始化各模式堆栈、设置系统时钟频率等,而这些过程都是针对

ARM内部寄存器结构的操作,用C语言编程是很难实现的。因此在转到应用程序的c/c++编写之前,需要用ARM的汇编语言编写启动代码,由启动代码完成系统初始化以及跳转到用户C程序。在ARM设计开发中,启动代码的编写是一个极重要的过程。然而启动代码随具体的目标系统和开发系统有所区别,但通常包含以下部分: ·向量表定义 ·地址重映射及中断向量表的转移 ·堆栈初始化 ·设置系统时钟频率 ·中断寄存器的初始化 ·进入C应用程序 下面就结合PHILIPS的LPC2119的启动代码来分析与说明ARM7处理器的启动代码的编写。 1.1向量表定义 ARM芯片上电或复位后,系统进入管理模式、ARM状态、PC(R15)指向0x00000000地址处。中断向量表为每一个中断设置1个字的存储空间,存放一条跳转指令,通过这条指令使PC指针指向相应的中断服务程序入口,继而执行相应的中断处理程序。LPC2219的中断向量表和其它基于ARM核的芯片中断向量表较类似,只要注意LPC2219要使向量表所有数据32位累加和为零(0x00000000-0x0000001C的8个字的机器码累加), 才能使用户的程序脱机运行。 1.2 地址重映射及中断向量表的转移 ARM7处理器在复位后从地址0读取第一条指令并执行,因此系统上电后地址0必须是非易失的ROM/FLASH,这样才能保证处理器有正确可用的指令。为了加快对中断的处理以及实现在不同操作系统模式下对中断的处

UBOOT命令详解

常用U-boot命令详解(z) 2010-09-30 15:05:52| 分类:学习心得体会|字号订阅 U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,在我编译的 U-boot-2009.11中的命令行模式模式下支持“Tab”键的命令补全和命令的历史记录功能。而且如果你输入的命令的前几个字符和别的命令不重复,那么你就只需要打这几个字符即可,比如我想看这个U-boot的版本号,命令就是“ version”,但是在所有的命令中没有其他任何一个的命令是由“v”开头的,所以只需要输入“v”即可。 [u-boot@MINI2440]# version U-Boot 2009.11 ( 4月04 2010 - 12:09:25) [u-boot@MINI2440]# v U-Boot 2009.11 ( 4月04 2010 - 12:09:25) [u-boot@MINI2440]# base Base Address: 0x00000000 [u-boot@MINI2440]# ba Base Address: 0x00000000 由于U-boot支持的命令实在太多,一个一个细讲不现实,也没有必要。所以下面我挑一些烧写和引导常用命令介绍一下,其他的命令大家就举一反三,或者“help”吧! (1)获取帮助 命令:help 或? 功能:查看当前U-boot版本中支持的所有命令。 [u-boot@MINI2440]#help ?- alias for'help' askenv - get environment variables from stdin base - print or set address offset bdinfo - print Board Info structure bmp - manipulate BMP image data boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootelf - Boot from an ELF image in memory bootm - boot application image from memory bootp - boot image via network using BOOTP/TFTP protocol

AB罗克韦尔软启动器维修的详细介绍

Ab系列功率可大可小,电路板设计也千差万别,有的规整,也有的零落,不同框架决定不同的功率容量。说明书都不一样,故障报警先跳出主代码,然后才是子代码,交代故障提示,接下来就为大家详细的讲解一下,希望对大家有所帮助。 主故障代码套子代码,大大小小几百条,没上过手,还真的可以搞得你一头雾水,这种模式德国的产品也玩,上面说欧洲产品,这个ab700h变频器,还真有点渊源的。大家有没有发现ab700h和nxp系列变频器有几分脸熟。工业设备的东西是共享共通的,比如伦茨和库卡,鲍米勒和海德堡,富士和发那科,强强联手,软硬件的结合,成就了品牌的声誉。 故障现象是这样,上电正常自检通过,五分钟后跳故障f10,子代码273,刚开机的时候可以复位,但随着时间延长,故障无法复位。往后查询故障记录,子代码2068和273交替出现。 Ab700h大功率变频器采用光纤驱动,隔离的方式驱动功率级,不同的功率组件采用并联驱动。(这点人家abb就高明一些,直接两条光纤+一根电源线,

即简化了电路,性能还出奇的稳定)。 所以严格的说,ab700h变频器只是驱动采用了光纤驱动,而驱动组模上必要的检测电路还是通过模拟接口完成的。作为维修人员,这点很重要,这是判断故障点的分水岭!上半部分硬件有:小信号处理板,控制板,I/o板。通讯,板卡,eeprom等故障由上半部分完成。下半部分硬件包括驱动板,功率单元。电流检测、母线检测、相位检测、温度检测、驱动电源检测都在下半部分完成。 杭州联凯机电工程有限公司成立于2011年,是一家专业从事工业自动化设备销售、维护及电气系统维修改造的高科技公司。主要经营西门子(SIEMENS)ABB、施耐德(Schneider)等品牌的变频器、直流调速器、软启动器、PLC、触摸屏、数控系统、单片机、电路板等各种进口工业仪器设备,服务中心配备了百万备品备件以及完备的诊断检测仪器和软件诊断技术,拥有一支技术精湛、经验丰富的技术团队。

电脑启动过程详解!!!

电脑启动过程详解 1.当按下电源开关时,电源就开始向主板和其它设备供电,这时电压还不太稳定,主板上的控制芯片组会向CPU发生并保持一个RESET(重置)信号,让CPU内部自动恢复到初始状态,但CPU在些刻不会马上执行指令,当芯片组检查到电源已经开始稳定供电了(当然从不稳定,到稳定的过程只是一瞬间的事情)它便撤去RESET信号(如果是手工按下电脑面板上的RESET按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号)CPU马上从地址FFFF0H处开始执行指令,这个地址实际在系统BIOS的地址范围内, 无论是Award BIOS,还是AMI BIOS,在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。 2.系统BIOS的启动代码首先要做的事情就进行POST(Power-On Self Test,加电后自检),POST的主要任务是检查系统中一些关键设备是否存在和是否正常工作,例如内存和显卡等设备.由于POST是最早进行的检查过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了些致命错误,例如没有找到内存或内存有问题 (此时只会检查640KB常规内存),那么系统BIOS就会直接控制嗽叭发生声音来报告错误,声音的长短和次数代表了错误的类型.在正常情况下,POST过程进行的非常快,我们几乎无法感觉到它的存在,POST结束之后就会调用其它代码来进行更完整的硬件检测。 3.接下来系统BIOS将查找显卡的BIOS,前面说过,存放显卡BIOS的ROM芯片的超始地址通常设在 C0000H,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码来初始化显卡,此时多数显卡都在屏幕上显示出一些初始化信息,介绍生产厂商,图形芯片类型等内容,不过这个画面几乎是一闪而过,系统BIOS接着会查找其它设备的BIOS程序,找到之后同样会调用这些BIOS内部的初始化代码来初始化相关的设备。 4.查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BISO的类型,序列号和版本号等内容. 5.接着系统BIOS将检查和显示CPU的类型和工作频率,然后开始测试所有RAM,并同时在屏莫显示内存测试的速度,用户可以在CMOS设置中自行决定使用简单耗时少或详细耗时多的测试方式. 6.内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘,CD-ROM,串口,并口,软驱等设备,另外绝大数较新版本的系统BIOS在这一过程中还要自动检测和设置内存的定时参数,硬盘参数和访问模式等. 7.标准设备检查完毕后,系统BIOS内部的支持即插即用的代码将开始检测和配置系统中安装的的即插即用设备,每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断,DMA通道和I/O端口等资源。 8.到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格,其它概略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数。 9.接下来系统BIOS会更新ESCD(Extended system configuration data,扩展系统配置数据.)ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS之中,通常ESCD数据只在系统配置发生改变后才会更新,所以不是每次启动电脑时都能够看到"updata ESCD … Success"这样的信息, 不过某些主板的系统BIOS在保存ESCD数据时使用了与widnwos 9x不相同的数据格式,于是widnwos 9x在启动过程中会把ESCD数据修改成自己的格式,但在下一次启动时,既使硬件配置没有发生改变,系统BIOS也会把ESCD的数据格式修改回来,如此循环,将会导致在每次启动电脑时,系统BIOS都要更新一遍ESCD,这就是为什么有些机器在每次启动时都会显示出相关信息的原因。 10.ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作,即根据用户指定的启动顺序从软件,硬件或光驱启动,以从C盘启动为例,系统BIOS将读取并执行硬盘上的主引导记录,主引导记录接着从分区表中找到第一个活动分区,然后读取并执行这个活动分区的引导记录,而分区引导记录将负责读取并执行 IO.SYS这是DOS和widnows 9x的IO.SYS(或NT的NTLDR)首先要初始化一些重要的系统数据,然后将显示出我们熟悉的蓝天白云,在这幅画面之下,widnwos 将继续进行DOS部分和GUI(图形用户界面)部分的引导和初始化工作. 上面介绍的便是电脑在打开电源开关(或按RESET)进行冷启动时所要完成的各种初始化工作,如果在DOS 下按Ctrl Alt DEL组合键,(或从windows中选择重新启动电脑)来进行热启动,那么POST过程将被跳过去,

启动代码startups分析

启动代码start.s(相当于bootloader的前端代码),开机就执行的代码,即0x0000处放置的代码。给CPU一个合适的工作环境。面向CPU内核和外围硬件,所以一般用汇编编写。 1、在起始地址分配中断向量表即中断处理函数(CPU要求的),以为向量空间只有4字节,所以一般只是一个跳转指令,去别处执行。 2、之后初始化存储器系统 3、初始多个模式下的堆栈(模式切换时,硬件给SP置位) 4、初始化有特殊要求的外围设备,如LED灯、看门狗 5、初始化用户的执行环境(在FLASH中运行太慢了,把代码整体搬迁到RAM中) 6、切换处理器的工作模式 7、调用主程序 (没见到有存储控制器的配置代码,也没见到有时钟初始化代码) 下面分析,所给的2410的启动代码实现了以上的那些功能,实现得显然不全,或者不需要,或者在工程代码的其它部分实现。 读程序时注意,所有程序都是逐行顺序执行的,要看清跳转指令。 GET 2410addr.s //用到了2410addr.s中的寄存器地址宏定义 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Some ARM920 CPSR bit discriptions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Pre-defined constants//预定义的变量,一下后续代码中使用方便,与CPSR相关USERMODE EQU 0x10 FIQMODE EQU 0x11 IRQMODE EQU 0x12 SVCMODE EQU 0x13 ABORTMODE EQU 0x17 UNDEFMODE EQU 0x1b MODEMASK EQU 0x1f NOINT EQU 0xc0 I_Bit * 0x80 F_Bit * 0x40 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; MMU Register discription ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;p15 CP 15 ;c0 CN 0 ;c1 CN 1 ;c2 CN 2 ;c3 CN 3

UBoot移植详解

u-boot 移植步骤详解 1 U-Boot简介 U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux 系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。 选择U-Boot的理由: ①开放源码; ②支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; ③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; ④较高的可靠性和稳定性; ④较高的可靠性和稳定性; ⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; ⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; ⑦较为丰富的开发调试文档与强大的网络技术支持; 2 U-Boot主要目录结构 - board 目标板相关文件,主要包含SDRAM、FLASH驱动; - common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

软启动器有哪些常见故障及如何处理

软启动器有哪些常见故障及如何处理 当电机起动过程中,软起动器按照预先设定的起动曲线增加电机的端电压使电机平滑加速,从而减少了电机起动时对电网、电机本身、相连设备的电气及机械冲击。当电机达到正常转速后,旁路接触器接通。电机起动完毕后,软起动器继续监控电机并提供各种故障保护。 1、在调试过程中出现起动报缺相故障,软起动器故障灯亮,电机没反应。出现故障的原因可能是: ①起动方式采用带电方式时,操作顺序有误。(正确操作顺序应为先送主电源,后送控制电源) ②电源缺相,软起动器保护动作。(检查电源) ③软起动器的输出端未接负载。(输出端接上负载后软起动器才能正常工作) 2、用户在使用过程中出现起动完毕,旁路接触器不吸合现象。故障原因可能是: ①在起动过程中,保护装置因整定偏小出现误动作。(将保护装置重新整定即可) ②在调试时,软起动器的参数设置不合理。(主要针对的是55KW 以下的软起动器,对软起动器的参数重新设置) ③控制线路接触不良。(检查控制线路) 3、用户在起动过程中,偶尔有出现跳空气开关的现象。故障原因有: ①空气开关长延时的整定值过小或者是空气开关选型和电机不

配。(空气开关的参数适量放大或者空气开关重新选型) ②软起动器的起始电压参数设置过高或者起动时间过长。(根据负载情况将起始电压适当调小或者起动时间适当缩短) ③在起动过程中因电网电压波动比较大,易引起软起动器发出错误指令,出现提前旁路现象。(建议用户不要同时起动大功率的电机) ④起动时满负载起动。(起动时尽量减轻负载) 4、用户在使用软起动器时出现显示屏无显示或者是出现乱码,软起动器不工作。故障原因可能是: ①软起动器在使用过程中因外部元件所产生的震动使软起动器内部连线震松。(打开软起动器的面盖将显示屏连线重新插紧即可) ②软起动器控制板故障。(和厂家联系更换控制板) 5、软起动器在起动时报故障,软起动器不工作,电机没有反应。故障原因可能为: ①电机缺相。(检查电机和外围电路) ②软起动器内主元件可控硅短路。(检查电机以及电网电压是否有异常。和厂家联系更换可控硅) ③滤波板击穿短路。(更换滤波板即可) 6、软起动器在起动负载时,出现起动超时现象。软起动器停止工作,电机自由停车。故障原因有: ①参数设置不合理。(重新整定参数,起始电压适当升高,时间适当加长) ②起动时满负载起动。(起动时应尽量减轻负载)

keil下C51启动代码详解

由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下: ;--------------------------------------------------- ;startup.A51: 用户上电初始化程序 ;---------------------------------------------------- ; ;使用以下EQU命令可定义在CPU复位时需要用0进行初始化的内存空间 ; ;IDA TA存储器的空间的绝对起始地址总是零 IDA TALEN EQU 80H ;需用0进行初始化的IDA TA存储器空间的字节数 ; XDA TASTART EQU 0H ;XDA TA存储器空间的绝对起始地址 XDA TALEN EQU 0H ;需用0进行初始化的XDA TA存储器的空间字节数 ; PDA TASTART EQU 0H ;PDA TA存储器的空间的绝对起始地址 PDA TALEN EQU 0H ;需用0进行初始化的PDA TA存储器的空间字节数 ;注意:IDA TA存储器的空间在物理上包括了8051单片机的DA TA和BIT存储空间 ;至少要保证与C51编译器运行库有关的存储器的空间进行0初始化 ; ;再入函数模拟初始化 ;----------------------------------------------------------- ;以下用EQU指令定义了再入函数模拟堆栈指针的初始化 ; ;使用SMALL存储器模式时再入函数的堆栈空间 IBPSACK EQU 0 ;使用SMALL存储器模式再入函数时将其设置成1 IBPSTACKTOP EQU 0FFH+1 ;将堆栈顶设置为最高地址加1 ; ;使用LARGE存储器模式时再入函数的堆栈空间 XBPSTACK EQU 0 ;使用LARGE存储器模式再入函数时将其设置成1 XBPSTACKTOP WQU 0FFFFH+1 ;将堆栈顶设置为最高地址加1 ; ;使用COMPACT存储器模式时再入函数的堆栈空间 PBPSTACK EQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1 PBPSTACKTOP WQU 0FFFFH+1 ;将堆栈顶设置为最高地址加1 ;;---------------------------------------------------- ;使用COMPACT存储器模式时,64KB X DA TA存储器空间的分页定义 ; ;以下用EQU指令定义PDA TA类型变量在XDA TA存储器空间的页地址 ;使用EQU指令定义PFAGE时必须与L51连接定位器PDA TA指令的控制参数一致 ; PPAGEENABLE EQU 0 ;使用PDA TA类型变量时将其设置成1 PPAGE EQU 0 ;定义页号 ; ;------------------------------------------------ NAME ? C_STARTUP ;模块名为? C_STARTUP ? C_51STARTUP SEGMENT CODE ;代码段 ? STACK SEGMENT IDA TA;堆栈段 RSEG ? STACK ;堆栈 DS 1 EXTRN COE(? C_START) ;程序开始地址

STM32F10x 启动代码文件选择

startup_stm32f10x_xx.s 启动代码文件选择startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xx startup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_hd_vl.s 大容量的STM32F100xx startup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s 小容量的STM32F100xx startup_stm32f10x_md.s 中容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_md_vl.s 中容量的STM32F100xx startup_stm32f10x_xl.s FLASH在512K到1024K字节的STM32F101xx,STM32F102xx,STM32F103xx 固件库中的Release_Notes_for_STM32F10x_CMSIS.html写到: STM32F10x CMSIS Startup files: startup_stm32f10x_xx.s Add new startup files for STM32 Low-density Value line devices: startup_stm32f10x_ld_vl.s Add new startup files for STM32 Medium-density Value line devices: startup_stm32f10x_md_vl.s SystemInit() function is called from startup file (startup_stm32f10x_xx.s) before to branch to applic ation main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file GNU startup file for Low density devices (startup_stm32f10x_ld.s) is updated to fix compilation err ors. 例如我用STM32F103RB,那么选启动文件为startup_stm32f10x_md.s

ARM启动代码研究

ARM启动代码研究 PRESERVE8: 1.1.PRESERVE8: Reguire8和Preserve8 C和汇编有8位对齐的要求,这两个伪指令可以满足此要求,存在REQUIRE8<——> PRESERVE8的对应关系,但不是说有一个REQUIRE8就要有一个PRESERVE8,如果是一个c文件和一个汇编文件的调用,也就涉及一个PRESERVE8或者是一个REQUIRE8. 另外,REQUIRE8和PRESERVE8并不完成8byte对齐的操作,对齐由ALIGN完成。 将ADS的代码移植到KEIL MDK上需要做的修改: 当用户拥有ADS遗留工程的所有源代码时,使用MDK重新编译链接全部代码是最好的解决方法,MDK中的新版本编译工具会重新生成满足堆栈8BYTE对齐要求的目标文件,避免由于堆栈不对齐引起的链接错误. 从ADS到KEIL很重要的一个修改的地方就是这里的8BYTE对齐,想要编译通过,在startup.s 里面我们必须加入PRESERVE8指令,使得寄存器8BYTE对齐. 代码: CODE32 PRESERVE8;这个在KEIL里面是必须的,要求8BYTE对齐.在ADS的启动代码中就没有. AREA vectors,CODE,READONLY 2:ARM的处理器可工作于多种模式,下面设置个模式的一些参数. Mode_USR EQU0x10用户模式 Mode_FIQ EQU0x11快中断模式 Mode_IRQ EQU0x12中断模式 Mode_SVC EQU0x13管理模式

Mode_ABT EQU0x17中止模式 Mode_UND EQU0x1B未定义模式 Mode_SYS EQU0x1F系统模式 参数的由来:这里各个模式的参数是由寄存器CPSR的模式位设置M[4:0]得来的,比如这里的用户模式,CPSR的M[4:0]设置为10000就是0x10,同理其他.详见<>P47页,CPSR设置很关键! 3: I_Bit EQU0x80;when I bit is set,IRQ is disabled F_Bit EQU0x40;when F bit is set,FIQ is disabled 也和CPSR寄存器的设置有关,这里两位是禁止/开启快速中断和一般中断的设置. 4:各模式下定义的堆栈地址. UND_Stack_Size EQU0x00000000 SVC_Stack_Size EQU0x00000100 ABT_Stack_Size EQU0x00000000 FIQ_Stack_Size EQU0x00000000 IRQ_Stack_Size EQU0x00000100 USR_Stack_Size EQU0x00000200 设置堆栈大小 Stack_Size EQU(UND_Stack_Size+SVC_Stack_Size+ABT_Stack_Size+ FIQ_Stack_Size+IRQ_Stack_Size+USR_Stack_Size) AREA STACK,NOINIT,READWRITE,ALIGN=3 Stack_Mem SPACE Stack_Size

u-boot启动分析

背景: Board →ar7240(ap93) Cpu →mips 1、首先弄清楚什么是u-boot Uboot是德国DENX小组的开发,它用于多种嵌入式CPU的bootloader程序, uboot不仅支持嵌入式linux系统的引导,当前,它还支持其他的很多嵌入式操作系统。 除了PowerPC系列,还支持MIPS,x86,ARM,NIOS,XScale。 2、下载完uboot后解压,在根目录下,有如下重要的信息(目录或者文件): 以下为为每个目录的说明: Board:和一些已有开发板有关的文件。每一个开发板都以一个子目录出现在当前目录中,子目录存放和开发板相关的配置文件。它的每个子文件夹里都有如下文件(以ar7240/ap93为例): Makefile Config.mk Ap93.c 和板子相关的代码 Flash.c Flash操作代码 u-boot.lds 对应的链接文件 common:实现uboot命令行下支持的命令,每一条命令都对应一个文件。例如bootm命令对应就是cmd_bootm.c cpu:与特定CPU架构相关目录,每一款Uboot下支持的CPU在该目录下对应一个子目录,比如有子目录mips等。它的每个子文件夹里都有入下文件: Makefile Config.mk Cpu.c 和处理器相关的代码s Interrupts.c 中断处理代码 Serial.c 串口初始化代码 Start.s 全局开始启动代码 Disk:对磁盘的支持

Doc:文档目录。Uboot有非常完善的文档。 Drivers:Uboot支持的设备驱动程序都放在该目录,比如网卡,支持CFI的Flash,串口和USB等。 Fs:支持的文件系统,Uboot现在支持cramfs、fat、fdos、jffs2和registerfs。 Include:Uboot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目下configs目录有与开发板相关的配置文件,如 ar7240_soc.h。该目录下的asm目录有与CPU体系结构相关的头文件,比如说mips 对应的有asm-mips。 Lib_xxx:与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。 Net:与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。 Tools:生成Uboot的工具,如:mkimage等等。 3、mips架构u-boot启动流程 u-boot的启动过程大致做如下工作: 1、cpu初始化 2、时钟、串口、内存(ddr ram)初始化 3、内存划分、分配栈、数据、配置参数、以及u-boot代码在内存中的位置。 4、对u-boot代码作relocate 5、初始化malloc、flash、pci以及外设(比如,网口) 6、进入命令行或者直接启动Linux kernel 刚一开始由于参考网上代码,我一个劲的对基于smdk2410的板子,arm926ejs的cpu看了N 久,启动过程和这个大致相同。 整个启动中要涉及到四个文件: Start.S →cpu/mips/start.S Cache.S →cpu/mips/cache.S Lowlevel_init.S →board/ar7240/common/lowlevel_init.S Board.c →lib_mips/board.c 整个启动过程分为两个阶段来看: Stage1:系统上电后通过汇编执行代码 Stage2:通过一些列设置搭建了C环境,通过汇编指令跳转到C语言执行. Stage1: 程序从Start.S的_start开始执行.(至于为什么,参考u-boot.lds分析.doc) 先查看start.S文件吧!~ 从_start标记开始会看到一长串莫名奇妙的代码:

软启动器 故障报警解决办法

西门子软启动器故障报警解决办法 [ 2012-08-31 14:24:10 ] 标签:西门子讲座阅读对象:所有人 故障报警解决办法如下: 1、故障-F 01(瞬停): 出现此故障是接线端子7和10开路了,只要导线把接线端子7和10短接起来就可解决。引起此故障的原因一般是由于外部控制接线有误而导致的,如果用户不是特别需要外控的话,我们可以告诉用户只需把软起内部功能代号“9”(控制方式)参数设置成“1”(键盘控制),就可以避免此故障。 2、故障-F 02(起动时间过长): 出现此故障是软起动器的限流值设置得太低而使得软起动器的起动时间过长,在这种情况下,我们可以把软起内部的功能代码“4”(限制起动电流)的参数设置高些,可设置到1.5~2.0倍,必须要注意的是电机功率大小与软起动器的功率大小是否匹配,如果不匹配,在相差很大的情况下,野蛮的把参数设置到4~5倍,起动运行一段时间后会因电流过大而烧坏软起内部的硅模块或是可控硅。 3、故障-F 03(过热): 出现此故障是由于软起动器在短时间内的起动次数过于频繁所致,我们应告诉用户在操作软起时,起动次数每小时不要超过12次。 4、故障-F 04(输入缺相): 引起此故障的因素有很多种,下面列出一些: (1) 检查进线电源与电机接线是否有松脱; (2) 输出是否接上负载,西门子讲座,负载与电机是否匹配; (3) 用万用表检测软起动器的模块或可控硅是否有击穿,及它们的触发门极电阻是否符合正常情况下的要求(一般在20~30欧左右);

(4) 内部的接线插座是否松脱。 以上这些因素都可能导致此故障的发生,只要细心检测并作出正确的判断,就可予以排除。 5、故障-F 05(频率出错): 此故障是由于软起动器在处理内部电源信号时出现了问题,而引起了电源频率出错。出现这种情况需要请教公司的产品开发软件设计工程师来处理。主要着手电源电路设计改善。 6、故障-F 06(参数出错): 出现此故障就需重新开机输入一次出厂值就好了。具体操作:先断掉软起动器控制电(交流220V)用一手指按住软起控制面板上的“PRG”键不放,再送上软起动器的控制电,在约30S后松开“PRG”键,就重新输入好了现厂值。 7、故障-F 07(起动过流): 起动过流是由于负载太重起动电流超出了500%倍而导致的,解决此办法有:把软起内部功能码“0”(起始电压)设置高些,或是再把功能码“1”(上升时间)设置长些,可设为:30~60S。还有功能代码“4”的限流值设置是否适当,一般可成2~3倍。 8、故障-F 08(运行过流): 导致此故障的原因主要可能是软起在运行过程中,由于负载太重而导致模块或可控硅发热进量。可检查负载与软起动器功率大小是否匹配,要尽量做到用多大软起拖多大的电机负载。 9、故障-F 09(输出缺相): 主要是检查进线和出线电缆是否有松脱,软起输出相是否有断相或是电机有损坏。

keil c51中启动代码详细说明

[ 2006-10-27 18:23:00 | By: CHYB_HSH ] 让我们先来看看STARTUP.A51文件(默认设置)吧!根据源文件中的说明文字,我们很容易分析出STARTUP.A51文件的工作方式和作用!让我们把它先汉化一下看看! $NOMOD51;Ax51宏汇编器控制命令:禁止预定义的8051 ;------------------------------------------------------------------------------ ; This file is part of the C51 Compiler package ; Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. ;------------------------------------------------------------------------------ ; STARTUP.A51: This code is executed after processor reset. ; STARTUP.A51: STARTUP.A51文件所生成的代码将在单片机复位后被执行! ; To translate this file use A51 with the following invocation: ; 将按照下面的命令行语句调用A51编译器进行编译产生目标文件 ; A51 STARTUP.A51 ; ; To link the modified STARTUP.OBJ file to your application use the following ; BL51 invocation: ; 将按照下面的命令行语句调用BL51连接器把STARTUP.OBJ定位连接到您的程序代码中; BL51 , STARTUP.OBJ ;; ;------------------------------------------------------------------------------ ; ; User-defined Power-On Initialization of Memory ; 自定义上电后需要初始化的储存区域 ; With the following EQU statements the initialization of memory ; at processor reset can be defined: ; 使用下列EQU伪指令定义初始化的存储区域在单片机复位后定义生效 ; ; the absolute start-address of IDATA memory is always 0 IDATALEN EQU 80H ; the length of IDATA memory in bytes. ; IDATA(间接寻址区)其起始地址固定为0;IDA TALEN用于指定需要初始化 ; 的 IDATA区长度(以字节为单位)* XDATASTART EQU 0H ; the absolute start-address of XDATA memory XDATALEN EQU 0H ; the length of XDA TA memory in bytes. ;XDATA (外部直接寻址区)XDA TASTART用于指定需要初始化的XDA TA区起始地;址 XDATALEN 用于指定需要初始化的XDA TA区长度(以字节为单位)* PDATASTART EQU 0H ; the absolute start-address of PDA TA memory PDATALEN EQU 0H ; the length of PDATA memory in bytes. ;PDA TA(页寻址区)PDATASTART用于指定需要初始化的PDA TA区起始地址;PDATALEN 用于指定需要初始化的;PDATA区长度(以字节为单位)*

UBoot源码分析1

?UBoot源码解析(一)

主要内容 ?分析UBoot是如何引导Linux内核 ?UBoot源码的一阶段解析

BootLoader概念?Boot Loader 就是在操作系统内核运行之前运行 的一段小程序。通过这段小程序,我们可以初始 化硬件设备、建立内存空间的映射图,从而将系 统的软硬件环境带到一个合适的状态,以便为最 终调用操作系统内核准备好正确的环境 ?通常,Boot Loader 是严重地依赖于硬件而实现 的,特别是在嵌入式世界。因此,在嵌入式世界 里建立一个通用的Boot Loader 几乎是不可能的。 尽管如此,我们仍然可以对Boot Loader 归纳出 一些通用的概念来,以指导用户特定的Boot Loader 设计与实现。

UBoot来源?U-Boot 是 Das U-Boot 的简称,其含义是 Universal Boot Loader,是遵循 GPL 条款的开放源码项目。最早德国 DENX 软件工程中心的 Wolfgang Denk 基于 8xxROM 和 FADSROM 的源码创建了 PPCBoot 工程项目,此后不断 添加处理器的支持。而后,Sysgo Gmbh 把 PPCBoot 移 植到 ARM 平台上,创建了 ARMBoot 工程项目。最终, 以 PPCBoot 工程和 ARMBoot 工程为基础,创建了 U- Boot 工程。 ?而今,U-Boot 作为一个主流、通用的 BootLoader,成功地被移植到包括 PowerPC、ARM、X86 、MIPS、NIOS、XScale 等主流体系结构上的百种开发板,成为功能最多、 灵活性最强,并且开发最积极的开源 BootLoader。目前。 U-Boot 仍然由 DENX 的 Wolfgang Denk 维护

相关文档
最新文档