LPC824 ROM-bootloader反汇编分析

发布者:数据迷航者最新更新时间:2018-12-11 来源: eefocus关键字:LPC824  ROM-bootloader  反汇编 手机看文章 扫描二维码
随时随地手机看文章

1 ROM-bootloader反汇编分析


在Keil中(IAR暂不能实现,其他IDE未曾尝试,本部分内容集中在对代码分析上,无需对工具软件进行过多考虑)取消Option的Debug标签页上的“Run to main”选项,并且在Setting中选择Stop after reset,这样进入调试界面后就在bootloader起始处停止,可以分析ROM中的bootloader的汇编代码流程。


wps2075.tmp[10]

wps2095.tmp[6]

图 35  LPC824的ROM-Bootloader调试设置


ROM位于0x1FFF0000 -- 0x1FFF3000之间,共12KB的ROM,包括了bootloader、ROM-API等。


wps20A6.tmp[6]

图 35  LPC824的ROM、RAM位置映射图


进入调试界面或者调试时按下RST按钮,则停留在booloader的第一条代码,同时在Memory窗口修改地址0x0和0x1FFF0000,内容不变,可见复位后的0x1FFF0000位置的ROM同样映射到了0x0地址处(经过对比,暂时推测只是前面512Byte的内容映射到0x0-0x1FF地址处,从0x200开始依然为用户的Flash代码)。


wps20A8.tmp[6]


注意ARM的字节顺序是小尾端(little-endian),以及PC最后一位必须为1(表示为thumb模式)。根据ARM的启动逻辑,SP和PC分别初始化为0x0和0x04地址处的两个32bit(4Byte)的内容,分别是0x10000FFC和0x1FFF0008,因为ARM的逻辑是0x08和0x0C地址处的内容则是NMI和HardFault两个中断服务里程的地址。


__Vectors       DCD     __initial_sp              ; Top of Stack


                DCD     Reset_Handler             ; Reset Handler


                DCD     NMI_Handler               ; NMI Handler


                DCD     HardFault_Handler         ; Hard Fault Handler


可知因此此时SP=0x10000FFC为SRAM0的最顶端,PC=0x1FFF0008为第一条指令地址。


wps20B9.tmp[6]

图 35  LPC824的ROM-Bootloader启动调试界面


从上图看出未使用NMI,因为LPC824的NMI中断使用 SYSCON 模块中的 NMISRC 寄存器选择一个外设中断作为 ARM Cortex-M0+ 内核 NMI 中断的源,在bootloader中不使用,因此NMI_Handler不需要,直接跳转执行到@0x1FFF000C的内容即0x1FFF0011地址处。


0x1FFF0008 4A00      LDR      r2,[pc,#0]  ; @0x1FFF000C


0x1FFF000A 4710      BX       r2


而0x1FFF000C处的内容也刚好是HardFault_Handler的执行地址,内容同样是0x1FFF0011。因此实际代码执行结果是在0x1FFF0011处。因此HardFault_Handler也是执行0x1FFF0011的代码。(实际应该是ROM以确保代码无缺陷,不使用HardFault_Handler)。


接下来是读取0x1FFF0064和0x1FFF0068处的内容,并存放在r2和r3寄存器中,r3的内容为0x1FFF0078,这是一个ROM中的地址,该地址保存的内容为0x000002FC,即用户代码CRP的地址,再读取该地址的内容,即可读取用户代码的CRP值,验证CRP1/2/3等级。


0x1FFF0010 4A14      LDR      r2,[pc,#80] ; @0x1FFF0064


0x1FFF0012 4B15      LDR      r3,[pc,#84] ; @0x1FFF0068


0x1FFF0014 681B      LDR      r3,[r3,#0x00]


0x1FFF0016 4D16      LDR      r5,[pc,#88] ; @0x1FFF0070


0x1FFF0018 682D      LDR      r5,[r5,#0x00]


0x1FFF001A 4E16      LDR      r6,[pc,#88] ; @0x1FFF0074


0x1FFF001C 6836      LDR      r6,[r6,#0x00]


0x1FFF001E 681C      LDR      r4,[r3,#0x00]


0x1FFF0020 42AC CMP      r4,r5


0x1FFF0022 D001      BEQ      0x1FFF0028


0x1FFF0024 42B4 CMP      r4,r6


0x1FFF0026 D101      BNE      0x1FFF002C


0x1FFF0028 4C10      LDR      r4,[pc,#64] ; @0x1FFF006C


0x1FFF002A 6824      LDR      r4,[r4,#0x00]


0x1FFF002C 6014 STR      r4,[r2,#0x00]


很显然,要对比CRP跟CRP1/2/3进行比较,首先读取当前用户代码的CRP值以及常数CRP1/3的值。之后比较CRP值与CRP3和CRP1,有一个相同则跳转到0x1FFF0028,否则跳转到0x1FFF002C,上述执行后的的效果如下:


wps20BA.tmp[6]

图 35  LPC824的ROM-Bootloader的CRP1/3对比后条件执行


对比成功与否的后果为是否执行0x1FFF0028的代码,如果相同则执行,该代码是将0x1FFF006C处保存的地址(该地址为0x1FFF007C)的值(该值为0x87654321)加载到r4。否则r4保持原样即用户代码的CRP值,然后将r4保存到r2寄存器值作为地址的位置,r2内容为0x400483F0,该地址是SYSCON的寄存器地址空间,在DEVICE_ID寄存器之前,但是数据手册中没有解释该地址寄存器的作用,根据bootloader流程图,推测是对调试进行使能。


wps20CA.tmp[6]

wps20CB.tmp[6]

图 35  LPC824的ROM-Bootloader保存CRP值到0x400483F0所在的位置


接下来代码是:


0x1FFF002E 4B08      LDR      r3,[pc,#32] ; @0x1FFF0050


0x1FFF0030 681A      LDR      r2,[r3,#0x00]


0x1FFF0032 4C08      LDR      r4,[pc,#32] ; @0x1FFF0054


0x1FFF0034 8824      LDRH     r4,[r4,#0x00]


0x1FFF0036 4D08      LDR      r5,[pc,#32] ; @0x1FFF0058


0x1FFF0038 882D      LDRH     r5,[r5,#0x00]


0x1FFF003A 42AC CMP      r4,r5


0x1FFF003C D001      BEQ      0x1FFF0042


0x1FFF003E 4A07      LDR      r2,[pc,#28] ; @0x1FFF005C


0x1FFF0040 6812      LDR      r2,[r2,#0x00]


0x1FFF0042 4695 MOV sp,r2


通过读取0x1FFF0054和0x1FFF0058的内容作为地址(分别是0x0C00013C和0x1FFF008C),将这两个地址的内容读入r4和r5,然后对比r4和r5,如果相同则略过0x1FFF003E,直接跳转到0x1FFF0042,因此这段代码的意义是通过对比0x0C00013C(Reserved区域)和0x1FFF008C地址处(ROM中的常量)的值,来决定是否执行0x1FFF003E这两行代码,本次例程的结果是两个地址的值都是0x0000C0FA,因此跳过代码。


而这行代码执行与否的差别则是决定r2的内容是0x1FFF0050处内容作为地址(该地址为0x0C000118)的值还是0x1FFF005C处内容作为地址(该地址为0x1FFF0088)的值,经过修改PSR的Z标志改变CMP指令的结果,可以看到r2的值变化为0x100003FF或者0x10001FFF,然后将r2保存到sp寄存器当中,可见其功能是修改ROM-Bootloader执行的堆栈地址。推测0x0C00013C地址处的值可能是某种ROM版本或者芯片die版本的信息?


最后跳转到0x1FFF0060保存的内容做为新的PC执行地址(新的PC执行地址为0x1FFF0269,注意PC最后一位必须为1表示为thumb模式)。


0x1FFF0044 4A06      LDR      r2,[pc,#24] ; @0x1FFF0060


0x1FFF0046 4710 BX       r2


跳转到0x1FFF0268之后,代码如下:


0x1FFF0268 B510      PUSH     {r4,lr}


0x1FFF026A 4A5B      LDR      r2,[pc,#364] ; @0x1FFF03D8


0x1FFF026C 495B      LDR      r1,[pc,#364] ; @0x1FFF03DC


0x1FFF026E 8810      LDRH     r0,[r2,#0x00]


0x1FFF0270 4288 CMP      r0,r1


0x1FFF0272 D000      BEQ      0x1FFF0276


0x1FFF0274 E7FE      B        0x1FFF0274


0x1FFF0276 485B      LDR      r0,[pc,#364] ; @0x1FFF03E4


保存r4和lr到堆栈,然后读取0x1FFF03D8处的内容作为地址(该地址为0x0C00013C,Reserved区域)的值,保存到r0,与0x1FFF03DC处的内容(ROM中的常量)保存到r1比较,如果不相等则永远停留在以下这条语句上。


0x1FFF0274 E7FE      B        0x1FFF0274


本例程测试后的r0与r1的内容都是0x0000C0FA,与前面的判断内容相同,怀疑是进行另一种版本对比?执行效果如下:


wps20DC.tmp[6]

图 35  LPC824的ROM-Bootloader对比版本信息?


接下来是多次的读取和写入,从0x0C000100附近地址空间中读取,并写入地址空间大约都在0x40048000--0x400483FFSYSCON地址空间,,0x0C000100区域为Reserved,推测调制TRIM数据等,后续详细分析,TODO。


0x1FFF0276 485B      LDR      r0,[pc,#364] ; @0x1FFF03E4        ; r0 = [0x1FFF03E4] = 0x400483C0


0x1FFF0278 4959      LDR      r1,[pc,#356] ; @0x1FFF03E0        ; r1 = [0x1FFF03E0] = 0x12345678


0x1FFF027A 6101 STR      r1,[r0,#0x10] ; [0x400483D0] <= 0x123456678,SYSCON中未明确寄存器。


0x1FFF027C 495A      LDR      r1,[pc,#360] ; @0x1FFF03E8        ; r1 = [0x1FFF03E8] = 0x0C000130


0x1FFF027E 680B      LDR      r3,[r1,#0x00] ; r3 = [0x0C000130] = 0


0x1FFF0280 4946      LDR      r1,[pc,#280] ; @0x1FFF039C        ; r1 = [0x1FFF039C] = 0x40048200


0x1FFF0282 39C0      SUBS     r1,r1,#0xC0 ; r1 = r1 - 0xC0 = 0x40048140


0x1FFF0284 620B STR      r3,[r1,#0x20] ; [r1 + 0x20] = [0x40048160] = 0  SYSCON中未明确寄存器。


0x1FFF0286 4B59      LDR      r3,[pc,#356] ; @0x1FFF03EC        ;


0x1FFF0288 681B      LDR      r3,[r3,#0x00] ;


0x1FFF028A 624B STR      r3,[r1,#0x24] ;


; [r1 + 0x24] = [0x40048164] = r3 = [[0x0C000134] + 0x00] = 0   ; SYSCON中未明确寄存器。


0x1FFF028C 2100 MOVS     r1,#0x00 ; r1 = 0


0x1FFF028E 6101 STR      r1,[r0,#0x10] ; [r0 + 0x10] = [0x400483D0] = 0 SYSCON中未明确寄存器。


; [r0 + 0x3C] = [0x400483D0] = r1 = 0   ; SYSCON中未明确寄存器。


0x1FFF0290 4957      LDR      r1,[pc,#348] ; @0x1FFF03F0        ;


0x1FFF0292 6809      LDR      r1,[r1,#0x00] ;


0x1FFF0294 6381 STR      r1,[r0,#0x38] ;


; [r0 + 0x38] = [0x400483F8] = r1 = [[0x1FFF03F0] + 0x00] = [0x0C00010C] = 0x00008241   ; SYSCON.DEVICE_ID


0x1FFF0296 4957      LDR      r1,[pc,#348] ; @0x1FFF03F4        ;


0x1FFF0298 6809      LDR      r1,[r1,#0x00] ;


0x1FFF029A 63C1 STR      r1,[r0,#0x3C] ;


; [r0 + 0x3C] = [0x400483FC] = r1 = [[0x1FFF03F4] + 0x00] = [0x0C000110] = 0x202000FB   ; SYSCON中未明确寄存器。


0x1FFF029C 4956      LDR      r1,[pc,#344] ; @0x1FFF03F8        ;


0x1FFF029E 6809      LDR      r1,[r1,#0x00] ;


0x1FFF02A0 6001 STR      r1,[r0,#0x00]


; [r0 + 0x00] = [0x400483C0] = r1 = [[0x1FFF03F8] + 0x00] = [0x0C000124] = 0x0000001F   ; SYSCON中未明确寄存器。


0x1FFF02A2 4956      LDR      r1,[pc,#344] ; @0x1FFF03FC        ;


0x1FFF02A4 6809      LDR      r1,[r1,#0x00] ;


0x1FFF02A6 6041 STR      r1,[r0,#0x04] ;


; [r0 + 0x04] = [0x400483C4] = r1 = [[0x1FFF03FC] + 0x00] = [0x0C000128] = 0x00000007   ; SYSCON中未明确寄存器。


0x1FFF02A8 4955      LDR      r1,[pc,#340] ; @0x1FFF0400        ;


0x1FFF02AA 6809      LDR      r1,[r1,#0x00] ;


0x1FFF02AC 6081 STR      r1,[r0,#0x08] ;


; [r0 + 0x08] = [0x400483C8] = r1 = [[0x1FFF0400] + 0x00] = [0x0C00012C] = 0x000000FB   ; SYSCON中未明确寄存器。


0x1FFF02AE 4855      LDR      r0,[pc,#340] ; @0x1FFF0404        ;


0x1FFF02B0 493B      LDR      r1,[pc,#236] ; @0x1FFF03A0        ;


0x1FFF02B2 6800      LDR      r0,[r0,#0x00] ;


0x1FFF02B4 3140      ADDS     r1,r1,#0x40 ;


0x1FFF02B6 6008 STR      r0,[r1,#0x00] ;


; [r1 + 0x00] = [[0x1FFF03A0] + 0x40 + 0x00] = [0x40048080] = r0 = [[0x1FFF0404] + 0x00] = [0x0C00011C] = 0x000000DF   ; SYSCON中未明确寄存器。


0x1FFF02B8 4853      LDR      r0,[pc,#332] ; @0x1FFF0408        ;


0x1FFF02BA 4C39      LDR      r4,[pc,#228] ; @0x1FFF03A0        ;


0x1FFF02BC 6800      LDR      r0,[r0,#0x00] ;


0x1FFF02BE 3C40      SUBS     r4,r4,#0x40 ;


0x1FFF02C0 62A0 STR      r0,[r4,#0x28] ;


; [r4 + 0x28] = [[0x1FFF03A0] - 0x40 + 0x28] = [0x40048018] = r0 = [[0x1FFF0408] + 0x00] = [0x0C000120] = 0x000000DA   ; SYSCON中未明确寄存器。


最后进行判断,跳转到0x1FFF02D0。


0x1FFF02C2 78D0      LDRB     r0,[r2,#0x03] ;r0 = [r2 + 0x03].B = [0x0C00013F].B = 0


0x1FFF02C4 285A      CMP      r0,#0x5A


0x1FFF02C6 D103      BNE      0x1FFF02D0 ;如果r0不等于0x5A则跳转到0x1FFF02D0,否则接下来的执行


0x1FFF02C8 2001      MOVS     r0,#0x01


0x1FFF02CA 0300      LSLS     r0,r0,#12


0x1FFF02CC F7FFFEBC  BL.W     0x1FFF0048 ;如果r0 = 0x5A,则r0 = 0x1 << 12;并跳转到0x1FFF0048


0x1FFF02D0 484E      LDR      r0,[pc,#312] ; @0x1FFF040C


0x1FFF02D2 F000FEE5  BL.W     0x1FFF10A0 ;r0 = [0x1FFF040C] = 0x40040000;并跳转到0x1FFF10A0


接下来从ROM地址0x1FFF130C处读取值0x00020005并写入0x40040000处(Flash控制器地址空间,未明确该寄存器定义)。以及对0x40040000寄存器的第19bit设置为1。推测可能是设置Flash的某些参数。


0x1FFF10A0 499A      LDR      r1,[pc,#616] ; @0x1FFF130C


0x1FFF10A2 6001 STR      r1,[r0,#0x00] ; [r0 + 0x00] = [0x40040000] = r1 = [0x1FFF130C] = 0x00020005


0x1FFF10A4 6801      LDR      r1,[r0,#0x00]


0x1FFF10A6 2201 MOVS     r2,#0x01


0x1FFF10A8 04D2      LSLS     r2,r2,#19


0x1FFF10AA 4311      ORRS     r1,r1,r2


0x1FFF10AC 6001 STR      r1,[r0,#0x00] ; [r0] = [0x40040000] = r1 = [r0] | (0x1 << 19) = 0x000A0005


0x1FFF10AE 4770 BX       lr


最后返回。然后使r0 = [[0x1FFF0410]] = [0x0C000138] = 0x00000040。


0x1FFF02D6 484E      LDR      r0,[pc,#312] ; @0x1FFF0410


0x1FFF02D8 6800      LDR      r0,[r0,#0x00] ; 返回值r0 = [[0x1FFF0410]] = [0x0C000138] = 0x00000040


0x1FFF02DA F001FEB5  BL.W     0x1FFF2048


并跳转到0x1FFF2048。


0x1FFF2048 4948      LDR      r1,[pc,#288] ; @0x1FFF216C


0x1FFF204A B280      UXTH     r0,r0


0x1FFF204C 4308      ORRS     r0,r0,r1


; r0 = r0 | r1 = r0 | [0x1FFF216C] = 0x00000040| 0xC0DE0000 = 0xC0DE0040


0x1FFF204E 4948      LDR      r1,[pc,#288] ; @0x1FFF2170


0x1FFF2050 6248 STR      r0,[r1,#0x24]


;[r1 + 0x24]  = [[0x1FFF2170] + 0x24] = [0x40048224] = r0 = 0xC0DE0040


0x1FFF2052 4770 BX       lr


返回读取0xA0000000C即P0_12即ISP引脚的状态,如果不是低电平0x00则跳转到0x1FFF030E也就是用户代码,否则执行接下来的代码即进入ISP引导模式。


0x1FFF02DE 6B20      LDR      r0,[r4,#0x30] ;r0 = [0x40048000 + 0x30] = 0x00000013


0x1FFF02E0 0740      LSLS     r0,r0,#29 ; r0 = r0 << 29 = 0x60000000


0x1FFF02E2 D414      BMI      0x1FFF030E


0x1FFF02E4 484B      LDR      r0,[pc,#300] ; @0x1FFF0414


0x1FFF02E6 2105 MOVS     r1,#0x05 ;


0x1FFF02E8 6800      LDR      r0,[r0,#0x00] ; r0 = [[0x1FFF0414]] = [0x0C000144] = 0x0000000C


0x1FFF02EA 0749      LSLS     r1,r1,#29 ; r1 = 5 << 29 = 0xA0000000


0x1FFF02EC 1840      ADDS     r0,r0,r1 ; r0 = r0 + r1 = 0xA000000C


0x1FFF02EE 7800      LDRB     r0,[r0,#0x00] ; r0 = [r0 + 0x00] = [0xA000000C] = 0x00000001


0x1FFF02F0 2800 CMP      r0,#0x00


0x1FFF02F2 D10C      BNE      0x1FFF030E


0x1FFF02F4 4848      LDR      r0,[pc,#288] ; @0x1FFF0418


0x1FFF02F6 4949      LDR      r1,[pc,#292] ; @0x1FFF041C


0x1FFF02F8 6800      LDR      r0,[r0,#0x00]


0x1FFF02FA 6809      LDR      r1,[r1,#0x00]


0x1FFF02FC 6800      LDR      r0,[r0,#0x00]


0x1FFF02FE 4288 CMP      r0,r1


0x1FFF0300 D005      BEQ      0x1FFF030E


0x1FFF0302 4947      LDR      r1,[pc,#284] ; @0x1FFF0420


0x1FFF0304 4288 CMP      r0,r1


0x1FFF0306 D002      BEQ      0x1FFF030E


0x1FFF0308 F7FFFF7A  BL.W     0x1FFF0200


0x1FFF030C BD10      POP      {r4,pc}


0x1FFF030E F7FFFFA5  BL.W     0x1FFF025C


返回的0x1FFF025C代码很简单,恢复之前的r4和lr后返回0x1FFF022E。


0x1FFF025C B510      PUSH     {r4,lr}


0x1FFF025E F7FFFFE6  BL.W     0x1FFF022E


之后的代码是将0x40048000的寄存器设置为0x2即SYSCON.SYSMEMREMAP = 0x02即用户Flash映射到0x0地址处。


0x1FFF022E B570      PUSH     {r4-r6,lr}


0x1FFF0230 4C5B      LDR      r4,[pc,#364] ; @0x1FFF03A0


0x1FFF0232 2000 MOVS     r0,#0x00


0x1FFF0234 2102 MOVS     r1,#0x02


0x1FFF0236 3C40      SUBS     r4,r4,#0x40


0x1FFF0238 6021 STR      r1,[r4,#0x00]


; [r4 + 0x00] = [[0x1FFF03A0] - 0x40] = [0x40048040 - 0x40] = [0x40048000] = r1 = 0x02


然后读取0-0x1F共8个4字节计算校验和,等于0说明用户代码有效,则跳转到用户代码。


0x1FFF023A 4603 MOV      r3,r0


0x1FFF023C 4602 MOV      r2,r0


0x1FFF023E 4601 MOV      r1,r0


0x1FFF0240 008D      LSLS     r5,r1,#2


0x1FFF0242 595D      LDR      r5,[r3,r5]


0x1FFF0244 1C49      ADDS     r1,r1,#1


0x1FFF0246 18AA      ADDS     r2,r5,r2


0x1FFF0248 2908 CMP      r1,#0x08 ;r1从0累加到7,r5获取0x00--0x1F的4字节数据并累加到r2


0x1FFF024A DBF9      BLT      0x1FFF0240


0x1FFF024C 2A00 CMP      r2,#0x00 ;比较r2等于0说明用户代码有效,跳转


0x1FFF024E D002      BEQ      0x1FFF0256


0x1FFF024C 2A00 CMP      r2,#0x00


0x1FFF024E D002      BEQ      0x1FFF0256


0x1FFF0250 2000 MOVS     r0,#0x00


0x1FFF0252 6020 STR      r0,[r4,#0x00]


0x1FFF0254 BD70      POP      {r4-r6,pc}


0x1FFF0256 F7FFFEF7  BL.W     0x1FFF0048


最后则是设置sp = __initial_sp堆栈,跳转到用户代码0x4地址处代表的Reset_Handler。


0x1FFF0048 6801      LDR      r1,[r0,#0x00]


0x1FFF004A 468D MOV sp,r1 ;sp = [0x00] = __initial_sp


0x1FFF004C 6841      LDR      r1,[r0,#0x04] ;r1 = [0x04] = Reset_Handler


0x1FFF004E 4708 BX       r1


从此进入用户代码lpc824_startup.s。


关键字:LPC824  ROM-bootloader  反汇编 引用地址:LPC824 ROM-bootloader反汇编分析

上一篇:LPC824 一种IAP实现方法
下一篇:lpc54618通过flashmagic工具以isp方式下载程序出现的问题总结

推荐阅读最新更新时间:2024-03-16 16:19

浅谈基于51单片机的反汇编要点
  从一个现有的单片机应用系统中读出目标代码进行反汇编,可以分析原程序的设计思想,然后加以改进和创新,这是单片机爱好者学习单片机、开发新产品的一个重要途径。但是,很多单片机爱好者在反汇编时常会失败,怎样才能正确进行反汇编呢?下面就以51单片机为例,谈谈反汇编的要点。   1.怎样正确获取程序的目标代码   要正确获取程序的目标代码,首先要明确程序代码的存放地点。51单片机的程序存储器最大空间为64KB,在一个实际的应用系统中,程序存储器的分布情况可能有以下几种:   (1)只使用了片内程序空间。而没有使用片外的程序空间。   其硬件特征为:/EA引脚接VCC;/PSEN引脚为空脚。   这种情况比较简单,全
[单片机]
浅谈基于51单片机的<font color='red'>反汇编</font>要点
LPC824-头文件应用
通过前面的分析,大家已经了解了预定义部分的内容。但如果每次设计程序都把需要的头文件内容全部写出来,不仅代码占用较多的篇幅,还会影响程序的结构化。因此,规范的程序设计都会把这部分内容通过头文件包含的形式引入进来。下面就来讨论如何实现这一形式。 头文件是以“.h”为后缀的文本文件,它的名称、数量都与开发环境有关,不同的开发环境(甚至同一开发环境的不同版本)所带的头文件都不一定相同。因此本节在讨论LPC824开发的头文件配置时,都以ARM-MDK5.26.2版本开发环境为准,其他版本的可参考使用。 先来看,同样实现LED交替闪烁的功能,若用包含头文件的写法,代码可换成如下形式: #include LPC82x.h //****
[单片机]
LPC824-头文件应用
关于恩智浦lpc824 和lpc84x 微控制器
随着物联网技术的发展,MCU 处理器的能力日益强大,如今的MCU 与微处理器的界线越来越模糊,将会进一步融合成为嵌入式处理器。由于AMetal 已经完全屏蔽了底层的复杂细节,因此开发者仅需了解MCU 的基本功能就可以了。 LPC82x 是一款基于 ARM Cortex-M0+ 的低成本 32 位 MCU 系列器件(主芯片LPC824,基于ARM® Cortex®-M0+内核的低成本微控制器(MCU)),工作时 CPU 频率高达 30 MHz。 LPC82x 支持最高32 KB 闪存和 8 KB SRAM。LPC82x 的配套外设包括一个 CRC 引擎、四个 I2C 总线接口、最多三个 USART、最多两个 SPI 接口、一个多速
[单片机]
关于恩智浦<font color='red'>lpc824</font> 和lpc84x 微控制器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved