STM32F429_固件库_FMC

FMC 固件库函数结构体讲解

1. NOR/SRAM 时序结构体

typedef struct
{
  uint32_t FMC_AddressSetupTime;   /*地址建立时间, 0-0xF 个 HCLK 周期*/    
  uint32_t FMC_AddressHoldTime;    /*地址保持时间, 0-0xF 个 HCLK 周期*/     
  uint32_t FMC_DataSetupTime;      /*数据建立时间, 0-0xF 个 HCLK 周期*/  
  uint32_t FMC_BusTurnAroundDuration;  /*总线转换周期,0-0xF个HCLK周期,在 NOR FLASH */
  uint32_t FMC_CLKDivision;   /*时钟分频因子,1-0xF,若控制异步存储器,本参数无效 */        
  uint32_t FMC_DataLatency;   /*数据延迟时间,若控制异步存储器,本参数无效 */          
  uint32_t FMC_AccessMode;    /*设置访问模式 */         
}FMC_NORSRAMTimingInitTypeDef;

这个结构体成员定义的都是 SRAM 读写时序中的各项时间参数,这些成员的的参数都
与 FSMC_BRT 及 FSMC_BWTR 寄存器配置对应,各个成员介绍如下:
(1) FSMC_AddressSetupTime
本成员设置地址建立时间,即 FSMC 读写时序图 27-9 中的 ADDSET 值,它可以被设
置为 0-0xF 个 HCLK 周期数,按 STM32 标准库的默认配置, HCLK 的时钟频率为
168MHz,即一个 HCLK 周期为 1/168 微秒。
(2) FSMC_AddressHoldTime
本成员设置地址保持时间,它可以被设置为 0-0xF 个 HCLK 周期数。
(3) FSMC_DataSetupTime
本成员设置数据建立时间,即 FSMC 读写时序图 27-10 中的 DATAST 值,它可以被设
置为 0-0xF 个 HCLK 周期数。
(4) FSMC_BusTurnAroundDuration
本成员设置总线转换周期,在 NOR FLASH 存储器中,地址线与数据线可以分时复用,
总线转换周期就是指总线在这两种状态间切换需要的延时,防止冲突。控制其它存储
器时这个参数无效,配置为 0 即可。
(5) FSMC_CLKDivision
本成员用于设置时钟分频,它以 HCLK 时钟作为输入,经过 FSMC_CLKDivision 分频
后输出到 FSMC_CLK 引脚作为通讯使用的同步时钟。控制其它异步通讯的存储器时
这个参数无效,配置为 0 即可。
(6) FSMC_DataLatency
本成员设置数据保持时间,它表示在读取第一个数据之前要等待的周期数,该周期指
同步时钟的周期,本参数仅用于同步 NOR FLASH 类型的存储器,控制其它类型的存
储器时,本参数无效。
(7) FSMC_AccessMode
本成员设置存储器访问模式,不同的模式下 FSMC 访问存储器地址时引脚输出的时序
不一样,可选 FSMC_AccessMode_A/B/C/D 模式。一般来说控制 SRAM 时使用 A 模式。
这个 FSMC_NORSRAMTimingInitTypeDef 时序结构体配置的延时参数,将作为下一节
的 FSMC SRAM 初始化结构体的一个成员

2. NOR/SRAM初始化结构体


4 typedef struct
5 {
6 uint32_t FSMC_Bank; /*设置要控制的 Bank 区域 */
7 uint32_t FSMC_DataAddressMux; /*设置地址总线与数据总线是否复用 */
8 uint32_t FSMC_MemoryType; /*设置存储器的类型 */
9 uint32_t FSMC_MemoryDataWidth; /*设置存储器的数据宽度*/
10 uint32_t FSMC_BurstAccessMode; /*设置是否支持突发访问模式,只支持同步类型的存储器 */
11 uint32_t FSMC_AsynchronousWait; /*设置是否使能在同步传输时的等待信号, */
12 uint32_t FSMC_WaitSignalPolarity; /*设置等待信号的极性*/
13 uint32_t FSMC_WrapMode; /*设置是否支持对齐的突发模式 */
14 uint32_t FSMC_WaitSignalActive; /*配置等待信号在等待前有效还是等待期间有效 */
15 uint32_t FSMC_WriteOperation; /*设置是否写使能 */
16 uint32_t FSMC_WaitSignal; /*设置是否使能等待状态插入 */
17 uint32_t FSMC_ExtendedMode; /*设置是否使能扩展模式 */
18 uint32_t FSMC_WriteBurst; /*设置是否使能写突发操作*/
19 /*当不使用扩展模式时,本参数用于配置读写时序,否则用于配置读时序*/
20 FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct;
21 /*当使用扩展模式时,本参数用于配置写时序*/
22 FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;
23 }FSMC_NORSRAMInitTypeDef;

这个结构体,除最后两个成员是上一小节讲解的时序配置外, 其它结构体成员的配置
都对应到 FSMC_BCR 中的寄存器位。各个成员意义介绍如下,括号中的是 STM32 标准库
定义的宏:
(1) FSMC_Bank
本成员用于选择 FSMC 映射的存储区域,它的可选参数以及相应的内核地址映射范围
见表 27-4。
(2) FSMC_DataAddressMux
本成员用于设置地址总线与数据总线是否复用(FSMC_DataAddressMux_Enable
/Disable),在控制 NOR FLASH 时,可以地址总线与数据总线可以分时复用,以减少
使用 STM32 信号线的数量。
(3) FSMC_MemoryType
本成员用于设置要控制的存储器类型,它支持控制的存储器类型为 SRAM、 PSRAM
以及 NOR FLASH(FSMC_MemoryType_SRAM/PSRAM/NOR)。
(4) FSMC_MemoryDataWidth
本成员用于设置要控制的存储器的数据宽度,可选择设置成 8 或 16 位
(FSMC_MemoryDataWidth_8b /16b)。
(5) FSMC_BurstAccessMode
本成员用于设置是否使用突发访问模式(FSMC_BurstAccessMode_Enable/Disable),突
发访问模式是指发送一个地址后连续访问多个数据,非突发模式下每访问一个数据都
需要输入一个地址,仅在控制同步类型的存储器时才能使用突发模式。
(6) FSMC_AsynchronousWait
本成员用于设置是否使能在同步传输时使用的等待信号
(FSMC_AsynchronousWait_Enable/Disable),在控制同步类型的 NOR 或 PSRAM 时,
存储器可以使用 FSMC_NWAIT 引脚通知 STM32 需要等待。
(7) FSMC_WaitSignalPolarity
本成员用于设置等待信号的有效极性,即要求等待时,使用高电平还是低电平
(FSMC_WaitSignalPolarity_High/Low)。
(8) FSMC_WrapMode
本成员用于设置是否支持把非对齐的 AHB 突发操作分割成 2 次线性操作
(FSMC_WrapMode_Enable/Disable),该配置仅在突发模式下有效。
(9) FSMC_WaitSignalActive
本成员用于配置在突发传输模式时,决定存储器是在等待状态之前的一个数据周期有
效还是在等待状态期间有效(FSMC_WaitSignalActive_BeforeWaitState/DuringWaitState)。
(10) FSMC_WriteOperation
这个成员用于设置是否写使能(FSMC_WriteOperation_ Enable /Disable),禁止写使能的
话 FSMC 只能从存储器中读取数据,不能写入。
(11) FSMC_WaitSignal
本成员用于设置当存储器处于突发传输模式时,是否允许通过 NWAIT 信号插入等待
状态(FSMC_WaitSignal_Enable/Disable)。
(12) FSMC_ExtendedMode
本成员用于设置是否使用扩展模式(FSMC_ExtendedMode_Enable/Disable),在非扩展
模式下,对存储器读写的时序都只使用 FSMC_BCR 寄存器中的配置,即下面的
FSMC_ReadWriteTimingStruct 结构体成员;在扩展模式下,对存储器的读写时序可以
分开配置,读时序使用 FSMC_BCR 寄存器,写时序使用 FSMC_BWTR 寄存器的配置,
即下面的 FSMC_WriteTimingStruct 结构体。
(13) FSMC_ReadWriteTimingStruct
本成员是一个指针,赋值时使用上一小节中讲解的时序结构体
FSMC_NORSRAMInitTypeDef 设置,当不使用扩展模式时,读写时序都使用本成员的
参数配置。
(14) FSMC_WriteTimingStruct
同样地,本成员也是一个时序结构体的指针,只有当使用扩展模式时,本配置才有效,
它是写操作使用的时序。
对本结构体赋值完成后,调用 FSMC_NORSRAMInit 库函数即可把配置参数写入到
FSMC_BCR 及 FSMC_BTR/BWTR 寄存器中。

3. FMC NAND and PCCARD 时序

4. FMC NAND 结构体

5. PCCARD 结构体

6. SDRAM 时序

/* @brief 控制 SDRAM 的时序参数,这些参数的单位都是“周期”
2 * 各个参数的值可设置为 1-16 个周期。 */
3 typedef struct
4 {
5 uint32_t FMC_LoadToActiveDelay; /*TMRD: 加载模式寄存器命令后的延迟 */
6 uint32_t FMC_ExitSelfRefreshDelay; /*TXSR: 自刷新命令后的延迟 */
7 uint32_t FMC_SelfRefreshTime; /*TRAS: 自刷新时间 */
8 uint32_t FMC_RowCycleDelay; /*TRC: 行循环延迟 */
9 uint32_t FMC_WriteRecoveryTime; /*TWR: 恢复延迟 */
10 uint32_t FMC_RPDelay; /*TRP: 行预充电延迟 */
11 uint32_t FMC_RCDDelay; /*TRCD: 行到列延迟 */
12 } FMC_SDRAMTimingInitTypeDef;

这个结构体成员定义的都是 SDRAM 发送各种命令后必须的延迟,它的配置对应到 FMC_SDTR
中的寄存器位。所有成员参数值的单位是周期,参数值大小都可设置成“1-16”。关于这些延时
时间的定义可以看“SDRAM 初始化流程”和“SDRAM 读写流程”小节的时序图了解。具体参
数值根据 SDRAM 芯片的手册说明来配置。各成员介绍如下:
(1) FMC_LoadToActiveDelay
本成员设置 TMRD 延迟 (Load Mode Register to Active),即发送加载模式寄存器命令后
要等待的时间,过了这段时间才可以发送行有效或刷新命令。
(2) FMC_ExitSelfRefreshDelay
本成员设置退出 TXSR 延迟 (Exit Self-refresh delay),即退出自我刷新命令后要等待的
时间,过了这段时间才可以发送行有效命令。
(3) FMC_SelfRefreshTime
本成员设置自我刷新时间 TRAS,即发送行有效命令后要等待的时间,过了这段时间
才执行预充电命令。
(4) FMC_RowCycleDelay
本成员设置 TRC 延迟 (Row cycle delay),即两个行有效命令之间的延迟,以及两个相
邻刷新命令之间的延迟
(5) FMC_WriteRecoveryTime
本成员设置 TWR 延迟 (Recovery delay),即写命令和预充电命令之间的延迟,等待这
段时间后才开始执行预充电命令。
(6) FMC_RPDelay
本成员设置 TRP 延迟 (Row precharge delay),即预充电命令与其它命令之间的延迟。
(7) FMC_RCDDelay
本成员设置 TRCD 延迟 (Row to column delay),即行有效命令到列读写命令之间的延
迟。
这个 SDRAMTimingInitTypeDef 时序结构体配置的延时参数,将作为下一节的 FMC SDRAM 初始
化结构体的一个成员。

7. SDRAM结构体

/* @brief FMC SDRAM 初始化结构体类型定义 */
2 typedef struct
3 {
4 uint32_t FMC_Bank; /* 选择 FMC 的 SDRAM 存储区域 */
5 uint32_t FMC_ColumnBitsNumber; /* 定义 SDRAM 的列地址宽度 */
6 uint32_t FMC_RowBitsNumber; /* 定义 SDRAM 的行地址宽度 */
7 uint32_t FMC_SDMemoryDataWidth; /* 定义 SDRAM 的数据宽度 */
8 uint32_t FMC_InternalBankNumber; /* 定义 SDRAM 内部的 Bank 数目 */
9 uint32_t FMC_CASLatency; /* 定义 CASLatency 的时钟个数 */
10 uint32_t FMC_WriteProtection; /* 定义是否使能写保护模式 */
11 uint32_t FMC_SDClockPeriod; /* 配置同步时钟 SDCLK 的参数 */
12 uint32_t FMC_ReadBurst; /* 是否使能突发读模式 */
13 uint32_t FMC_ReadPipeDelay; /* 定义在 CAS 个延迟后再等待多
14 少个 HCLK 时钟才读取数据 */
15 FMC_SDRAMTimingInitTypeDef* FMC_SDRAMTimingStruct; /* 定义 SDRAM 的时序参数
16
17 } FMC_SDRAMInitTypeDef;

这个结构体,除最后一个成员是上一小节讲解的时序配置外,其它结构体成员的配置都对应到
FMC_SDCR 中的寄存器位。各个成员意义在前面的小节已有具体讲解,其可选参数介绍如下,括
号中的是 STM32 标准库定义的宏:
(1) FMC_Bank
本成员用于选择 FMC 映射的 SDRAM 存储区域,可选择存储区域 1 或 2
(FMC_Bank1/2_SDRAM)。
(2) FMC_ColumnBitsNumber
本 成 员 用 于 设 置 要 控 制 的 SDRAM 的 列 地 址 宽 度, 可 选 择 8-11 位
(FMC_ColumnBits_Number_8/9/10/11b)。
(3) FMC_RowBitsNumber
本成员用于设置要控制的 SDRAM 的行地址宽度,可选择设置成 11-13 位
(FMC_RowBits_Number_11/12/13b)。
(4) FMC_SDMemoryDataWidth
本成员用于设置要控制的 SDRAM 的数据宽度,可选择设置成 8、 16 或 32 位
(FMC_SDMemory_Width_8/16/32b)。
(5) FMC_InternalBankNumber
本成员用于设置要控制的 SDRAM 的内部 Bank 数目,可选择设置成 2 或 4 个 Bank 数
目 (FMC_InternalBank_Number_2/4),请注意区分这个结构体成员与 FMC_Bank 的区
别。
(6) FMC_CASLatency
本成员用于设置 CASLatency 即 CL 的时钟数目,可选择设置为 1、 2 或 3 个时钟周期
(FMC_CAS_Latency_1/2/3)。
(7) FMC_WriteProtection
本成员用于设置是否使能写保护模式,如果使能了写保护则不能向 SDRAM 写入数
据,正常使用都是禁止写保护的。
(8) FMC_SDClockPeriod
本成员用于设置 FMC 与外部 SDRAM 通讯时的同步时钟参数,可以设置成
STM32 的 HCLK 时钟频率的 1/2、 1/3 或禁止输出时钟 (FMC_SDClock_Period_2/3 或
FMC_SDClock_Disable)。
(9) FMC_ReadBurst
本成员用于设置是否使能突发读取模式,禁止时等效于 BL=1,使能时 BL 的值等于
模式寄存器中的配置。
(10) FMC_ReadPipeDelay
本成员用于配置在 CASLatency 个时钟周期后,再等待多少个 HCLK 时钟周期才进行
数据采样,在确保正确的前提下,这个值设置为越短越好,可选择设置的参数值为 0、
1 或 2 个 HCLK 时钟周期 (FMC_ReadPipe_Delay_0/1/2)。
(11) FMC_SDRAMTimingStruct
这个成员就是我们上一小节讲解的 SDRAM 时序结构体了,设置完时序结构体后再把
赋值到这里即可。
配置完 SDRAM 初始化结构体后,调用 FMC_SDRAMInit 函数把这些配置写入到 FMC 的 SDRAM
控制寄存器及时序寄存器,实现 FMC 的初始化。

8. SDRAM命令

typedef struct
2 {
3 uint32_t FMC_CommandMode; /* 要发送的命令 */
4 uint32_t FMC_CommandTarget; /* 目标存储器区域 */
5 uint32_t FMC_AutoRefreshNumber; /* 若发送的是自动刷新命令,
6 此处为发送的刷新次数,其它命令时无效 */
7 uint32_t FMC_ModeRegisterDefinition; /* 若发送的是加载模式寄存器命令,
8 此处为要写入 SDRAM 模式寄存器的参数 */
9 } FMC_SDRAMCommandTypeDef;

命令结构体中的各个成员介绍如下:
(1) FMC_CommandMode
本成员用于配置将要发送的命令,它可以被赋值为表 FMC 可输出的 SDRAM 控制命令 中的宏,这
些宏代表了不同命令;在这里插入图片描述
(2) FMC_CommandTarget
本 成 员 用 于 选 择 要 控 制 的 FMC 存 储 区 域, 可 选 择 存 储 区 域 1 或
2(FMC_Command_Target_bank1/2);
(3) FMC_AutoRefreshNumber
有时需要连续发送多个“自动刷新” (Auto Refresh) 命令时,配置本成员即可控
制它发送多少次,可输入参数值为 1-16,若发送的是其它命令,本参数值无
效。如 FMC_CommandMode 成员被配置为宏 FMC_Command_Mode_AutoRefresh,而
FMC_AutoRefreshNumber 被设置为 2 时, FMC 就会控制发送 2 次自动刷新命令。
(4) FMC_ModeRegisterDefinition
当向 SDRAM 发送加载模式寄存器命令时,这个结构体成员的值将通过地址线发送到
SDRAM 的模式寄存器中,这个成员值长度为 13 位,各个位一一对应 SDRAM 的模
式寄存器。
配置完这些结构体成员,调用库函数 FMC_SDRAMCmdConfig 即可把这些参数写入到
FMC_SDCMR 寄存器中,然后 FMC 外设就会发送相应的命令了。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值