声明:

本文是本人在韦东山笔记的基础上加了一些注释,方便理解。原文地址:http://wiki.100ask.org/%E7%AC%AC015%E8%AF%BE_Nor_Flash#.E7.AC.AC001.E8.8A.82_Nor_Flash.E5.8E.9F.E7.90.86.E5.8F.8A.E7.A1.AC.E4.BB.B6.E6.93.8D.E4.BD.9C

目录

    • 声明:
  • 第01节 Nor Flash原理及硬件操作
    • 1 Nor Flash芯片原理图分析。
    • 2 Flash介绍
    • 3 Nor Flash的几个操作示例
      • 3.1 实例1
      • 3.2 实例2
      • 3.3Nor Flash的两种规范
      • 3.4 Nor Flash写数据
  • 第02节 Nor Flash编程_识别
    • 2.1 主函数
    • 2.2Nor Flash的测试
    • 2.3进入NOR FLASH的CFI模式,读取各类信息
    • 2.3 do_scan_nor_flash()函数中用到的函数
  • 第03节 Nor Flash编程_擦写读

第01节 Nor Flash原理及硬件操作

1 Nor Flash芯片原理图分析。

Nor Flash芯片的连接线有地址线,数据线,片选信号读写信号等,Nor Flash的接口属于内存类接口,Nor Flash可以向内存一样读,但是不能像内存一样写,需要做一些特殊的操作才能进行写操作(其实是不让你写,以防止你破坏了程序,这是它的一个优点),读只需像内存一样读很简单。
Nor Flash原理图如图:

2 Flash介绍

常用的Flash类型有Nor Flash和NAND Flash两种。
Nor Flash由Intel公司在1988年发明,以替代当时在市场上占据主要地位的EPROM和E2PROM。NAND Flash由Toshiba公司在1989年发明。两者的主要差别如下表:

(1)Nor Flash支持XIP,即代码可以直接在Nor Flash上执行,无需复制到内存中。这是由于NorF lash的接口与RAM完全相同,可以随机访问任意地址的数据。Nor Flash进行读操作的效率非常高,但是擦除和写操作的效率很低,另外,Nor Flash的容量一般比较小。NAND Flash进行擦除和写操作的效率更高,并且容量更大。一般而言,Nor Flash用于存储程序,NAND Flash用于存储数据。基于NAND Flash的设备通常也要搭配Nor Flash以存储程字。

(2)Flash存储器件由擦除单元(也称为块)组成,当要写某个块时,需要确保这个块己经 被擦除(擦除是将 位 置一)。Nor Flash的块大小范围为64kB、128kB:NAND Flash的块大小范围为8kB,64kB,擦/写一个Nor Flash块需4s,而擦/写一个NAND Flash块仅需2ms。Nor Flash的块太大,不仅增加了擦写时间,对于给定的写操作,Nor Flash也需要更多的擦除操作——特别是小文件,比如一个文件只有IkB,但是为了保存它却需要擦除人小为64kB—128kB的Nor Flash块。

(3)Nor Flash的接口与RAM完全相同,可以随意访问任意地址的数据。而NAND Flash的 接口仅仅包含几个I/O引脚,需要串行地访问。NAND Flash一般以512字节为单位进行读写。这使得Nor Flash适合于运行程序,而NAND Flash更适合于存储数据。

(4)容量相同的情况下,NAND Flash的体积更小,对于空间有严格要求的系统,NAND Flash可以节省更多空间。市场上Nor Flash的容量通常为1MB至4MB(当然最大也有32MB的Nor Flash),NAND Flash的容量为8MB~512MB。容量的差别也使得Nor Flash多用于存储程序,NAND Flash多用于存储数据。

(5)对于Flash存储器件的可靠性需要考虑3点:位反转、坏块和可擦除次数。所有Flash器件都遭遇位反转的问题:由于Flash固有的电器特性,在读写数据过程中,偶然会产生一位或几位数据错误(这种概率很低),而NAND Flash出现的概率远大于Nor Flash,当位反转发生在关键的代码、数据上时,有可能导致系统崩溃。当仅仅是报告位反转,重新读取即可:如果确实发生了位反转,则必须有相应的错误检测/恢复措施。在NAND Flash上发生位反转的概率史高,推荐使用EDC/ECC进行错误检测和恢复。NAND Flash上面会有坏块随机分布,在使用前需要将坏块扫描出来,确保不再使用它们,否则会使产品含有严重的故障。NAND Flash每块的可擦除次数通常在100000次左右,是Nor Flash的10倍。另外,因为NAND Flash的块大小通常是NorF lash的1/8,所以NAND Flash的寿命远远超过Nor Flash。

(6)嵌入式Linux对Nor、NAND Flash的软件支持都很成熟。在Nor Flash上常用jffs2文 件系统,而在NAND Flash常用yaffs文件系统。在更底层,有MTD驱动程序实现对它们的读、写、擦除操仵,它也实现了EDC/ECC校验。

3 Nor Flash的几个操作示例

下面我们使用u-boot来体验Nor Flash的操作(开发板设置Nor启动,进入u-boot)。
1).第一步:使用OpenJTAG烧写UBOOT到Nor Flash,开发板设置Nor启动,打开串口助手并进入u-boot。
那么我们怎么用u-boot来操作呢?
Nor Flash手册里会有一个命令的表格,如图:
这个表格什么意思怎么用的呢?简单的举一些例子:
(1)复位(reset):往任何一个地址写入F0。
(2)读ID(ReadSiliconID):很多的Nor Flash可以配置成位宽16bit(Word),位宽8bit(Byte)。对于我们使用的jz2440开发板使用是位宽16bit,怎样读ID呢?
根据前面得图可知,往Nor Flash的555地址写AA,再往2AA的地址写入55,再往555的地址写入90,然后就可以读ADI地址,就可以读到DDI数据了。

3.1 实例1

读数据:
在u-boot上执行:md.b 0
串口显示结果:

00000000:170000ea14f09fe514f09fe514f09fe5................
00000010:14f09fe514f09fe514f09fe514f09fe5................
00000020:6001f833c001f8332002f8337002f833`..3...3..3...3
00000030:e002f8330004f8332004f833efbeadde...3...3..3....

(这些代码就是u-boot程序的机器码,即我们烧写在Nor flash上的程序。我们用UltraEdit打开u-boot程序的机器码,发现和我们烧进去的数据完全一样。
可以得出结论:u-boot可以像读内存一样来读nor flash。

3.2 实例2

读ID
参考Nor 芯片手册(即上面的图片),读ID步骤为:

往地址555H写入AAH(解锁)
往地址2AAH写入55H(解锁)
往地址555H写入90H(命令)
读0地址得到厂家ID(C2H)
读1地址得到设备ID(22DAH或225BH)
退出读ID状态:给任意地址写F0H就可以了。

这里插入补充一下知识点,下图为2440和Nor Flash的简易连接图:

即:2440的A1接到Nor的A0,所以2440发出的地址是Nor Flash收到的地址左移一位。比如:2440发出(555H<<1)地址,Nor Flash才能收到555H这个地址。下面这个表,对在Nor Flash的操作,2440的操作,U-BOOT上的操作进行比较,如下表:

U-BOOT上的操作(即在串口输入如下代码):

mw.waaaaa
mw.w 554 55
mw.w aaa 90
md.w 0 1
md.w 2 1
mw.w 0 f01).当执行过
md.w  0  1
结果(输出厂家ID):
00000000:00c2..(00c2就是厂家ID)2).当执行过
md.w  2  1
结果(输出设备ID):
00000002:2249I"(2249就是设备ID)3).当执行
mw.w  0  f0
就退出读ID的状态,4)执行:
md.b 0
结果:
00000000:17.(读到的就是Nor Flash地址 0 上的数据)

3.3Nor Flash的两种规范

通常内核里面要识别一个 Nor Flash 有两种方法:
一种是 jedec 探测,就是在内核里面事先定义一个数组,该数组里面放有不同厂家各个芯片的一些参数,探测的时候将 flash 的 ID 和 数组里面的 ID 一 一比较,如果发现相同的,就使用该数组的参数。 jedec 探测的优点就是简单,缺点是如果内核要支持的 flash 种类很多,这个数组就会很庞大。内核里面用 jedec 探测一个芯片时,是先通过发命令来获取 flash 的 ID,然后和数组比较,但是 flash.c 中连 ID 都是自己通过宏配置的。
另一种是 CFI(common flash interface)探测,就是直接发各种命令来读取芯片的信息,比如 ID、容量等,芯片本身就包含了电压有多大,容量有有多少等信息。

下面对在Nor Flash上操作,2440上操作,U-BOOT上操作cfi 探测(读取芯片信息)进行比较参考芯片手册。

3.4 Nor Flash写数据

我们在Nor Flash的10000的地址读数据,
md.w 100000 1
结果:
00100000:ffff…

在Nor flash的10000的地址写数据下0x1234,
mw.w 100000 1234

然后在这个地址读数据,
md.w 100000 1
结果:
00100000:ffff(即说明 : 这个地址上的数据没有被修改,写操作无效)。

那么怎样把数据写进Nor Flash进去呢?
写数据之前必须保证,要写的地址是擦除的。
下面是Nor Flash的写操作,如下表:

1).U-BOOT执行完上述指令后,0x1234,就被写到0x100000地址处,我们读一下看看1234是否被写进去:
执行:
md.w1000001
结果(1234被写进去):
00100000:1234 4

从这里可以看出来U-BOOT的操作不是很复杂。

2).我们再次往0x100000地址处,写入0x5678,执行如下命令:

mw.w  aaa  aa
mw.w  554  55
mw.w  aaa  a0
mw.w  100000  5678

查看0x100000地址处的数据
md.w 100000 1

结果:
00100000:12300.
即0x100000地址处的数据不是0x5678,说明写操作失败,失败的原因是:原来的数据已经是0x1234不是全0xffff,再次写操作失败,(Nor Flash只有先擦出,才能烧写)。

第一步:先擦除(参考Nor Flash芯片手册)

Nor Flash操作 u-boot操作
555H AAH//解锁 mw.w aaa aa
2AAH 55H//解锁 mw.w 554 55
555H 80H mw.w aaa 80
555H AAH//解锁 mw.w aaa aa
2AAH 55H//解锁 mw.w 554 55
SA 30H //往扇区地址写入30 mw.w 100000 30//即将100000处擦除

执行完上述指令后测试
执行:
md.w 100000 1
结果:
00100000:ffff…
说明地址100000已被擦除,这个时候再次烧写就不会有问题了。

再烧写

mw.w  aaa   aa
mw.w  554   55
mw.w  aaa   a0
mw.w  100000  5678

测试烧写结果 执行:
md.w 100000 1
结果:
00100000:5678 xV
数据被烧写进去,烧写成功。

总结:我们烧写时,如果上面的数据,不是0ffff,没有被擦除过,我们就要先擦出,擦除完后,才可以烧写,擦除烧写的命令可以从芯片手册里面获得。

第02节 Nor Flash编程_识别

本节源码见F:\韦东山\005_ARM裸机1期加强版(又叫新1期,151节,23节免费,已完结)\源码文档图片\源码\源码_20180321_添加传感器\018_nor_flash_015_002_0032文件夹

我们来做一个测试,测试内容是:
1、识别nor flash,包括:
(1)打印厂家ID,打印设备ID
(2)打印容量
(3)打印各个扇区的起始地址
2、擦除nor flash某个扇区
3、编写某个地址
4、读某个地址
而这一节呢,我们来测试的内容是识别nor flash

我们来看编程:

2.1 主函数

main函数代码如下所示。把timer中断去掉,否则: 测试NOR Flash时进入CFI等模式时, 如果发生了中断,cpu必定读NOR Flash,那么读不到正确的指令,导致程序崩溃。

12   int main(void)
13  {14      led_init();
15      //interrupt_init();  /* 初始化中断控制器 */
16      key_eint_init();   /* 初始化按键, 设为中断源 */
17      //timer_init();
18
19      puts("\n\rg_A = ");
20      printHex(g_A);
21      puts("\n\r");
22
/*-----------------加入nor_flash_test()函数-----------------------*/
23      nor_flash_test();
24
25      return 0;
26  }

2.2Nor Flash的测试

nor_flash_test函数通过switch语句,分别处理识别NOR Flash,擦除NOR Flash某个扇区,编写某个地址,读某个地址。代码如下:

232  void nor_flash_test(void)
233 {234     char c;
235
236     while (1)
237     {238         /* 打印菜单, 供我们选择测试内容 */
239         printf("[s] Scan nor flash\n\r");
240         printf("[e] Erase nor flash\n\r");
241         printf("[w] Write nor flash\n\r");
242         printf("[r] Read nor flash\n\r");
243         printf("[q] quit\n\r");
244         printf("Enter selection: ");
245
246         c = getchar();
247         printf("%c", c);
248
249         /* 测试内容:
250          * 1. 识别nor flash
251          * 2. 擦除nor flash某个扇区
252          * 3. 编写某个地址
253          * 4. 读某个地址
254          */
255         switch (c)
256         {257             case 'q':
258             case 'Q':
259                 return;
260                 break;
261
262             case 's':
263             case 'S':
264                 do_scan_nor_flash();
265                 break;
266
267             case 'e':
268             case 'E':
269                 do_erase_nor_flash();
270                 break;
271
272             case 'w':
273             case 'W':
274                 do_write_nor_flash();
275                 break;
276
277             case 'r':
278             case 'R':
279                 do_read_nor_flash();
280                 break;
281             default:
282                 break;
283         }
284     }
285 }

2.3进入NOR FLASH的CFI模式,读取各类信息

do_scan_nor_flash函数代码如下,该函数的功能:进入CFI模式读取NOR Flash中的厂家ID,设备ID,容量等信息。

50/* 进入NOR FLASH的CFI模式
51 * 读取各类信息
52 */
53  void do_scan_nor_flash(void)
54  {55      char str[4];
56      unsigned int size;
57      int regions, i;
58      int region_info_base;
59      int block_addr, blocks, block_size, j;
60      int cnt;
61
62      int vendor, device;
63
64      /* 打印厂家ID、设备ID */
65      nor_cmd(0x555, 0xaa);    /* 解锁 */
66      nor_cmd(0x2aa, 0x55);
67      nor_cmd(0x555, 0x90);    /* read id */
68      vendor = nor_dat(0);
69      device = nor_dat(1);
70      nor_cmd(0, 0xf0);        /* reset */
71
72      nor_cmd(0x55, 0x98);  /* 进入cfi模式 */
073
74      str[0] = nor_dat(0x10);
75      str[1] = nor_dat(0x11);
76      str[2] = nor_dat(0x12);
77      str[3] = '\0';
78      printf("str = %s", str);
79
80      /* 打印容量 */
81      size = 1<<(nor_dat(0x27));
82      printf("v=0x%x,d=0x%x,s=0x%x,%dM",vendor,device,size,size/(1024*1024));
83
84      /* 打印各个扇区的起始地址 */
85      /* 名词解释:
86       *    erase block region : 里面含有1个或多个block, 它们的大小一样
87       * 一个nor flash含有1个或多个region
88       * 一个region含有1个或多个block(扇区)
89
90       * Erase block region information:
91       *    前2字节+1    : 表示该region有多少个block
92      *    后2字节*256  : 表示block的大小
93      */
94
95      regions = nor_dat(0x2c);
96      region_info_base = 0x2d;
97      block_addr = 0;
98      printf("Block/Sector start Address:");
99      cnt = 0;
100     for (i = 0; i < regions; i++)
101     {102        blocks = 1 + nor_dat(region_info_base) + (nor_dat(region_info_base+1)<<8);
103        block_size=256*(nor_dat(region_info_base+2)+(nor_dat(region_info_base+3)<<8));
104        region_info_base += 4;
105
106            //printf("…………");
107
108         for (j = 0; j < blocks; j++)
109         {110             /* 打印每个block的起始地址 */
111             //printf("0x%08x ", block_addr);
112             printHex(block_addr);
113             putchar(' ');
114             cnt++;
115             block_addr += block_size;
116             if (cnt % 5 == 0)
117             printf("\n\r");
118     }
119     }
120 printf("\n\r");
121 /* 退出CFI模式 */
122 nor_cmd(0, 0xf0);
123 }

第65,66行 这两步是解锁,解锁之后就进入读ID状态,就可以读取厂家和设备ID了。
第68行 是把读取到的厂家ID的值,复制给vendor变量。
第69行 是把读取到的设备ID的值,复制给device变量。
第70行 退出读ID状态: 给任意地址写F0H。
第72行,往地址0x55地址写入数据0x98,是进入cfi模式。
第74,75,76行是读取NOR Flash地址0x10,0x11,x012中的字符,赋值给字符串str。
第81行,根据芯片手册可知道,读取NOR Flash地址0x27处的数据,得到的是NOR Flash容量大小2的幂数,所以把1左移读取到的数据,就可得到NOR Flash的容量。

第95行读取NOR Flash地址0x2c地址中的数据,可以得到NOR Flash中有多少region。
第102行根据Erase block region information:的信息可以知道读取[2E,2D]这两个字节的地址+1,可以得到一个region有多少block(参考芯片手册)。代码中的region_info_base变量的值是0x2d,0x2d是前两个字节中的低字节,0x2e是前两个字节中的高字节,所以需要左移8位,然后加上1就得到了一个region有多少block.。

第103行参考芯片手册,读取[30,2F]这两个字节地址,然后乘上256就可以得到一个块的大小。
第104行,地址加4,读取下一个region有多少block和每个block的大小。
第112,115行,由于NOR Flash的基地址是0,所以第一个block的首地址是0,下一个block的首地址,就是上一个block的首地址加上block的大小。

第112行往0地址写入0xf0,退出CFI模式。

2.3 do_scan_nor_flash()函数中用到的函数

发送命令函数
nor_cmd函数代码如下,往NOR Flash某个地址发送指令,

16
17  /* offset是基于NOR的角度看到 */
18  void nor_cmd(unsigned int offset, unsigned int cmd)
19  {20      nor_write_word(NOR_FLASH_BASE, offset, cmd);
21  }

单独再写一个void nor_write_word()函数是为了方便你,不用在nor_cmd()函数中再增加一个unsigned int base了。也就是说有了void nor_write_word()函数,不用每次再关心基地址NOR_FLASH_BASE了。

void nor_write_word(unsigned int base, unsigned int offset, unsigned int val)
{volatile unsigned short *p = (volatile unsigned short *)(base + (offset << 1));*p = val;
}

读取地址中的数据
nor_dat函数中写入NOR Flash某个地址,返回该NOR Flash地址上的数据。

29   unsigned int nor_dat(unsigned int offset)
30  {31      return nor_read_word(NOR_FLASH_BASE, offset);
32  }

读取函数
单独写一个nor_read_word函数也是为了方便不用再每次操作base了。
nor_read_word函数是从NOR Flash 读取两个字节(本开发板位宽16bit),读取数据的地址,是基于2440,所以读取NOR Flash某个地址上的数据时,需要把NOR Flash对应的地址左移一位(地址乘以2)。

23   unsigned int nor_read_word(unsigned int base, unsigned int offset)
24  {25      volatile unsigned short *p = (volatile unsigned short *)(base + (offset << 1));
26      return *p;
27  }

第03节 Nor Flash编程_擦写读

本节接着上一节继续写。
本实例的目的:擦除nor flash某个扇区;编写某个地址;读某个地址。

先写读NOR Flash
do_read_nor_flash函数代码如下,由于NOR Flash是内存类接口,可以像内存一样读取。

191  void do_read_nor_flash(void)
192 {193     unsigned int addr;
194     volatile unsigned char *p;
195     int i, j;
196     unsigned char c;
197     unsigned char str[16];
198
199     /* 获得地址 */
200     printf("Enter the address to read: ");
201     addr = get_uint();//从串口获取
202
203     p = (volatile unsigned char *)addr;
204
205     printf("Data :  \n\r");
206     /* 长度固定为64 */
207     for (i = 0; i < 4; i++)
208     {209         /* 每行打印16个数据 */
210         for (j = 0; j < 16; j++)
211         {212             /* 先打印数值 */
213             c = *p++;
214             str[j] = c;
215             printf("%02x ", c);
216         }
217
218         printf("   ; ");
219
220         for (j = 0; j < 16; j++)
221         {222             /* 后打印字符 */
223             if (str[j] < 0x20 || str[j] > 0x7e)  /* 不可视字符 */
224                 putchar('.');
225             else
226                 putchar(str[j]);
227         }
228         printf("\n\r");
229 }
第201行中的get_uint函数,从串口中获得输入的地址。第203行,强制类型转化。
第207行~216行是对NOR Flash内容的读取,输出的内容为16进制的数据,由于NOR Flash是内存类接口,
可以像内存一样读取。
第220行~227输出NOR Flash的内容为字符型数据,其中的第223行用来判断,输出的字符是否为不可视字符,
要是为不可视字符输出点'.',要是可视字符输出字符

写擦除NOR Flash 某个扇区
do_erase_nor_flash函数的代码如下。参考芯片手册,就可以知道擦除某个扇区,还是相对比较简单的。

125  void do_erase_nor_flash(void)
126 {127     unsigned int addr;
128
129         /* 获得地址 */
130     printf("Enter the address of sector to erase: ");
131     addr = get_uint();
132
133     printf("erasing ...");
134     nor_cmd(0x555, 0xaa);    /* 解锁 */
135     nor_cmd(0x2aa, 0x55);
136     nor_cmd(0x555, 0x80);    /* erase sector */
137
138     nor_cmd(0x555, 0xaa);    /* 解锁 */
139     nor_cmd(0x2aa, 0x55);
140     nor_cmd(addr>>1, 0x30);    /* 发出扇区地址 */
141     wait_ready(addr);
142 }
第131行,get_uint函数用于获取输入的地址。
第134,135这两行是解锁。
第136行是erase sector。
第138,139行是再次解锁。
第140行是对发出的扇区地址。
第 141行等待擦除完成。

等待烧写函数
等待烧写完成 : 读数据, Q6无变化时表示结束 (参考芯片手册),

35   void wait_ready(unsigned int addr)
36  {37      unsigned int val;
38      unsigned int pre;
39
40      pre = nor_dat(addr>>1);
41      val = nor_dat(addr>>1);
42      while ((val & (1<<6)) != (pre & (1<<6)))
43      {44          pre = val;
45          val = nor_dat(addr>>1);
46      }
47}

接下来是写NOR Flash
do_write_nor_flash的代码如下所示,开发板上的NOR Flash的位宽是16bit,所以可以把要写的数据构造出16bit然后在写进NOR Flash中。

144  void do_write_nor_flash(void)
145 {146     unsigned int addr;
147     unsigned char str[100];
148     int i, j;
149         unsigned int val;
150
151     /* 获得地址 */
152     printf("Enter the address of sector to write: ");
153     addr = get_uint();
154
155     printf("Enter the string to write: ");
156     gets(str);
157
158     printf("writing ...\n\r");
159
160     /* str[0],str[1]==>16bit
161      * str[2],str[3]==>16bit
162     */
163     i = 0;
164     j = 1;
165     while (str[i] && str[j])
166     {167         val = str[i] + (str[j]<<8);
168
169         /* 烧写 */
170         nor_cmd(0x555, 0xaa);    /* 解锁 */
171         nor_cmd(0x2aa, 0x55);
172         nor_cmd(0x555, 0xa0);    /* program */
173         nor_cmd(addr>>1, val);
174         /* 等待烧写完成 : 读数据, Q6无变化时表示结束 */
175         wait_ready(addr);
176
177         i += 2;
178         j += 2;
179         addr += 2;
180     }
181
182     val = str[i];
183     /* 烧写 */
184     nor_cmd(0x555, 0xaa);    /* 解锁 */
185     nor_cmd(0x2aa, 0x55);
186     nor_cmd(0x555, 0xa0);    /* program */
187     nor_cmd(addr>>1, val);
188     /* 等待烧写完成 : 读数据, Q6无变化时表示结束 */
189     wait_ready(addr);
190 }
第153行把通过get_uint获得的地址赋值给addr变量,
第156行通过gets函数获得输入的字符串。
第168行两个8位的数据,组合成一个16位的数据赋值给变量val。

07 - Nor Flash相关推荐

  1. flash 上传文件 java_Flash 二进制传图片到后台Java服务器接收

    需求:把客户端处理过的图片返还给服务器 Flash端代码 01 package { 02     import com.adobe.images.JPGEncoder; 03     import f ...

  2. TMS570学习3-内部Flash编程

    QQ:971586331 软件环境: 操作系统:windows 10 IDE:CCS7.4 代码生成工具:HALCoGen 04.07.01 Flash操作库:F021FlashApi-02.01.0 ...

  3. Flash被全世界抛弃,到底经历了什么

    今天打开电脑的第一刻,接收到google浏览器的一封通知,如下: For 20 years, Flash has helped shape the way that you play games, w ...

  4. 制作Slider组件

    利用as3,我们可以尝试制作一些有趣的组件,虽然现在已经有很多实用的组件,但是自己尝试写一下也是不错的.利用as3语法,借用了绘图Api我们尝试制作一下这个组件.因为我们不需要很强大的功能,对此我们只 ...

  5. pcie16x能插1x的卡嘛?_这7个修复工具分享给你:不仅能修复U盘,SD卡、TF卡也能修复!...

    今天小编就一口气把7个修复工具分享给大家,这些修复工具不仅能修复U盘,而且还能修复SD卡和TF卡哦~下面就来看看是哪几个神器吧!(文末提供下载) 在正式操作之前有几点需要提醒一下: 1.修复的过程中不 ...

  6. pcie16x能插1x的卡嘛?_小白把这7个修复工具分享给你:不仅能修复U盘,SD卡、TF卡也能修复!...

    此前分享给大家的U盘量产工具帮助了许多朋友修复了本来不能使用的U盘,但是仍然有不少朋友反映"主控型号无法检测""没有对应的量产工具可以下载""量产后仍 ...

  7. NEC TOPAZ 程控交换机话机编程手册

    一.进入编程 在待机下按SPK→#*#*→12345678(初始密码)→HOLD 退出:DC键三次,SPK. 二.外线打进振铃设置 1.专线打进设置:进入程序后按22→02→01→按FLASH→选择外 ...

  8. 浏览器缓存导致FLASH资源更新问题的解决方案

    在网上搜浏览器缓存问题时,遇上了很多问题.一是不知道应该用何种关键字搜索,二是一搜出来,就全是讲的是如何禁用浏览器缓存的方案. 作为大型点的FLASH WEBGAME来说,不缓存显然是不行的.总体上来 ...

  9. [Flash开发笔记] 如何在as2.0中使用自定义类事件

    as2编程中,我们通常要处理一些异步加载的数据,有点类似ajax中的callback,即我们不知道何时数据才会返回,并且只有当数据返回时,执行我们定义的操作.     在flash6及以前,我们会常常 ...

最新文章

  1. 2018-3-1 算法学习部分
  2. 【JBPM4】完成任务
  3. 【最简便解法】1086 就不告诉你 (15分)_13行代码AC
  4. canvas实现的喜羊羊图像效果
  5. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Action的实现类
  6. 现代软件工程系列 结对编程 (II) 电梯调度程序
  7. 中国糖化酶行业市场供需与战略研究报告
  8. python正则表达式 身份证_python3中6种常用正则表达式
  9. ubuntu 设置保护色
  10. 区块链学习路线图 初阶+中阶+高阶
  11. 【TWVRP】基于matlab蚁群算法求解带时间窗的多中心车辆路径规划问题【含Matlab源码 112期】
  12. 阿里云云计算 51 在线实验--安全中心初体验
  13. 【重识云原生】第四章云网络第二节——相关基础知识准备
  14. 一元四次方程欧拉解法的证明
  15. 还记得那年大明湖畔的Java 7吗
  16. DM642的PCI驱动编程笔记:遍历一块内存空间的源码
  17. linux mtd 命令,Linux MTD介绍
  18. 解决studio 3T时间到期方法
  19. html、css简单页面练习
  20. 手把手带你入门和实践特征工程的万字笔记(附代码下载)

热门文章

  1. 【笔记】机器视觉 光源篇
  2. cmd查看历史操作命令
  3. Black Arch虚拟机安装及配置
  4. vue中如何引入jquery详解
  5. ActionListener的用法
  6. USACO2018 OPEN TEST - Silver
  7. 单代号网络图计算例题_还在熬夜计算工期?不会优化工期?学会双代号网络图效率提高80%,升职加薪其实不难...
  8. Oracle SQL_TRACE使用小结
  9. tensorflow 之tf.Session
  10. 【C++ STL应用与实现】23: 如何使用std::mem_fn (since C++11)