arm原理与c程序设计

上传人:e****s 文档编号:243345474 上传时间:2024-09-21 格式:PPT 页数:173 大小:1.37MB
返回 下载 相关 举报
arm原理与c程序设计_第1页
第1页 / 共173页
arm原理与c程序设计_第2页
第2页 / 共173页
arm原理与c程序设计_第3页
第3页 / 共173页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,第七章,ARM 接口程序设计,第七章ARM接口程序设计,7.1 LED 显示控制,7.2 K9F1208 访问技术,7.3 串口通信,本章小结,7.1 LED显示控制 参考本书小节的分析,两个LED数码管的控制地址为0x08000110和0x08000112。借助于看门狗定时器或定时计数器可实现简单的计数秒表。由于只有两位数码管,秒表计到99秒后,从0开始重新计数。7.1.1 看门狗定时器秒表 在工程ex6_12的根底上,新建工程ex7_1。工程ex7_1的工作界面如图7-1所示。,图7-1 工程ex7_1的工作界面,由图7-1可知,工程ex7_1包括的文件与工程ex6_12中的相同,即、和。在工程ex6_12的同名文件的根底上,只需修改文件的内容,添加七段数码管显示操作即可。文件的内容如下:1 #define LED1_MASK 0x20 2 #define LED2_MASK 0x403 #define LED3_MASK 0x804 5 #define GPCDAT_ADDR (*(volatile unsigned int *)0x56000024),6 7 #define SRCPND (*(volatile unsigned int *)0x4A000000)8 #define INTMOD (*(volatile unsigned int *)0x4A000004)9 #define INTMSK (*(volatile unsigned int *)0x4A000008)10 #define PRIORITY (*(volatile unsigned int *)0x4A00000C)11 #define INTPND (*(volatile unsigned int *)0x4A000010)12 #define INTOFFSET (*(volatile unsigned int *)0x4A000014),13 14 / SEG7 LED Address15 #define Seg7A (*(volatile unsigned char *)0x08000110)16 #define Seg7B (*(volatile unsigned char *)0x08000112)17 18 #define U8 unsigned char19 20 U8 seg7val16=21 22 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,23 / 0 1 2 3 4 5 6 7 8 9 A B C D E F24 ;25 26 / enable watchdog timer intterupt27 void openDog(void)28 29 INTMOD = 0x0; / set as IRQ30 INTMSK ,34 int nLED=0;35 int nCnt=0;36 _irq void c_Wdt_ISR()37 38 39 int iReg=0;40 if(SRCPND | 0x200)41 SRCPND = 0x200;42 if(INTPND | 0x200)43 INTPND = 0x200;44 /INTMSK |= 0xFFFFFFFF; /close all, include Dog,45 nLED = 0;46 switch(number)47 48 case 0: / SWI number 0 code49 nLED =(LED2_MASK | LED3_MASK); / LED1 light50 break;51 case 1:52 nLED =(LED1_MASK | LED3_MASK); / LED2 light53 break;,54 case 2:55 nLED =(LED1_MASK | LED2_MASK);/ LED3 light56 break;57 58 number+;59 if(number2)60 number=0;61 GPCDAT_ADDR = nLED; / Led shine in turn62 63 / Seg7 LED counts each second,64 if(nCnt=100)65 nCnt=0;66 Seg7A=seg7valnCnt/10;67 Seg7B=seg7valnCnt%10;68 nCnt+;69 70 / open IRQ71 _asm 72 73 MRS iReg, CPSR74 BIC iReg, iReg, #0x80,75 MSR CPSR_c, iReg76 77 /INTMSK /open Dog78 编译连接,下载并运行工程ex7_1,可以看到七段数码管按秒从00计数到99,然后循环计数。,7.1.2 定时器1秒表 由于看门狗定时器主要用于系统程序运作监控,在程序正常运行过程中,有必要的“喂狗操作,当程序运行不正常时,看门狗将会减计数到0,从而强制系统复位。因此,常用的秒表控制不占用看门狗定时器,而是由定时计数器实现的。S3C2410A具有5个16位的定时器,其中定时器03具有PWM波发生功能,即可以输出PWM波,定时器4没有外部输出。定时器工作频率为PCLK/(预分频值+1)/分频值,在下面的工程ex7_2中,将使用定时器1,并设置其工作频率为20kHz,即为48MHz/(149+1)/16 = 20kHz。,定时器1的使用方法如下:首先,设置TCFG0(定时器配置存放器0,地址为0x51000000)的值为0x95,即定时器1的预分频值为0x95,十进制数为149。注意:定时器0和1共用同一个预分频值。然后,设置TCFG1(定时器配置存放器1,地址为0x51000004)的值为0x30,即定时器1的分频值为16。其次,设置TCNTB1(定时器1计数存放器,地址为0x51000018)和TCMPB1(定时器1比较存放器,地址为0x5100001C)的值为0x4E20和0x4000。这里没有用到TCMPB1,当TCNTB1减计数到0后,将触发定时器1中断。,再次,设置TCON(定时器控制存放器,地址为0x51000008)的值为0xA00,即刷新TCNB1和TCMPB1的值。最后,设置TCON的值为0x900,启动定时器1。 从第五章的表5-7中可以查到,定时器1中断的偏移号为11。 在工程ex7_1的根底上,新建工程ex7_2,其工作界面如图7-2所示。,图7-2 工程ex7_2的工作界面,工程ex7_2包括三个文件:、和。其中,文件与工程ex7_1中的相同;文件的源代码如下:1 extern void openTimer1(void);2 3 extern void c_Timer1_ISR(void);4 5 void initTimer1(void);6 7 int main()8 ,9 / 0x010FFF20+11*4 is the address of Timer 1 jumper10 *(volatile unsigned int *)(0x010FFF20+4*11)=(unsigned)c_Timer1_ISR;11 / initialize Timer 112 initTimer1(); 13 / Enable Timer 1 Interrupter14 openTimer1();15 while(1)16 17 18 19 ,文件的源代码如下:1 #define LED1_MASK 0x20 2 #define LED2_MASK 0x403 #define LED3_MASK 0x804 5 #define GPCDAT_ADDR (*(volatile unsigned int *)0x56000024)6 7 #define SRCPND (*(volatile unsigned int *)0x4A000000)8 #define INTMOD (*(volatile unsigned int *)0x4A000004),9 #define INTMSK (*(volatile unsigned int *)0x4A000008)10 #define PRIORITY (*(volatile unsigned int *)0x4A00000C)11 #define INTPND (*(volatile unsigned int *)0x4A000010)12 #define INTOFFSET (*(volatile unsigned int *)0x4A000014)13 14 / SEG7 LED Address15 #define Seg7A (*(volatile unsigned char *)0x08000110)16 #define Seg7B (*(volatile unsigned char *)0x08000112)17,18 / Timer 1 register related Address19 #define TCFG0 (*(volatile unsigned int *) 0x51000000) 20 #define TCFG1 (*(volatile unsigned int *) 0x51000004) 21 #define TCON (*(volatile unsigned int *) 0x51000008) 22 #define TCNTB1 (*(volatile unsigned int *) 0x51000018) 23 #define TCMPB1 (*(volatile unsigned int *) 0x5100001C) 24 25 #define U8 unsigned char,26 27 U8 seg7val16=28 29 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E30 / 0 1 2 3 4 5 6 7 8 9 A B C D E F31 ;32 33 / initialize Timer 134 void initTimer1(void)35 ,36 TCFG0 = 0x95;/ prescale = 11937 TCFG1 = 0x30;/ divider = 1/16 38 TCNTB1 = 0x4E20-1;/ counter number = 0x4E1F39 TCMPB1 = 0x4000;40 TCON = 0xA00;/ update TCNTB1 and TCMPB141 TCON = 0x900;/ Start Timer 142 43 44 / enable Timer 1 intterupt45 void openTimer1(void),46 47 INTMOD = 0x0; / set as IRQ48 INTMSK 54 _irq void c_Timer1_ISR()55 56,57 int iReg=0;58 if(SRCPND | 0x800) / must change from 0x200 to 0x80059 SRCPND = 0x800;60 if(INTPND | 0x800) / must change from 0x200 to 0x80061 INTPND = 0x800;62 /INTMSK |= 0xFFFFFFFF; /close all, include Timer 163 nLED = 0;64 switch(number)65 66 case 0: / SWI number 0 code,67 nLED =(LED2_MASK | LED3_MASK);/ LED1 light68 break;69 case 1:70 nLED =(LED1_MASK | LED3_MASK); / LED2 light71 break;72 case 2:73 nLED =(LED1_MASK | LED2_MASK);/ LED3 light74 break;75 76 number+;,77 if(number2)78 number=0;79 GPCDAT_ADDR = nLED; / Led shine in turn80 81 / Seg7 LED counts each second82 if(nCnt=100)83 nCnt=0;84 Seg7A=seg7valnCnt/10;85 Seg7B=seg7valnCnt%10;86 nCnt+;87,88 / open IRQ89 _asm 90 91 MRS iReg, CPSR92 BIC iReg, iReg, #0x8093 MSR CPSR_c, iReg94 95 /INTMSK / open Timer 196 工程ex7_2实现的功能与工程ex7_1完全相同,即实现按秒从00计数到99,继而循环计数的功能。通过本节实例的学习,读者应掌握了S3C2410A的中断处理方法。,7.2 K9F1208访问技术我们在前面第二章的节介绍了K9F1208U0C的特性、管脚结构及电路接口原理图,关于K9F1208U0C更详细的信息请参考K9F1208芯片手册。为了便于理解如何访问K9F1208,本节将摘录局部K9F1208芯片资料的内容。7.2.1 K9F1208U0CK9F1208U0C的存储阵列如图7-3所示。,图7-3 K9F1208U0C存储阵列,由图7-3可知,一片K9F1208U0C芯片包含4096个存储块,每个存储块分为32个存储页,每个存储页为528字节。其中,512字节用于存储数据,16字节用于存储校验信息。这样,一片K9F1208U0C的存储空间大小为409632(512+16)B = (64+2)MB = 66MB,其中,1MB = 1024KB,1KB = 1024B。用户可用的存储空间为64MB,对其完全寻址,至少需要26根地址线。I/O0I/O7作为地址输入时至少占用4个周期,每个周期的地址输入如图7-3所示:第一个周期输入的A0A7作为列地址;第24周期输入的A9A25作为行地址,即页地址,因此,一片K9F1208U0C有2,17,= 128K个存储页面。,每个512B的页面由A8分为上、下两局部(Read1命令),每局部为256个字节,可以被8位列地址寻址,即A0A7寻址。每个存储页最后的16字节(512527)使用A0A3寻址,A4A7忽略,对应于不同的访问命令(Read2命令)。现在,有充分理由相信,NAND型FLASH这种“分而治之的存储寻址方式比NOR型FLASH的“一统天下方式在芯片制造上更容易实现。,K9F1208U0C共有4个存储柱面(Plane),它的4096个存储块分布在不同的存储柱面上,不同的存储柱面可以同时读写。块序号被4整除的存储块,例如块0,4,8,4092位于面0上;而块序号除以4余1的存储块,例如块1,5,9,4093位于面1上;块2,6,10,4094位于面2上;块3,7,11,4095位于面3上。如图7-4所示,每个柱面上有528字节的数据存放器,位于存储单元阵列和外部I/O口之间,用于缓冲读写的数据。,图7-4 存储器,配置表,由附录一的附表1-1可知,NAND型FLASH操作存放器位于0x4E0000000x4E000014。由第二章的图2-14和图2-16可知,K9F1208U0C的I/O0I/O7接S3C2410A的D0D7,其控制管脚接S3C2410A的NAND FLASH控制器的相应管脚。通过S3C2410A访问K9F1208的一般步骤为:(1) 初始化S3C2410A NAND型FLASH控制器。(2) 读K9F1208的芯片ID号。,(3) 整片擦除K9F1208,然后对K9F1208的存储块进行有效性检验,对无效存储块进行标记。(4) 编程K9F1208芯片,并读取写入的数据进行ECC校验。K9F1208仅支持基于块的擦除和基于页的编程,针对FLASH来说,编程是指向其中写入数据。由于S3C2410A具有硬件ECC校验发生器,用户不需要编写ECC校验码产生函数。 下面两个小节将分别介绍K9F1208的读和编程操作方法。,7.2.2 K9F1208读设计K9F1208的读操作需要初始化S3C2410A的NAND FLASH控制存放器,方法如下:/ Init NAND Controller Regvoid initFlash() INTMSK = 0xFFFFFFFF; CLKCON = 0x0007FFF0; / bit 4 GPACON = 0xFFFFFFFF; NFCONF = (115)|(112)|(011)|(78)|(74)|(70);,while(!(NFSTAT 即关闭中断,开启NAND FLASH控制器时钟,启动NAND FLASH控制器管脚,配置NFCONF存放器,等待K9F1208是否准备好,向K9F1208写命令字0xFF复位FLASH。初始化NAND FLASH控制器之后,读取K9F1208的ID号,方法如下:,/ Read flash IDvoid readFlashID()int i;NFCMD = 0x90;NFADDR = 0x0;for(i=0;i4;i+)flashID=flashID | (NFDATA(3i)*8);while(!(NFSTAT / Ready?,即写命令字节0x90和地址字节0x0,然后依次读出4个字节,即为K9F1208的ID号。这里K9F1208U0C读出来的ID号为:0xEC765A3F。然后,可以读取NAND FLASH的内容了。一般编写一个读FLASH函数,输入参量为读FLASH的起始地址、读取的字节长度和存放读出内容的数组,代码如下:/ Read flash contents/ Here, addr: start address; size: Page size; buf: datavoid flashRd(unsigned int addr,unsigned int size,unsigned char *buf) ,int i,n=1;while(!(NFSTAT if(n%528)=0)/ one page read over, wait,while(!(NFSTAT ,上述代码首先等待FLASH准备好,然后,写命令0x00或0x01(当输入地址addr的第8位为1时),将地址按图7-4分成4个字节从低位至高位依次写入。由于NAND FLASH的读按528字节的页为单位,因此,如果输入的读取长度大于528时,读完一页后需要等待FLASH再次准备好;如果读取长度不是528的整倍数时,需要读完整页,但是读出的数据不用保存。 在工程ex7_2的根底上新建工程ex7_3,其工作界面如图7-5所示。,图7-5 工程ex7_3的工作界面,如图7-5,工程ex7_3包括三个文件:、和,其中,和与工程ex7_2中的同名文件代码相同;的代码清单如下:1 / NAND FLASH Controller Registers Addr.2 #define NFCONF (*(volatile unsigned int *) 0x4E000000)3 #define NFCMD (*(volatile unsigned int *) 0x4E000004) 4 #define NFADDR (*(volatile unsigned int *) 0x4E000008)5 #define NFDATA (*(volatile unsigned int *) 0x4E00000C),6 #define NFSTAT (*(volatile unsigned int *) 0x4E000010)7 #define NFECC (*(volatile unsigned int *) 0x4E000014)8 9 #define CLKCON (*(volatile unsigned long *) (0x4C00000C)10 11 #define INTMSK (*(volatile unsigned long *) (0x4A000008)12,13 #define GPACON (*(volatile unsigned long *) (0x56000000)14 15 extern void openTimer1(void);16 17 extern void c_Timer1_ISR(void);18 19 void initTimer1(void);20 21 / Flash operator22 void initFlash(void);,23 void readFlashID(void);24 void flashRd(unsigned int addr,unsigned int size, unsigned char *buf);25 unsigned int flashID=0;26 unsigned char flashWhat3000;27 unsigned char flashDat3000;28 29 int main()30 31 int i,n=0;32 / initialize NAND Controller,33 initFlash();34 readFlashID();35 flashRd(0,3000,flashWhat);36 / Flash data,except 16B per 52837 for(i=0;i=n*528) 43 ,44 45 / Above is Nand Flash operator46 47 / 0x010FFF20+11*4 is the address of Timer 1 jumper48 *(volatile unsigned int *)(0x010FFF20+4*11) =(unsigned)c_Timer1_ISR;49 / initialize Timer 150 initTimer1(); 51 / Enable Timer 1 Interrupter52 openTimer1();53,54 while(1)55 56 57 58 59 60 / Init NAND Controller Reg61 void initFlash()62 63 INTMSK = 0xFFFFFFFF;64 CLKCON = 0x0007FFF0; / bit 4,65 GPACON = 0xFFFFFFFF;66 67 NFCONF = (115)|(112)|(011)|(78)|(74)|(70);68 69 while(!(NFSTAT 72 73 74 75 / Read flash ID,76 void readFlashID()77 78 int i;79 NFCMD = 0x90;80 NFADDR = 0x0;81 for(i=0;i4;i+)82 83 flashID=flashID | (NFDATA17) 106 107 ,108 while(i%528) / Read the entire page109 110 NFDATA;111 i+;112 113 while(!(NFSTAT 114 上述代码的第2527行定义了变量和数组,用于存放从K9F1208中读取的ID号和长度为3000字节的内容。第33行初始化NAND FLASH控制器,第34行读取FLASH的ID号。,第35行从FLASH中读取长度为3000字节的数据,第37至44行把读出的3000字节长度的数据中每528个字节去掉最后的16个字节。注意:这里读出的3000个字节首地址为0;如果首地址不为0,那么需要修改第3744行的代码,例如,首地址为5,那么循环内第39行和第40中的变量i应变为i+5。 通过编译连接,下载并调试程序可查得,flashWhat的地址为0x01000020,flashDat的地址为0x01000BD8,从Memory中可查看地址0x0、0x01000020和0x01000BD8三个地址的内容,可知,0x00xA08和0x01000BD80x010015E0的内容完全相同(后面的内容均为FF);而0x01000020每528个字节会出现16个字节的内容是多余的(这些字节读自NAND FLASH的校验区)。,7.2.3 K9F1208 Boot设计 K9F1208 Boot设计是指将可执行代码文件(Hex文件)通过ULINK2在线下载到K9F1208中,然后,取下ULINK2,系统执行K9F1208中的代码。通过ULINK2下载可执行代码到NAND FLASH中。有两种方法:其一,为借助MDK的菜单“FLASHDownload实现,这种方法在前面被屡次使用,用于直接下载当前工程文件的可执行代码(扩展名为.axf的文件);其二,为本节将介绍的方法,即编写一个下载工程,用于将Hex格式的文件写入到K9F1208中,可以下载任意MDK生成的工程可执行代码文件(以.hex为扩展名)。在介绍这个专用下载工程之前,需要介绍一下MDK生成的Hex文件的格式。,1Hex文件格式 翻开工程ex7_2所在的目录,可以找到文件,用UltraEdit或文本编辑器可以翻开该文件,如下:1 :0400000500000000F72 :020000040000FA3 :100000003CF09FE53CF09FE53CF09FE53CF09FE5304 :100010003CF09FE50000A0E13CF09FE53CF09FE54F5 :1000200004D04DE200032DE9B8919FE5009099E5D96 :10003000B4819FE5098188E0008098E508808DE51E,8 :100050006C0000007000000000000000740000005010 :10007000FEFFFFEAE9FFFFEAFEFFFFEA101111228F15 :1000C00004000000F0FF0700FF030000FF0700002E16 :1000D00000000000AA56AAAA0000000000000000CC17 :1000E0000000000000000000000000001A5900009D,18 :1000F000000000000000000000000000FF070000FA23 :10014000CCE04FE2FF1F9EE812E3A0E3FF1F8EE82224 :1001500056E4A0E388004FE2002090E5041090E50B,29 :1001A000000040E2D7F021E300D0A0E1000040E2EF30 :1001B000D1F021E300D0A0E1000040E2D2F021E34131 :1001C00000D0A0E1800040E2D3F021E300D0A0E12432 :1001D000080040E210F021E300D0A0E101AB4DE2C533 :1001E00014009FE510FF2FE11400004A20FF0F01CB36 :1002100000A08AE000B08BE001704AE20B005AE1D639 :10024000BC050000102052E27800B0287800A128F8,40 :10025000FBFFFF8A822EB0E13000B0283000A128D943 :100280000C109FE504209FE508309FE51EFF2FE13D45 :1002A00014109FE510402DE94C0F81E5030000EB9146 :1002B000100000EBFEFFFFEA1C03000000F00F013E47 :1002C0009510A0E35104A0E3001080E53010A0E3F648 :1002D000041080E500119FE5181080E50119A0E3E649 :1002E0001C1080E50A1CA0E3081080E5091CA0E3AF50 :1002F000081080E51EFF2FE10010A0E34A04A0E3F0,53 :100320004A04A0E3001090E5021BA0E3001080E56261 :1003A0000050A0E10F0000EB34209FE50030D2E7C1,62 :1003B0000203A0E31031C0E50110D2E71211C0E53D63 :1003C000010085E2080084E500000FE18000C0E34164 :1003D00000F021E13F50BDE804F05EE21F4E00005665 :1003E000000000010C00000101C090E12100004A6266 :1003F0000020A0E3A0C071E01A00003A20C271E02267 :100400000F00003A20C471E00100003A0030A0E380,76 :1004900020C471E00F00003A0113A0E120C471E01477 :1004A0003F2382E30B00003A0113A0E120C471E07678 :1004B0003F2682E30700003A0113A0E120C471E06779 :1004C0003F2982E30113A0213F2C822300C071E26780 :1004D0001D00002A2113A021A0C371E08103402048,90 :1005700004E0A0E10D402DE9320000EB0040B0E1C591 :100580000D40BDE80210B0E10EF0A0E10020B0E1A693 :1005A0000000A0E1EFFFFFEB03002DE9780000EB7694 :1005B0000300BDE8340000EB0F002DE9770000EBED,95 :1005C0000F00BDE834FFFFEB2B0000EB01402DE9ED96 :1005D0000000A0E1680000EB0140BDE8000000EB7697 :1005E0000000E0E31B0000EB0E50A0E11F0000EB5998 :1005F00005E0A0E10050B0E10D10A0E10A30A0E15B100 :1006100019FFFFEB2040BDE80060A0E30070A0E3FD102 :10063000C009ACE8C009ACE8C009ACE8C009ACE846103 :1006400001D0A0E10EF0A0E104009FE50EF0A0E1D2104 :100650000EF0A0E12C0000010C109FE51800A0E3B3,108 :100690003E002DE90040A0E10150A0E14C0000EB3C109 :1006A00000408DE50000A0E304508DE50000A0E1CE110 :1006B00008008DE500008DE2EBFEFFEB0040A0E1BD111 :1006C0000150A0E103009DE80270A0E10360A0E1F9112 :1006D0000000A0E10000A0E10000A0E10010A0E304113 :1006E0000100A0E10000A0E10080A0E12F0000EBEC114 :1006F0000010A0E3008080E50090A0E10100A0E1EF,121 :100760000CD08DE20400A0E10510A0E10720A0E17B125 :1007A00010402DE90000A0E11080BDE80EF0A0E1AE126 :1007B00004009FE50EF0A0E10EF0A0E13C00000176127 :1007C0000EF0A0E104009FE50EF0A0E10EF0A0E124,128 :1007D0002000000110402DE9F9FFFFEB0010A0E31D129 :1007E000001080E51080BDE8F8070000000000015F130 :1007F0001C00000044020000000000000000000097132 :04081000C6A1868E69133 :00000001FF其中,行号是作者添加的。每行均以“:开头,其结构样式如下::AABBBBCCDD.DDEE例如,对于第4行“:100010003CF09FE50000A0E13CF09FE53CF09FE54F,这里,,AA = 10,表示该行有0x10(即16)个数据。BBBB = 0010,表示该行16个数据存入FLASH中的首地址为0x0010。CC = 00,表示该行中DDDD位置处的数据类型,00表示写入到FLASH中的数据;如果CC = 01,表示Hex文件的结尾,如第133行;CC = 04表示数据为32位地址的高16位地址偏置,如第2行;CC = 05,表示写入地址的32位基地址,如第1行。DDDD为3CF09FE50000A0E13CF09FE53CF09FE5,为该行中的数据。EE = 4F表示该行所有字节数据的加校验和,满足0x10 + 0x00 + 0x10 + 0x00 + 0x3C + + 0xE5+0x4F = 0x00(只保存低8位),从第1行可知,32位基地址为0x00000000,从第2行知,高16位地址基址为0x0000,而第3行的16位地址为0x0000,即第3行的字节数据“3CF09FE53CF09FE53CF09FE53C F09FE5写入FLASH的首地址为“基地址+高16位地址:16位地址,即为0x00000000;如果基地址为0x00000000,高16位地址基址为0x0010,那么此处的首地址为0x00100000。因此,第1行16个数据依次写入FLASH的地址0x00xF。同理,第2行数据依次写入地址0x100x1F,依次类推。第132行字节数据只有0x04个,即“C6A1868E,将被写入FLASH地址0x08100x0813。第133行中AA = 00且CC = 01表示该行为Hex文件的结尾。,根据上面的介绍,把转化为如下的头文件,即建立一个无符号字符数组FlashDat存放写入FLASH中的所有字节数据,建立一个整型常量iDatN存放数组FlashDat的长度。代码如下:1 unsigned char FlashDat2068=2 0x3C,0xF0,0x9F,0xE5,0x3C,0xF0,0x9F,0xE5,0x3C,0xF0,0x9F,0xE5,0x3C,0xF0,0x9F,0xE5,3 0x3C,0xF0,0x9F,0xE5,0x00,0x00,0xA0,0xE1,0x3C,0xF0,0x9F,0xE5,0x3C,0xF0,0x9F,0xE5,4 0x04,0xD0,0x4D,0xE2,0x00,0x03,0x2D,0xE9,0xB8, 0x91,0x9F,0xE5,0x00,0x90,0x99,0xE5,5 0xB4,0x81,0x9F,0xE5,0x09,0x81,0x88,0xE0,0x00, 0x80,0x98,0xE5,0x08,0x80,0x8D,0xE5, 6 0x00,0x83,0xBD,0xE8,0x04,0x01,0x00,0x00,0x64, 0x00,0x00,0x00,0x68,0x00,0x00,0x00,7 0x6C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,8 0x78,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!