| 本帖最后由 聪聪哥哥 于 2025-3-7 10:33 编辑 
 #技术资源# #申请原创# 一:FMC知识点分享:
 FSMC全称为灵活的静态存储控制器,其时钟信号为HCLK,FSMC根据支持的存储器类型可以分为NOR/PSRAM、NAND Flash和PC卡三种,本实验只涉及第一种NOR/PSRAM,严格意义上讲也与NOR/PSRAM无关,只是使用其中的LCD Interface类型的内存类型,主要包括片选引脚、地址线、数据线、输出和写入的配置。
 
 在STM32手册中,对于FMC的介绍如下所示:
 灵活的静态存储器控制器(FSMC)
 灵活的静态存储器控制器(FSMC)包括两个存储器控制器:NOR/PSRAM 存储器控制器
 NAND/内存控制器
 这个内存控制器也被称为柔性内存控制器(FMC)。
 
 FSMC控制器的主要特点如下:
 与静态内存映射设备接口,包括:
 静态随机存取存储器(SRAM)
 NOR闪存/OneNAND闪存
 PSRAM(四个内存库)
 带有ECC硬件的NAND闪存,可检查多达8K字节的数据铁电随机存储器(FRAM)
 8位、16位数据总线宽度
 独立的芯片选择控制每个存储体
 每个存储体的独立配置
 写入FIFO
 LCD 并行接口
 FMC 可以配置为与大多数图形LCD控制器无缝接口。它支持Intel8080和Motorola 6800 模式,并且足够灵活,可以适应特定的LCD接口。这种LCD 并行接口能力使得使用嵌入式控制器的LCD 模块或使用具有专用加速器的外部控制器的高性能解决方案来构建成本效益高的图形应用变得容易。
 TrustZone安全
 当启用TrustZone安全时,整个FSMC银行重置后都是安全的。非安全区域可以使用TZSCMPCWMx控制器进行配置。
 .FSMC NOR/PSRAM :
 -最多可以配置两个非安全区域,通过TZSCMPCWM2控制器进行配置,粒度为64K字节。
 FSMC NAND 银行:
 -可以使用 TZSC MPCWM3 控制器配置为完全安全或完全非安全。
 FSMC寄存器可以通过TZSC控制器配置为安全模式。
 
 二使用STM32 cube MX 配置 FMC的初始化如下所示:
 2.1 FMC 配置参数如下所示:
 
   2.2 时钟树的配置如下:
 
   三:软件代码如下:
 3.1  FMC的初始化代码如下:
 
 3.2  LCD的初始化代码如下:void MX_FMC_Init(void)
{
  /* USER CODE BEGIN FMC_Init 0 */
  /* USER CODE END FMC_Init 0 */
  FMC_NORSRAM_TimingTypeDef Timing = {0};
  /* USER CODE BEGIN FMC_Init 1 */
  /* USER CODE END FMC_Init 1 */
  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FMC_NORSRAM_DEVICE;
  hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
  hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
  hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
  hsram1.Init.NBLSetupTime = 0;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  hsram1.Init.MaxChipSelectPulse = DISABLE;
  /* Timing */
  Timing.AddressSetupTime = 15;
  Timing.AddressHoldTime = 15;
  Timing.DataSetupTime = 255;
  Timing.DataHoldTime = 0;
  Timing.BusTurnAroundDuration = 15;
  Timing.CLKDivision = 16;
  Timing.DataLatency = 17;
  Timing.AccessMode = FMC_ACCESS_MODE_A;
  /* ExtTiming */
  if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
  {
    Error_Handler( );
  }
  /* USER CODE BEGIN FMC_Init 2 */
  /* USER CODE END FMC_Init 2 */
}
 3.3  显示部分代码如下所示: if (BSP_LCD_Init(0, LCD_ORIENTATION_PORTRAIT) != BSP_ERROR_NONE)
        {
                        Error_Handler();
        }
        /* Set UTIL_LCD functions */
        lcdDrv.DrawBitmap  = BSP_LCD_DrawBitmap;
        lcdDrv.FillRGBRect = BSP_LCD_FillRGBRect;
        lcdDrv.DrawHLine   = BSP_LCD_DrawHLine;
        lcdDrv.DrawVLine   = BSP_LCD_DrawVLine;
        lcdDrv.FillRect    = BSP_LCD_FillRect;
        lcdDrv.GetPixel    = BSP_LCD_ReadPixel;
        lcdDrv.SetPixel    = BSP_LCD_WritePixel;
        lcdDrv.GetXSize    = BSP_LCD_GetXSize;
        lcdDrv.GetYSize    = BSP_LCD_GetYSize;
        lcdDrv.SetLayer    = BSP_LCD_SetActiveLayer;
        lcdDrv.GetFormat   = BSP_LCD_GetFormat;
        UTIL_LCD_SetFuncDriver(&lcdDrv);
 四:实测图片如下: UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);
        BSP_LCD_DisplayOn(0);
        UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);
        UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);
        UTIL_LCD_SetFont(&Font24);
        UTIL_LCD_DisplayStringAt(0, 60, (uint8_t *) "21 IC luntan", CENTER_MODE);
        UTIL_LCD_DisplayStringAt(0, 100, (uint8_t *)"STM32Board-DK", CENTER_MODE);
        UTIL_LCD_DisplayStringAt(0, 140, (uint8_t *)"LCD-FMC-Test", CENTER_MODE);
        UTIL_LCD_DisplayStringAt(0, 180, (uint8_t *)"congconggege", CENTER_MODE);
        UTIL_LCD_DisplayStringAt(10, 220, (uint8_t *)"2025-03-06", CENTER_MODE);
        UTIL_LCD_DrawBitmap(0, 0, (uint8_t *)st**);
  实测动态如下所示:按下复位按键,程序运行显示开机界面。 
   
 调试代码后记:
 1:对于touch gfx 软件中,没有找到该款开发板,不知道后期是否可以增加对该款的支持。
 2:对于驱动LCD屏幕不太熟悉的人来说,可以直接去移植官方库里面的文件。BSP中有驱动代码,直接移植到自己工程目录下就可以。
 3:由于使用cube MX 生成的底层的驱动,对于各个外设的驱动比较完善,压缩之后超过大小限制,感兴趣的人可以留下联系邮箱,看到后会及时发给您,作为参考。
 4:目前仅仅是将屏幕功能正常点亮,稍后再屏幕上可以制作其他的功能测试。5:移植代码时候,需要格外注意时钟树的配置。
 
 
 
 |