当前位置:首页 > 单片机 > 单片机
[导读]工程里面的头文件2410Init.s包括了板子上电后的初始话,具体有几个步骤:讲述S3C2410启动程序设计1.屏蔽所有中断,关看门狗。2.根据工作频率设置PLL寄存器3.初始化存储控制相关寄存器4.初始化各模式下的栈指针5.设置

工程里面的头文件2410Init.s包括了板子上电后的初始话,具体有几个步骤:

讲述S3C2410启动程序设计

1.屏蔽所有中断,关看门狗。

2.根据工作频率设置PLL寄存器

3.初始化存储控制相关寄存器

4.初始化各模式下的栈指针

5.设置缺省中断处理函数

6.将数据段拷贝到RAM中,将零初始化数据段清零

7.跳转到C语言Main入口函数中

要看懂这个头文件是比较难的,我跟DVD视频的教程看了两遍,弄懂了一些,视频上讲的是ARM7S3C44B0的Init.s但我觉得和2410的差不多。我将这个程序注释了一下。可能有些地方不是很正确,只提供参考。

;=========================================
;NAME:2410INIT.S
;DESC:Cstartupcodes
;Configurememory,ISR,stacks
;InitializeC-variables
;HISTORY:
;2002.02.25:kwtark:ver0.0
;2002.03.20:purnnamu:AddsomefunctionsfortestingSTOP,POWER_OFFmode
;2002.04.10:SJS:subinterruptdisable0x3ff->0x7ff
;2002.11.29:Kong:DCDBANKSIZEResiger0x32->0xb2(ARMcoreburstenable)
;=========================================

INCLUDEoption.inc
INCLUDEmemcfg.inc
INCLUDE2410addr.inc

BIT_SELFREFRESHEQU(1<<22)

;下面是对arm处理器模式寄存器对应值的常数定义,arm处理器中有一个CPSR程序状态寄存器它的后五位决定目前的处理器模式
;pre-definedconstants
USERMODEEQU0x10
FIQMODEEQU0x11
IRQMODEEQU0x12
SVCMODEEQU0x13
ABORTMODEEQU0x17
UNDEFMODEEQU0x1b
MODEMASKEQU0x1f
NOINTEQU0xc0

;Thelocationofstacks
UserStackEQU(_STACK_BASEADDRESS-0x3800);0x33ff4800~
SVCStackEQU(_STACK_BASEADDRESS-0x2800);0x33ff5800~
UndefStackEQU(_STACK_BASEADDRESS-0x2400);0x33ff5c00~
AbortStackEQU(_STACK_BASEADDRESS-0x2000);0x33ff6000~
IRQStackEQU(_STACK_BASEADDRESS-0x1000);0x33ff7000~
FIQStackEQU(_STACK_BASEADDRESS-0x0);0x33ff8000~

;checkiftasm.exeisused.
;arm处理器有两种工作状态1.arm:32位这种工作状态下执行字对准的arm指令2.Thumb:16位这种工作状;态执行半字对准的Thumb指令
;因为处理器分为16位32位两种工作状态程序的编译器也是分16位和32两种编译方式所以下面的程序用;于根据处理器工作状态确定编译器编译方式
;code16伪指令指示汇编编译器后面的指令为16位的thumb指令
;code32伪指令指示汇编编译器后面的指令为32位的arm指令
;这段是为了统一目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译
;Checkiftasm.exe(armasm-16...@ADS1.0)isused.
GBLLTHUMBCODE
[{CONFIG}=16;ifconfig==16这里表示你的目前处于领先地16位编译方式
THUMBCODESETL{TRUE};设置THUMBCODE为true
CODE32;转入32位编译模式
|;else
THUMBCODESETL{FALSE};设置THUMBCODE为false
]

MACRO
MOV_PC_LR
[THUMBCODE
bxlr
|
movpc,lr
]
MEND

MACRO
MOVEQ_PC_LR
[THUMBCODE
bxeqlr
|
moveqpc,lr
]
MEND

;注意下面这段程序是个宏定义很多人对这段程序不理解我再次强调这是一个宏定义所以大家要注意了
;下面包含的HandlerXXXHANDLERHandleXXX将都被下面这段程序展开
;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。
;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。每个字
;空间都有一个标号,以Handle***命名。
;在向量中断模式下使用“加载程序”来执行中断服务程序。
;这里就必须讲一下向量中断模式和非向量中断模式的概念
;向量中断模式是当cpu读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的;
;指令取代0x18处的指令,通过跳转指令系统就直接跳转到对应地址
;函数中节省了中断处理时间提高了中断处理速度标例如ADC中断的向量地址为0xC0,则在0xC0处放如下
;代码:ldrPC,=HandlerADC当ADC中断产生的时候系统会
;自动跳转到HandlerADC函数中
;非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将interrupt
;pending寄存器中对应标志位置位然后跳转到位于0x18处的统一中断
;函数中该函数通过读取interruptpending寄存器中对应标志位来判断中断源并根据优先级关系再跳到
;对应中断源的处理代码中
MACRO
$HandlerLabelHANDLER$HandleLabel
;HandlerLabel为中断服务入口地址
$HandlerLabel
subsp,sp,#4;Decrementsp(tostorejumpaddress)
;将要使用的r0寄存器入栈
stmfdsp!,{r0};pUSHtheworkregistertostack(lrdoes'tpushbecauseitreturntooriginaladdress)
ldrr0,=$HandleLabel;loadtheaddressofHandleXXXtor0
ldrr0,[r0];loadthecontents(serviceroutinestartaddress)ofHandleXXX
;将对应的中断函数首地址入栈
strr0,[sp,#4];storethecontents(ISR)ofHandleXXXtostack
;将中断函数首地址出栈放入程序指针中系统将跳转到对应中断处理函数
ldmfdsp!,{r0,pc};pOPtheworkregisterandpc(jumptoISR)
MEND

;一个arm由RO,RW,ZI三个断组成其中RO为代码段,RW是已经初始化的全局变量,ZI是未初始化的全局变量
;(对于GNU工具对应的概念是TEXT,DATA,BSS)bootloader
;bootloader要将RW段复制到ram中并将ZI段清零编译器使用下列段来记录各段的起始和结束地址
;|Image$$RO$$Base|;RO段起始地址
;|Image$$RO$$Limit|;RO段结束地址加1
;|Image$$RW$$Base|;RW段起始地址
;|Image$$RW$$Limit|;RW段结束地址加1
;|Image$$ZI$$Base|;ZI段起始地址
;|Image$$ZI$$Limit|;ZI段结束地址加1
;这些标号的值是通过编译器的设定来确定的如编译软件中对ro-base和rw-base的设定,例如ro-;base=0xc000000rw-base=0xc5f0000
IMPORT|Image$$RO$$Limit|;EndofROMcode(=startofROMdata)
IMPORT|Image$$RW$$Base|;BaseofRAMtoinitialise
IMPORT|Image$$ZI$$Base|;Baseandlimitofarea
IMPORT|Image$$ZI$$Limit|;tozeroinitialise



IMPORTMain;Themainentryofmonprogram

AREAInit,CODE,READONLY
;异常中断矢量表(每个表项占4个字节)下面是中断向量表一旦系统运行时有中断发生即使移植了操作;系统如linux处理器已经把控制权交给了操作系统一旦发生中断处理器还是会跳转到从0x0开始
;中断向量表中某个中断表项(依据中断类型)开始执行
;具体中断向量布局请参考s3c44b0spec例如adc中断向量为0x000000c0下面对应表中第49项位置向量地址0x0+4*(49-1)=0x000000c0
ENTRY
;板子上电和复位后程序开始从位于0x0处开始执行硬件刚刚上电复位后程序从这里开始执行跳转到标?
;为ResetHandler处执行
;1)Thecode,whichconvertstoBig-endian,shouldbeinlittleendiancode.
;2)ThefollowinglittleendiancodewillbecompiledinBig-Endianmode.
;Thecodebyteordershouldbechangedasthememorybuswidth.
;3)Thepseudoinstruction,DCDcan'tbeusedherebecausethelinkergenerateserror.
;总线宽度判?
;DCD用于分配一段字内存单片,并用后面的伪指令初始化
;分配字节由expr个数决定
ASSERT:DEF:ENDIAN_CHANGE
[ENDIAN_CHANGE
ASSERT:DEF:ENTRY_BUS_WIDTH
][ENTRY_BUS_WIDTH=32
bChangeBigEndian;DCD0xea000007
]

[ENTRY_BUS_WIDTH=16
andeqr14,r7,r0,lsl#20;DCD0x0007ea00
]

[ENTRY_BUS_WIDTH=8
streqr0,][r0,-r10,ror#1];DCD0x070000ea
]
|
bResetHandler
]
bHandlerUndef;handlerforUndefinedmode
bHandlerSWI;handlerforSWIinterrupt
bHandlerPabort;handlerforPAbort
bHandlerDabort;handlerforDAbort
b.;reserved0x14
bHandlerIRQ;handlerforIRQinterrupt
bHandlerFIQ;handlerforFIQinterrupt

;@0x20
bEnterPWDN
;大小端判断
ChangeBigEndian
;@0x24
[ENTRY_BUS_WIDTH=32
DCD0xee110f10;0xee110f10=>mrcp15,0,r0,c1,c0,0
DCD0xe3800080;0xe3800080=>orrr0,r0,#0x80;//Big-endian
DCD0xee010f10;0xee010f10=>mcrp15,0,r0,c1,c0,0
]
[ENTRY_BUS_WIDTH=16
DCD0x0f10ee11
DCD0x0080e380
DCD0x0f10ee01
]
[ENTRY_BUS_WIDTH=8
DCD0x100f11ee
DCD0x800080e3
DCD0x100f01ee
]
DCD0xffffffff;swinv0xffffffissimilarwithNOPandrunwellinbothendianmode.
DCD0xffffffff
DCD0xffffffff
DCD0xffffffff
DCD0xffffffff
bResetHandler

;进入掉电模式功能
;1.SDRAM必须在自刷新模式.
;2.所有中断必须屏蔽forSDRAM/DRAMself-refresh.
;3.LCD关闭forSDRAM/DRAMself-refresh.
;4.TheI-cache可能需要开启.
;5.Thelocationofthefollowingcodemayhavenottobechanged.

;voidEnterPWDN(intCLKCON);
EnterPWDN
movr2,r0;r2=rCLKCON
tstr0,#0x8;pOWER_OFFmode?
bneENTER_POWER_OFF

ENTER_STOP
ldrr0,=REFRESH
ldrr3,[r0];r3=rREFRESH
movr1,r3
orrr1,r1,#BIT_SELFREFRESH
strr1,[r0];EnableSDRAMself-refresh

movr1,#16;waituntilself-refreshisissued.maynotbeneeded.
0subsr1,r1,#1
bne%B0

ldrr0,=CLKCON;enterSTOPmode.
strr2,[r0]

movr1,#32
0subsr1,r1,#1;1)waituntiltheSTOPmodeisineffect.
bne%B0;2)OrwaithereuntiltheCPU&Peripheralswillbeturned-off
;EnteringPOWER_OFFmode,onlytheresetbywake-upisavailable.

ldrr0,=REFRESH;exitfromSDRAMselfrefreshmode.
strr3,[r0]

MOV_PC_LR

ENTER_POWER_OFF
;NOTE.
;1)rGSTATUS3shouldhavethereturnaddressafterwake-upfromPOWER_OFFmode.

ldrr0,=REFRESH
ldrr1,[r0];r1=rREFRESH
orrr1,r1,#BIT_SELFREFRESH
strr1,[r0];EnableSDRAMself-refresh

movr1,#16;Waituntilself-refreshisissued,whichmaynotbeneeded.
0subsr1,r1,#1
bne%B0

ldrr1,=MISCCR
ldrr0,[r1]
orrr0,r0,#(7<<17);MakesurethatSCLK0:SCLK->0,SCLK1:SCLK->0,SCKE='L'duringboot-up
strr0,[r1]

ldrr0,=CLKCON
strr2,[r0]

b.;CPUwilldiehere.


WAKEUP_POWER_OFF
;ReleaseSCLKnafterwake-upfromthePOWER_OFFmode.
ldrr1,=MISCCR
ldrr0,[r1]
bicr0,r0,#(7<<17);SCLK0:0->SCLK,SCLK1:0->SCLK,SCKE:l->H
strr0,[r1]

;Setmemorycontrolregisters
ldrr0,=SMRDATA
ldrr1,=BWSCON;BWSCONAddress
addr2,r0,#52;EndaddressofSMRDATA
0
ldrr3,[r0],#4
strr3,[r1],#4
cmpr2,r0
bne%B0

movr1,#256
0subsr1,r1,#1;1)waituntiltheSelfRefreshisreleased.
bne%B0

ldrr1,=GSTATUS3;GSTATUS3hasthestartaddressjustafterPOWER_OFFwake-up
ldrr0,[r1]
movpc,r0

LTORG
;下面是具体的中断处理函数跳转的宏,通过上面的$HandlerLabel的宏定义展开后跳转到对应的中断处理;函数(对于向量中断)
HandlerFIQHANDLERHandleFIQ
HandlerIRQHANDLERHandleIRQ
HandlerUndefHANDLERHandleUndef
HandlerSWIHANDLERHandleSWI
HandlerDabortHANDLERHandleDabort
HandlerPabortHANDLERHandlePabort

;下面这段程序是用来处理非向量中断,具体判断I_ISPR中各位是否置1置1表示目前此中断等待响应(每次只能有一位置1),从最高优先级中断位开始判断,检测到等待服务
;中断就将pc置为中断服务函数首地址
IsrIRQ
subsp,sp,#4;预留返回指针的存储位置
stmfdsp!,{r8-r9}

ldrr9,=INTOFFSET
ldrr9,[r9];载入I_ISR
ldrr8,=HandleEINT0
addr8,r8,r9,lsl#2
ldrr8,[r8]
strr8,[sp,#8]
ldmfdsp!,{r8-r9,pc}

;=======
;ENTRY
;=======
;扳子上电和复位后程序开始从位于0x0执行bResetHandler程序从跳转到这里执行
;板子上电复位后执行几个步骤这里通过标号在注释中加1,2,3....标示标号表示执行顺序
;1.禁止看门狗屏蔽所有中断
ResetHandler
ldrr0,=WTCON;watchdogdisable
ldrr1,=0x0
strr1,[r0]

ldrr0,=INTMSK
ldrr1,=0xffffffff;allinterruptdisable
strr1,[r0]

ldrr0,=INTSUBMSK
ldrr1,=0x7ff;allsubinterruptdisable,2002/04/10
strr1,[r0]

[{FALSE}
;rGPFDAT=(rGPFDAT&~(0xf<<4))|((~data&0xf)<<4);
;Led_Display
ldrr0,=GPFCON
ldrr1,=0x5500
strr1,][r0]
ldrr0,=GPFDAT
ldrr1,=0x10
strr1,[r0]
]
;2.根据工作频率设置pll
;这里介绍一下计算公式
;Fpllo=(m*Fin)/(p*2^s)
;m=MDIV+8,p=PDIV+2,s=SDIV
;Fpllo必须大于20Mhz小于66Mhz
;Fpllo*2^s必须小于170Mhz
;如下面的PLLCON设定中的M_DIVP_DIVS_DIV是取自option.h中
;#elif(MCLK==40000000)
;#definePLL_M(0x48)
;#definePLL_P(0x3)
;#definePLL_S(0x2)
;所以m=MDIV+8=80,p=PDIV+2=5,s=SDIV=2
;硬件使用晶振为10Mhz,即Fin=10Mhz
;Fpllo=80*10/5*2^2=40Mhz
;ToreducePLLlocktime,adjusttheLOCKTIMEregister.
ldrr0,=LOCKTIME
ldrr1,=0xffffff
strr1,[r0]

[PLL_ON_START
;ConfigureMPLL
ldrr0,=MPLLCON
ldrr1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV);Fin=12MHz,Fout=50MHz
strr1,][r0]
]

;Checkifthebootiscausedbythewake-upfromPOWER_OFFmode.
ldrr1,=GSTATUS2
ldrr0,[r1]
tstr0,#0x2
;Incaseofthewake-upfromPOWER_OFFmode,gotoPOWER_OFF_WAKEUPhandler.
bneWAKEUP_POWER_OFF

EXPORTStartPointAfterPowerOffWakeUp
StartPointAfterPowerOffWakeUp
;3.置存储相关寄存器的程序
;这是设置SDRAM,flashROM存储器连接和工作时序的程序,片选定义的程序
;SMRDATAmap在下面的程序中定义
;SMRDATA中涉及的值请参考memcfg.s程序
;具体寄存器各位含义请参考s3c44b0spec
;Setmemorycontrolregisters
ldrr0,=SMRDATA
ldrr1,=BWSCON;BWSCONAddress
addr2,r0,#52;EndaddressofSMRDATA
0
ldrr3,[r0],#4
strr3,[r1],#4
cmpr2,r0
bne%B0

;Initializestacks
blInitStacks
;5.设置缺省中断处理函数
;SetupIRQhandler
ldrr0,=HandleIRQ;Thisroutineisneeded
ldrr1,=IsrIRQ;ifthereisn't'subspc,lr,#4'at0x18,0x1c
strr1,[r0]

;CopyandpasteRWdata/zeroinitializeddata
ldrr0,=|Image$$RO$$Limit|;GetpointertoROMdata
ldrr1,=|Image$$RW$$Base|;andRAMcopy
ldrr3,=|Image$$ZI$$Base|
;6.将数据段拷贝到ram中将零初始化数据段清零跳入C语言的main函数执行到这步结束bootloader初步引导结束
;Zeroinitbase=>topofinitialiseddata
cmpr0,r1;Checkthattheyaredifferent
beq%F2
1
cmpr1,r3;Copyinitdata
ldrccr2,[r0],#4;-->LDRCCr2,[r0]+ADDr0,r0,#4
strccr2,[r1],#4;-->STRCCr2,[r1]+ADDr1,r1,#4
bcc%B1;r12
ldrr1,=|Image$$ZI$$Limit|;Topofzeroinitsegment
movr2,#0
3
cmpr3,r1;Zeroinit
strccr2,[r3],#4
bcc%B3



[:lNOT:THUMBCODE
blMain;Don'tusemain()because......
b.
]

[THUMBCODE;forstart-upcodeforThumbmode
orrlr,pc,#1
bxlr
CODE16
blMain;Don'tusemain()because......
b.
CODE32
]


;functioninitializingstacks
InitStacks
;Don'tuseDRAM,suchasstmfd,ldmfd......
;SVCstackisinitializedbefore
;Undertoolkitver2.5,'msrcpsr,r1'canbeusedinsteadof'msrcpsr_cxsf,r1'
mrsr0,cpsr
bicr0,r0,#MODEMASK;位清零指令,清r0,再附给ro
orrr1,r0,#UNDEFMODE|NOINT
msrcpsr_cxsf,r1;UndefMode
ldrsp,=UndefStack

orrr1,r0,#ABORTMODE|NOINT
msrcpsr_cxsf,r1;AbortMode
ldrsp,=AbortStack

orrr1,r0,#IRQMODE|NOINT
msrcpsr_cxsf,r1;IRQMode
ldrsp,=IRQStack

orrr1,r0,#FIQMODE|NOINT
msrcpsr_cxsf,r1;FIQMode
ldrsp,=FIQStack

bicr0,r0,#MODEMASK|NOINT
orrr1,r0,#SVCMODE
msrcpsr_cxsf,r1;SVCMode
ldrsp,=SVCStack

;USERmodehasnotbeinitialized.

movpc,lr
;TheLRregisterwon'tbevalidifthecurrentmodeisnotSVCmode.

;这是上面提到的对存储寄存器初始化的数据map
LTORG

SMRDATADATA
;Memoryconfigurationshouldbeoptimizedforbestperformance
;Thefollowingparameterisnotoptimized.
;Memoryaccesscycleparameterstrategy
;1)ThememorysettingsissafeparametersevenatHCLK='75Mhz'.
;2)SDRAMrefreshperiodisforHCLK='75Mhz'.

DCD(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
DCD((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC));GCS0
DCD((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC));GCS1
DCD((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC));GCS2
DCD((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC));GCS3
DCD((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC));GCS4
DCD((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC));GCS5
DCD((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN));GCS6
DCD((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN));GCS7
;DCD((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT);Tchrnotusedbit
DCD((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+REFCNT);设置刷新周期

;DCD0x32;SCLKpowersavingmode,ARMcoreburstdisable,BANKSIZE128M/128M
DCD0xb2;SCLKpowersavingmode,ARMcoreburstenable,BANKSIZE128M/128M-11/29/2002

DCD0x30;MRSR6CL='3clk'
DCD0x30;MRSR7
;DCD0x20;MRSR6CL='2clk'
;DCD0x20;MRSR7

ALIGN


AREARamData,DATA,READWRITE
;这里将中断异常向量建立在sdram中
^_ISR_STARTADDRESS
HandleReset#4
HandleUndef#4
HandleSWI#4
HandlePabort#4
HandleDabort#4
HandleReserved#4
HandleIRQ#4
HandleFIQ#4

;Don'tusethelabel'IntVectorTable',
;ThevalueofIntVectorTableisdifferentwiththeaddressyouthinkitmaybe.
;IntVectorTable
HandleEINT0#4
HandleEINT1#4
HandleEINT2#4
HandleEINT3#4
HandleEINT4_7#4
HandleEINT8_23#4
HandleRSV6#4
HandleBATFLT#4
HandleTICK#4
HandleWDT#4
HandleTIMER0#4
HandleTIMER1#4
HandleTIMER2#4
HandleTIMER3#4
HandleTIMER4#4
HandleUART2#4
HandleLCD#4
HandleDMA0#4
HandleDMA1#4
HandleDMA2#4
HandleDMA3#4
HandleMMC#4
HandleSPI0#4
HandleUART1#4
HandleRSV24#4
HandleUSBD#4
HandleUSBH#4
HandleIIC#4
HandleUART0#4
HandleSPI1#4
HandleRTC#4
HandleADC#4

END

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

为增进大家对工业以太网的认识,本文将对工业以太网的原理、工业以太网的关键技术以及工业以太网要解决的问题予以介绍。

关键字: 以太网 工业以太网 指数

为增进大家对工业以太网的认识,本文将对工业以太网网络优势、工业以太网和IOLINK的区别予以介绍。

关键字: 以太网 工业以太网 指数

为增进大家对工业以太网的认识,本文将对工业以太网的优势、工业以太网缺点、工业以太网的维护予以介绍。

关键字:

Apr. 23, 2024 ---- 随着节能成为AI推理服务器(AI Inference Server)优先考量,北美客户扩大存储产品订单,带动QLC Enterprise SSD需求开始攀升。然而,目前仅Solidi...

关键字: SSD AI 服务器

为增进大家对二极管的认识,本文将对续流二极管、续流二极管的工作原理以及二极管在工业产品中的应用予以介绍。

关键字: 二极管 指数 续流二极管

通过本文,您将了解到二极管反接是否有电压以及二极管在电子电路中的应用。

关键字: 二极管 指数 稳压电路

为增进大家对二极管的了解,本文将对ESD二极管和TVS二极管之间的区别予以介绍。

关键字: ESD TVS 二极管 指数

为增进大家对嵌入式主板的认识,本文将对嵌入式主板以及嵌入式主板常见问题及其解决方法予以介绍。

关键字: 嵌入式 指数 主板

为增进大家对嵌入式系统的认识,本文将对嵌入式系统、嵌入式系统的特点予以介绍。

关键字: 嵌入式 指数 嵌入式系统

为增进大家对嵌入式的认识,本文将对嵌入式、嵌入式工作相关的内容予以介绍。

关键字: 嵌入式 指数 嵌入式技术
关闭
关闭