目录

一、SRAM控制原理

1.1、型号为IS62WV51216的SRAM芯片外观:

1.2、SRAM芯片的内部功能框架:

1.2.1、SRAM的存储矩阵:

1.2.2、地址译码器、列I/O及I/O数据电路

1.2.3、控制电路

1.3、SRAM的读写流程

1.3.1、SRAM的读写时序参数

二、STM32的FSMC特性及架构

2.1、FSMC简介

2.2、FSMC框图剖析

2.2.1、通讯引脚

2.2.2、存储器控制器

2.2.3、时钟控制逻辑

2.3、FSMC的地址映射

2.4、FSMC控制SRAM的时序

三、FSMC控制SRAM的相关结构体

3.1、FSMC结构体

3.1.1、FSMC时序结构体

3.1.2、FSMC的SRAM初始化结构体


本文主要介绍了SRAM的原理介绍,从0到1的跨进。介绍FSMC是什么,怎么用。

本文主要参考资料:《野火STM32视频教程》


一、SRAM控制原理

STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32 芯片的外部扩展存储器了。

STM32F103ZE系列芯片可以扩展外部SRAM用作内存。

 1.1、型号为IS62WV51216的SRAM芯片外观:

1.2、SRAM芯片的内部功能框架:

SRAM信号线
信号线 类型 说明
A0-A18 I 地址输入
I/O0-I/O7 I/O 数据输入输出信号,低字节
I/O8-I/O15 I/O 数据输入输出信号,高字节
CS2和CS1# I 片选信号,CS2高电平有效,CS1#低电平有效,部分芯片只有 其中一个引脚
OE# I 输出使能信号,低电平有效
WE# I 写入使能,低电平有效
UB# I 数据掩码信号Upper Byte,高位字节允许访问,低电平有效
LB# I 数据掩码信号Lower Byte,低位字节允许访问,低电平有效

SRAM的控制比较简单,只要控制信号线使能了访问,从地址线输入要访问的地址,即可从I/O数据线写入或读出数据。

1.2.1、SRAM的存储矩阵:

 SRAM内部包含的存储阵列,可以把它理解成一张表格,数据就填在这张表格上和表格查找一样,指定一个行地址和列地址,就可以精确地找到目标单元格。这是SRAM芯片寻址的基本原理。这样的每个单元格被称为存储单元,而这样的表则被称为存储矩阵。

1.2.2、地址译码器、列I/O及I/O数据电路

地址译码器把根地址线转换成根信号线,每根信号线对应一行或一列存储单元,通过地址线找到具体的存储单元,实现寻址。访问时,使用UB#或LB#线控制数据宽度。

1.2.3、控制电路

控制电路主要包含了片选、读写使能以及上面提到的宽度控制信号UB#和LB#。利用CS2或CS1#片选信号,可以把多个SRAM芯片组成一个大容量的内存条。 OE#和WE#可以控制读写使能,防止误操作。

1.3、SRAM的读写流程 

对SRAM进行数据时,它各个信号线的时序流程如下:

对SRAM进行数据时,它各个信号线的时序流程如下:

读写时序的流程很类似,过程如下:

(1) 主机使用地址信号线发出要访问的存储器目标地址;

(2) 控制片选信号CS1#及CS2#使能存储器芯片;

(3) 若是要进行读操作,则控制读使能信号OE#表示要读数据,若进行写操作则控制写使能信号WE#表示要写数据;

(4) 使用掩码信号LB#与UB#指示要访问目标地址的高、低字节部分;

(5) 若是读取过程,存储器会通过数据线向主机输出目标数据,若是写入过程,主要使用数据线向存储器传输目标数据。

1.3.1、SRAM的读写时序参数

时间参数 IS62WV51216BLL-55ns 型号要求的最短时间 说明
55ns 读操作周期
0ns 地址访问时间
55ns 写操作周期
0ns 地址建立时间
25ns 数据建立至写结束的时间
0ns 数据写结束后的保持时间

二、STM32的FSMC特性及架构

2.1、FSMC简介

STM32F1系列芯片使用FSMC外设来管理扩展的存储器,FSMC是Flexible Static Memory Controller的缩写,译为灵活的静态存储控制器。

它可以用于驱动包括 以及类型的存储器,不能驱动如这种动态的存储器,而在STM32F429系列的控制器中,它具有外设,支持控制存储器。

2.2、FSMC框图剖析

2.2.1、通讯引脚

由于控制不同类型存储器的时候会有一些不同的引脚,看起来有非常多,其中地址线FSMC_A和数据线FSMC_D是所有控制器都共用的。 

FSMC引脚名称 对 应 SRAM 引 脚 名 说明
FSMC_NBL[1:0] LB#、UB# 数据掩码信号
FSMC_A[18:0] A[18:0] 行地址线
FSMC_D[15:0] I/O[15:0] 数据线
FSMC_NWE WE# 写入使能
FSMC_NOE OE# 输出使能(读使能)
FSMC_NE[1:4] CE# 片选信号

其中比较特殊的FSMC_NE是用于控制SRAM芯片的控制信号线, STM32具有FSMC_NE1/2/3/4号引脚,不同的引脚对应STM32内部不同的地址区域。

例如,当STM32访问0x68000000-0x6BFFFFFF地址空间时,FSMC_NE3引脚会自动设置为低电平,由于它连接到SRAM的CE#引脚,所以SRAM的片选被使能,而访问0x60000000-0x63FFFFFF地址时,FSMC_NE1会输出低电平。当使用不同的FSMC_NE引脚连接外部存储器时,STM32访问SRAM的地址不一样,从而达到控制多块SRAM芯片的目的。 

2.2.2、存储器控制器

上面不同类型的引脚是连接到FSMC内部对应的存储控制器中的。 NOR/PSRAM/SRAM设备使用相同的控制器,NAND/PC卡设备使用相同的控制器,不同的控制器有专用的寄存器用于配置其工作模式。 

控制SRAM的有FSMC_BCR1/2/3/4控制寄存器、 FSMC_BTR1/2/3/4片选时序寄存器以及FSMC_BWTR1/2/3/4写时序寄存器。 每种寄存器都有4个,分别对应于4个不同的存储区域,各种寄存器介绍如下: 

        • FSMC_BCR控制寄存器可配置要控制的存储器类型、数据线宽度以及信号有效极性能参数。

        • FSMC_BTR时序寄存器用于配置SRAM访问时的各种时间延迟,如数据保持时间、地址保持时间等。

        • FSMC_BWTR写时序寄存器与FMC_BTR寄存器控制的参数类似,它专门用于控制写时序的时间参数。

2.2.3、时钟控制逻辑

FSMC外设挂载在AHB总线上,时钟信号来自于HCLK(默认72MHz),控制器的同步时钟输出就是由它分频得到。

例如,NOR控制器的FSMC_CLK 引脚输出的时钟,它可用于与同步类型的SRAM芯片进行同步通讯,它的时钟频率可通过FSMC_BTR寄存器的CLKDIV位配置,可以配置为HCLK的1/2 或1/3,也就是说若它与同步类型的SRAM通讯时,同步时钟最高频率为36MHz。本示例中的SRAM为异步类型的存储器,不使用同步时钟信号,所以时钟分频配置不起作用。 

2.3、FSMC的地址映射

 FSMC连接好外部的存储器并初始化后,就可以直接通过访问地址来读写数据。 

        FSMC访问存储器的方式与I2C EEPROM、SPI FLASH的不一样, 后两种方式都需要控制I2C或SPI总线给存储器发送地址,然后获取数据;在程序里,这个地址和数据都需要分开使用不同的变量存储,并且访问时还需要使用代码控制发送读写命令。

而使用FSMC外接存储器时,其存储单元是映射到STM32的内部寻址空间的;在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FSMC外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制。

图中左侧的是Cortex-M3内核的存储空间分配,右侧是STM32 FSMC外设的地址映射。可以看到FSMC的NOR/PSRAM/SRAM/NAND FLASH以及PC卡的地址都在External RAM地址空间内。

正是因为存在这样的地址映射,使得访问FSMC控制的存储器时,就跟访问STM32的片上外设寄存器一样(片上外设的地址映射即图中左侧的 “Peripheral”区域)。 

FSMC把整个External RAM存储区域分成了4个Bank区域,并分配了地址范围及适用的存储器类型,如NOR及SRAM存储器只能使用Bank1的地址。 

在NOR及SRAM区域,每个Bank的内部又分成了4个小块,每个小块有相应的控制引脚用于连接片选信号,如FSMC_NE[4:1]信号线可用于选择 BANK1内部的4小块地址区域,当STM32访问0x68000000-0x6BFFFFFF地址空间时,会访问到Bank1的第3小块区域,相应的FSMC_NE3信号线会输出控制信号。 

2.4、FSMC控制SRAM的时序

 FSMC外设支持输出多种不同的时序以便于控制不同的存储器,它具有ABCD四种模式,下面我们仅针对控制SRAM使用的模式A进行讲解。

读时序

当内核发出访问某个指向外部存储器地址时,FSMC外设会根据配置控制信号线产生时序访问存储器,上图中的是访问外部SRAM时FSMC外设的读写时序。

以读时序为例,该图表示一个存储器操作周期由地址建立周期 (ADDSET)、数据建立周期(DATAST)以及2个HCLK周期组成。在地址建立周期中,地址线发出要访问的地址,数据掩码信号线指示出要读取地址的高、 低字节部分,片选信号使能存储器芯片;地址建立周期结束后读使能信号线发出读使能信号,接着存储器通过数据信号线把目标数据传输给FSMC, FSMC把它交给内核。

写时序

写时序类似,区别是它的一个存储器操作周期仅由地址建立周期 (ADDSET)和数据建立周期(DATAST)组成,且在数据建立周期期间写使能信号线发出写信号,接着FSMC把数据通过数据线传输到存储器中。

三、FSMC控制SRAM的相关结构体

3.1、FSMC结构体

控制FSMC使用SRAM存储器时主要是配置时序寄存器以及控制寄存 器,利用ST标准库的SRAM时序结构体以及初始化结构体可以很方便地写入参数。

• 时序结构体:FSMC_NORSRAMTimingInitTypeDef

        • 初始化结构体:FSMC_NORSRAMInitTypeDef

3.1.1、FSMC时序结构体

 FSMC的SRAM时序结构体成员定义的都是SRAM读写时序中的各项时间参数,这些成员的参数都与FSMC_BRT及FSMC_BWTR寄存器配置对应。 

typedef struct
{uint32_t FSMC_AddressSetupTime;       /*!< Defines the number of HCLK cycles to configurethe duration of the address setup time. This parameter can be a value between 0 and 0xF.@note: It is not used with synchronous NOR Flash memories. */uint32_t FSMC_AddressHoldTime;        /*!< Defines the number of HCLK cycles to configurethe duration of the address hold time.This parameter can be a value between 0 and 0xF. @note: It is not used with synchronous NOR Flash memories.*/uint32_t FSMC_DataSetupTime;          /*!< Defines the number of HCLK cycles to configurethe duration of the data setup time.This parameter can be a value between 0 and 0xFF.@note: It is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */uint32_t FSMC_BusTurnAroundDuration;  /*!< Defines the number of HCLK cycles to configurethe duration of the bus turnaround.This parameter can be a value between 0 and 0xF.@note: It is only used for multiplexed NOR Flash memories. */uint32_t FSMC_CLKDivision;            /*!< Defines the period of CLK clock output signal, expressed in number of HCLK cycles.This parameter can be a value between 1 and 0xF.@note: This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */uint32_t FSMC_DataLatency;            /*!< Defines the number of memory clock cycles to issueto the memory before getting the first data.The value of this parameter depends on the memory type as shown below:- It must be set to 0 in case of a CRAM- It is don't care in asynchronous NOR, SRAM or ROM accesses- It may assume a value between 0 and 0xF in NOR Flash memorieswith synchronous burst mode enable */uint32_t FSMC_AccessMode;             /*!< Specifies the asynchronous access mode. This parameter can be a value of @ref FSMC_Access_Mode */
}FSMC_NORSRAMTimingInitTypeDef;

         • FSMC_AddressSetupTime:本成员设置地址建立时间,它可以被设置为0-0xF个HCLK周期数,按 STM32标准库的默认配置,HCLK的时钟频率为72MHz,即一个HCLK周期为 1/72微秒。

        • FSMC_AddressHoldTime:本成员设置地址保持时间,它可以被设置为0-0xF个HCLK周期数。 

        • FSMC_DataSetupTime:本成员设置数据建立时间,它可以被设置为0-0xF个HCLK周期数。 

        • FSMC_BusTurnAroundDuration:本成员设置总线转换周期,在NOR FLASH存储器中,地址线与数据线可以分时复用,总线转换周期就是指总线在这两种状态间切换需要的延时,防止冲突。控制其它存储器时这个参数无效,配置为0即可。 

        • FSMC_CLKDivision:本成员用于设置时钟分频,它以HCLK时钟作为输入,经过FSMC_CLKDivision 分频后输出到FSMC_CLK引脚作为通讯使用的同步时钟。控制其它异步通讯的 存储器时这个参数无效,配置为0即可。 

        • FSMC_DataLatency:本成员设置数据保持时间,它表示在读取第一个数据之前要等待的周期数,该周期指同步时钟的周期,本参数仅用于同步NOR FLASH类型的存储器,控制其它类型的存储器时,本参数无效。 

        • FSMC_AccessMode:本成员设置存储器访问模式,不同的模式下FSMC访问存储器地址时引脚输出的时序不一样,可选FSMC_AccessMode_A/B/C/D模式。一般来说控制SRAM时使用A模式。 

3.1.2、FSMC的SRAM初始化结构体

 FSMC初始化结构体,除最后两个成员是上一小节讲解的时序配置外, 其它结构体成员的配置都对应到FSMC_BCR中的寄存器位。 

typedef struct
{uint32_t FSMC_Bank;                /*!< Specifies the NOR/SRAM memory bank that will be used.This parameter can be a value of @ref FSMC_NORSRAM_Bank */uint32_t FSMC_DataAddressMux;      /*!< Specifies whether the address and data values aremultiplexed on the databus or not. This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */uint32_t FSMC_MemoryType;          /*!< Specifies the type of external memory attached tothe corresponding memory bank.This parameter can be a value of @ref FSMC_Memory_Type */uint32_t FSMC_MemoryDataWidth;     /*!< Specifies the external memory device width.This parameter can be a value of @ref FSMC_Data_Width */uint32_t FSMC_BurstAccessMode;     /*!< Enables or disables the burst access mode for Flash memory,valid only with synchronous burst Flash memories.This parameter can be a value of @ref FSMC_Burst_Access_Mode */uint32_t FSMC_AsynchronousWait;     /*!< Enables or disables wait signal during asynchronous transfers,valid only with asynchronous Flash memories.This parameter can be a value of @ref FSMC_AsynchronousWait */uint32_t FSMC_WaitSignalPolarity;  /*!< Specifies the wait signal polarity, valid only when accessingthe Flash memory in burst mode.This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */uint32_t FSMC_WrapMode;            /*!< Enables or disables the Wrapped burst access mode for Flashmemory, valid only when accessing Flash memories in burst mode.This parameter can be a value of @ref FSMC_Wrap_Mode */uint32_t FSMC_WaitSignalActive;    /*!< Specifies if the wait signal is asserted by the memory oneclock cycle before the wait state or during the wait state,valid only when accessing memories in burst mode. This parameter can be a value of @ref FSMC_Wait_Timing */uint32_t FSMC_WriteOperation;      /*!< Enables or disables the write operation in the selected bank by the FSMC. This parameter can be a value of @ref FSMC_Write_Operation */uint32_t FSMC_WaitSignal;          /*!< Enables or disables the wait-state insertion via waitsignal, valid for Flash memory access in burst mode. This parameter can be a value of @ref FSMC_Wait_Signal */uint32_t FSMC_ExtendedMode;        /*!< Enables or disables the extended mode.This parameter can be a value of @ref FSMC_Extended_Mode */uint32_t FSMC_WriteBurst;          /*!< Enables or disables the write burst operation.This parameter can be a value of @ref FSMC_Write_Burst */ FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /*!< Timing Parameters for write and read access if the  ExtendedMode is not used*/  FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;     /*!< Timing Parameters for write access if the  ExtendedMode is used*/
}FSMC_NORSRAMInitTypeDef;
映射范围
可以输入的宏 对应的地址区域
FSMC_Bank1_NORSRAM1 0x60000000-0x63FFFFFF
FSMC_Bank1_NORSRAM2 0x64000000-0x67FFFFFF
FSMC_Bank1_NORSRAM3 0x68000000-0x6BFFFFFF
FSMC_Bank1_NORSRAM4 0x6C000000-0x6FFFFFFF

 • FSMC_Bank:本成员用于选择FSMC映射的存储区域,它的可选参数以及相应的内核地址映射范围见上面的表格。

        • FSMC_DataAddressMux:本成员用于设置地址总线与数据总线是否复用 (FSMC_DataAddressMux_Enable /Disable),在控制NOR FLASH时,可以地址总线与数据总线可以分时复用,以减少使用STM32信号线的数量。 

        • FSMC_MemoryType:本成员用于设置要控制的存储器类型,它支持控制的存储器类型为 SRAM、PSRAM以及NOR FLASH(FSMC_MemoryType_SRAM/PSRAM/NOR)。 

        • FSMC_MemoryDataWidth:本成员用于设置要控制的存储器的数据宽度,可选择设置成8或16位 (FSMC_MemoryDataWidth_8b /16b)。 

        • FSMC_BurstAccessMode:本成员用于设置是否使用突发访问模式 (FSMC_BurstAccessMode_Enable/Disable),突发访问模式是指发送一个地址后连续访问多个数据,非突发模式下每访问一个数据都需要输入一个地址,仅在控制同步类型的存储器时才能使用突发模式。 

        • FSMC_AsynchronousWait:本成员用于设置是否使能在同步传输时使用的等待信号 (FSMC_AsynchronousWait_Enable/Disable),在控制同步类型的NOR或PSRAM时,存储器可以使用FSMC_NWAIT引脚通知STM32需要等待。 

        • FSMC_WaitSignalPolarity:本成员用于设置等待信号的有效极性,即要求等待时,使用高电平还是 低电平(FSMC_WaitSignalPolarity_High/Low)。

        • FSMC_WrapMode:本成员用于设置是否支持把非对齐的AHB突发操作分割成2次线性操作 (FSMC_WrapMode_Enable/Disable),该配置仅在突发模式下有效。 

        • FSMC_WaitSignalActive:本成员用于配置在突发传输模式时,决定存储器是在等待状态之前的一个数据周期有效还是在等待状态期间有效 (FSMC_WaitSignalActive_BeforeWaitState/DuringWaitState)。 

        • FSMC_WriteOperation:这个成员用于设置是否写使能(FSMC_WriteOperation_ Enable /Disable),禁止写使能的话FSMC只能从存储器中读取数据,不能写入。 

        • FSMC_WaitSignal:本成员用于设置当存储器牌突发传输模式时,是否允许通过NWAIT信 号插入等待状态(FSMC_WaitSignal_Enable/Disable)。 

        • FSMC_ExtendedMode:本成员用于设置是否使用扩展模式 (FSMC_ExtendedMode_Enable/Disable),在非扩展模式下,对存储器读写的时序都只使用FSMC_BCR寄存器中的配置,即下面的 FSMC_ReadWriteTimingStruct结构体成员;

        在扩展模式下,对存储器的读写时 序可以分开配置,读时序使用FSMC_BCR寄存器,写时序使用FSMC_BWTR寄存器的配置,即下面的FSMC_WriteTimingStruct结构体。 

        • FSMC_ReadWriteTimingStruct:本成员是一个指针,赋值时使用上一小节中讲解的时序结构体 FSMC_NORSRAMInitTypeDef设置,当不使用扩展模式时,读写时序都使用本 成员的参数配置。

        • FSMC_WriteTimingStruct:同样地,本成员也是一个时序结构体的指针,只有当使用扩展模式时, 本配置才有效,它是写操作使用的时序。 

学习记录:FSMC—扩展外部SRAM相关推荐

  1. STM32——FSMC读写外部SRAM

    目录 FSMC(灵活的静态存储器控制器) FSMC功能描述 FSMC框图 FSMC特点 FSMC框图如下: AHB接口 NOR/PSRAM地址映射 外部存储器接口信号 非复用I/OPSRAM/SRAM ...

  2. STM32学习心得三十四:外部SRAM原理及实验代码解读

    记录一下,方便以后翻阅~ 主要内容: 1) IS62WV51216简介: 2) FSMC简介及相关寄存器介绍: 3) 相关实验代码解读. 参考手册: <STM32中文参考手册_V10>-第 ...

  3. 外部 SRAM 实验

    IS62WV51216是ISSI(Integrated Silicon Solution, Inc)公司生产的一颗16位宽512K(512*16,即1M字节)容量的CMOS静态内存(SRAM)芯片. ...

  4. stm32外扩外部sram学习笔记

    在一般情况下stm32内部sram是足够使用的 MDK配置如下 但是有些时候内存是不够用的,比如用到ucgui的时候或者做大项目时就需要外扩sram,倘若你要把外部sram作为运行内存则可以做如下配置 ...

  5. 第26章 FMC—扩展外部SDRAM—零死角玩转STM32-F429系列

    转载:http://blog.csdn.net/flyleaf91/article/details/52325516 第26章     FMC-扩展外部SDRAM 全套200集视频教程和1000页PD ...

  6. STM32学习之FSMC

    前言 上一篇介绍了TFTLCD的基础知识,这一篇来看看,FSMC的基本原理. 学习资料来自:STM32F407最小系统板开发指南-库函数版本_V1.1.pdf 正点原子,感谢原子哥的开源奉献 正点原子 ...

  7. 小余学调度:学习记录(2021.8.30-2021-9.5)

    小余学调度系列文章,记录小余同学入职电力调度员一路的学习记录,由于工作性质,在这个系列,只写能公开的知识点,不涉及机密. 提示:专栏解锁后,可以看这个专栏所有文章,划算. 文章目录 一.如何从接线图中 ...

  8. 《SysML精粹》学习记录--第二章

    <SysML精粹>学习记录 第二章:系统建模语言概览 SysML介绍 SysML与UML SysML图概览 SysML通用图 小结 第二章:系统建模语言概览 SysML介绍   SysML ...

  9. linux个人学习记录

    linux学习记录 资料: Linux 黑马程序员_bilibili AcWing Linux基础课 可能是东半球最全面易懂的 Tmux 使用教程! Shell 教程 | 菜鸟教程 (runoob.c ...

最新文章

  1. Linux Shell简介
  2. k8s调度之node的亲和性以及pod的亲和性/反亲和性
  3. CTP 客户端 技术相关 简介 一
  4. mysql 5.6 利用gtid 同步数据遇到的问题记录
  5. find命令_用find命令查找文件目录
  6. java 获取泛型_聊聊Java泛型擦除那些事
  7. 【iCore4 双核心板_uC/OS-II】例程八:消息邮箱
  8. 朴素版prim算法求最小生成树
  9. 【iCore4 双核心板_ARM】例程三:EXTI中断输入实验——读取ARM按键状态
  10. 中国石油大学《安全管理学》第二阶段在线作业
  11. 常见文件扩展名和它们的说明(转)
  12. 管理的常识(4):什么是计划
  13. 微信JS接口安全域名填写ip地址
  14. 解决imageview 不显示图片问题
  15. Online Patching
  16. Android Studio 界面设计和运行的不一样
  17. p-n结原理1:p-n结的形成和能带
  18. Linux服务器 大量的CLOSE_WAIT、TIME_WAIT解决办法
  19. 阿里巴巴全球数学竞赛品牌传播分析(上)
  20. bootstrapt 表格自适应_好用的自适应表格插件-bootstrap table (支持固定表头)

热门文章

  1. 自适应梯度和RMSprop的理解与实现
  2. java发送get请求_java发送http get请求的两种方法(总结)
  3. 计算机网络考试复习的错题整理
  4. (JNI/JNA)java 调用c/c++ 动态链接库 全套操作+踩坑集锦
  5. python 读取PDF(tabula和pdfminer和pdfplumber的简单操作)
  6. Java实现算法竞赛入门经典例题-蚂蚁
  7. 用TensorFlow做一个玩微信跳一跳的AI
  8. file java_Java中File常用的方法汇总
  9. 浅谈JAVA中的死锁以及解决方案
  10. Java字符编码详解