单片机的FMC 【使用方法2】- FMC模拟并口时序

单片机FSMC模拟8080接口时序,驱动液晶屏

LCD并口时序图

0 在这里插入图片描述

某34pinLCD引脚图,内部驱动为S6B33B2

1

2

通过对比可以看到8080时序除了RS线其它的和FSMC很像。

FSMC-NOR flash和8080信号线按照下面方式对接

FSMC-NOR信号线功能8080信号线功能
NEx片选信号CS片选片选信号
NWE写使能WR写使能
NOE读使能RD读使能
D[15:0]数据信号D[15:0]数据信号
A0地址信号0RS数据/命令选择

8080接口的RS可以和FSMC任何一个地址线A连接,这样高电平时数据线D就会被数据成数值,低电平时就会被处理成命令。

如何让A0为确定的电平呢,只需向FSMC的地址线上发送奇数,A0就是高电平。向FSMC地址线上发送偶数,A0就是低电平。

寄存器配置

在stm32CubeMX里直接选择内存类型为LCD接口,需要配置的寄存器选项已经列出来了,不需要配置的寄存器是灰色的。

3

如果启用了扩展模式下面将有模式A和模式D可选

在这里插入图片描述

配置三个保持时间

5

  • AddressSetupTime 地址建立时间 0-15 个 HCLK 周期
  • DataSetupTime 数据建立时间 1-255 个 HCLK 周期
  • BusTurnAround 总线转换周期 0-15个 HCLK 周期

生成代码如下:


SRAM_HandleTypeDef hsram1;

/* FSMC initialization function */
void MX_FSMC_Init(void)
{
  /* USER CODE BEGIN FSMC_Init 0 */

  /* USER CODE END FSMC_Init 0 */

  FSMC_NORSRAM_TimingTypeDef Timing = {0};

  /* USER CODE BEGIN FSMC_Init 1 */

  /* USER CODE END FSMC_Init 1 */

  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FSMC_NORSRAM_DEVICE;
  hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FSMC_NORSRAM_BANK1;	//bank内部区域的第一个小块, 选择NE1
  hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;//地址/数据不复用
  hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;//存储器类型SRAM
  hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;//16位数据位宽
  hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;//是否突发,仅对同步突发存储器有用
  hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;//等待信号的极性, 仅在突发模式访问下有用
  hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;//关闭突发模式
  hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;//在SRAM向fsmc发出数据脉冲时的前一个时钟周期,发出等待信号
  hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;//存储器写使能
  hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;//等待使能位,未用到
  hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;//读写使用相同的时序
  hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;//同步传输模式等待信号, 未用到
  hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;//禁止突发写
  hsram1.Init.PageSize = FSMC_PAGE_SIZE_NONE; //指定页的大小,操作CRAM用*/
  /* Timing */
  Timing.AddressSetupTime = 0xf;
  Timing.AddressHoldTime = 15;
  Timing.DataSetupTime = 0xff;
  Timing.BusTurnAroundDuration = 0xf;
  Timing.CLKDivision = 16;
  Timing.DataLatency = 17;
  Timing.AccessMode = FSMC_ACCESS_MODE_A;
  /* ExtTiming */

  if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
  {
    Error_Handler( );
  }

  /* USER CODE BEGIN FSMC_Init 2 */

  /* USER CODE END FSMC_Init 2 */
}

初始化FSMC用了两个类型的结构体 **SRAM_HandleTypeDef ** 和 FSMC_NORSRAM_TimingTypeDef

1 第一个SRAM_HandleTypeDef 结构体

​ 第一个类型结构体是配置存储器寄存器的,只到里面的前三个成员。

1.1 FSMC的基地址,因为FSMC的第一个寄存器是FSMC_BCR1,所以这里初始化也是FSMC_BCR1寄存器的地址。
FMC_NORSRAM_TypeDef           *Instance; 
#define FSMC_R_BASE       0xA0000000UL /*!< FSMC registers base address        */

在这里插入图片描述

1. 2 扩展寄存器地址
FMC_NORSRAM_EXTENDED_TypeDef  *Extended; 
1.3 第三个成员也是结构体类型用来配置SRAM寄存器的结构体:
FMC_NORSRAM_InitTypeDef       Init;    
typedef struct
{ 
  uint32_t NSBank;          /*!< /*设置要控制的 Bank 区域 参数定义参考 @ref FMC_NORSRAM_Bank*/

  uint32_t DataAddressMux;  /*!< 设置地址总线与数据总线是否复用  参数定义参考 @ref FMC_Data_Address_Bus_Multiplexing*/

  uint32_t MemoryType;      /*!< 设置存储器的类型 参数定义参考 @ref FMC_Memory_Type*/

  uint32_t MemoryDataWidth; /*!< 设置存储器的数据宽度    参数定义参考 @ref FMC_NORSRAM_Data_Width */

  uint32_t BurstAccessMode; /*!< 设置是否支持突发访问模式,只支持同步类型 ,对异步不起作用 参数定义参考 @ref FMC_Burst_Access_Mode*/

  uint32_t WaitSignalPolarity; /*!< 设置等待信号的极性   参数定义参考 @ref FMC_Wait_Signal_Polarity      */

  uint32_t WrapMode;           /*!< 设置是否支持对齐的突发模式   参数定义参考 @ref FMC_Wrap_Mode      */

  uint32_t WaitSignalActive;   /*!< 配置等待信号在等待前有效还是等待期间有效    参数定义参考 @ref FMC_Wait_Timing   */

  uint32_t WriteOperation;     /*!< 设置使能或者禁止写保护   参数定义参考 @ref FMC_Write_Operation          */

  uint32_t WaitSignal;         /*!< 设置是否使能等待状态插入    参数定义参考 @ref FMC_Wait_Signal                */

  uint32_t ExtendedMode;       /*!< 设置是否使能扩展模式        参数定义参考 @ref FMC_Extended_Mode          */

  uint32_t AsynchronousWait;   /*!< 设置是否使能等待信号        参数定义参考 @ref FMC_AsynchronousWait     */

  uint32_t WriteBurst;         /*!< 设置是否使能写突发操作      参数定义参考 @ref FMC_Write_Burst            */

  uint32_t ContinuousClock; /*!< 启用或禁用FMC时钟输出到外部存储器设备 参数定义参考 @ref FMC_Continous_Clock               */

  uint32_t WriteFifo;     /*!< 启用或禁用FMC控制器使用的写FIFO功能。通过FMC_BCR1寄存器启用 参数定义参考 @ref FMC_Write_FIFO      */

  uint32_t PageSize;      /*!< 指定页的大小  参数定义参考 @ref FMC_Page_Size                   */
} FMC_NORSRAM_InitTypeDef;

2 第二个FSMC_NORSRAM_TimingTypeDef结构体
typedef struct
{
  uint32_t AddressSetupTime;     /*!< 地址建立时间,范围最小是0,最大是15,不适用于同步   */

  uint32_t AddressHoldTime;     /*!< 地址保持时间,范围最小是1,最大是15,不适用于同步 */

  uint32_t DataSetupTime;       /*!< 数据建立时间,范围最小是1,最大是 255.适用于 SRAM, ROM 和异步NOR Flash . */

  uint32_t BusTurnAroundDuration;        /*!< 总线恢复时间,范围最小是1,最大是15,只适用于 NOR Flash */

  uint32_t CLKDivision;          /*!< 时钟分频因子,范围最小是2,最大是16,@不适用于异步*/

  uint32_t DataLatency;         /*!< 同步突发 模式数据延迟 */

  uint32_t AccessMode;          /*!< 异步模式配置  定义参考 @ref FSMC_Access_Mode*/
} FSMC_NORSRAM_TimingTypeDef;

7

时序配置:

每个bank内的小块地址 映射外部引脚HADDR[27:26]
10x60000000-0x63FFFFFFFSMC_NE100
20x64000000-0x67FFFFFFFSMC_NE201
30x68000000-0x6BFFFFFFFSMC_NE310
40x6C000000-0x6FFFFFFFFSMC_NE411

8

由上图可知,只需关心的是读和写操作的低脉宽是50ns,高脉宽是30ns,数据建立时间是5ns,数据保持时间是28ns。这些是时序要求的最小时间,实际操作时只要比这个大就行。

​ FSMC的时钟HCLK是168MHz,1 000 000 000 ns ÷ 168 000 000Hz =1000/168≈5.95ns

​ 因为FSMC _NE1和8080_CS连接,所以访问0x60000000-0x63FFFFFF地址时,这个引脚就会产生有效的片选信号。

​ FSMC _A0接8080_RS, 所以访问0x60000000-0x63FFFFFF地址时,奇数地址就会产生高电平,偶数地址就会产生低电平。

FSMC-NOR信号线GPIO引脚8080接口
FSMC_NE1PD7CS 片选
FSMC_A0PF0RS 数据/命令选择
FSMC_NWEPD5WR 写使能
FSMC_NOEPD4RD 读使能
FSMC_D0PD14数据信号
FSMC_D1PD15数据信号
FSMC_D2PD0数据信号
FSMC_D3PD1数据信号
FSMC_D4PE7数据信号
FSMC_D5PE8数据信号
FSMC_D6PE9数据信号
FSMC_D7PE10数据信号
FSMC_D8PE11数据信号
FSMC_D8PE12数据信号
FSMC_D10PE13数据信号
FSMC_D11PE14数据信号
FSMC_D12PE15数据信号
FSMC_D13PD8数据信号
FSMC_D14PD9数据信号
FSMC_D15PD10数据信号

测试程序:

void LCD_Writr_Test()
{
     *(__IO uint16_t*)(0x60000000) =0XFFA;
     HAL_Delay(500);
     *(__IO uint16_t*)(0x60000000+2) =0XFAF;
}

在这里插入图片描述

可以看得到写0XFFA时RS是低电平,写0XFAF时RS是高电平。

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值