news 2026/4/16 8:16:36

[STM32L5] 【STM32L562E-DK测评活动】by clever:05 使用FMC驱动板载LCD屏幕

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[STM32L5] 【STM32L562E-DK测评活动】by clever:05 使用FMC驱动板载LCD屏幕

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的初始化代码如下:

复制

  1. void MX_FMC_Init(void)
  2. {
  3. /* USER CODE BEGIN FMC_Init 0 */
  4. /* USER CODE END FMC_Init 0 */
  5. FMC_NORSRAM_TimingTypeDef Timing = {0};
  6. /* USER CODE BEGIN FMC_Init 1 */
  7. /* USER CODE END FMC_Init 1 */
  8. /** Perform the SRAM1 memory initialization sequence
  9. */
  10. hsram1.Instance = FMC_NORSRAM_DEVICE;
  11. hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  12. /* hsram1.Init */
  13. hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
  14. hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  15. hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  16. hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  17. hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  18. hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  19. hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  20. hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  21. hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  22. hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
  23. hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  24. hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  25. hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  26. hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
  27. hsram1.Init.NBLSetupTime = 0;
  28. hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  29. hsram1.Init.MaxChipSelectPulse = DISABLE;
  30. /* Timing */
  31. Timing.AddressSetupTime = 15;
  32. Timing.AddressHoldTime = 15;
  33. Timing.DataSetupTime = 255;
  34. Timing.DataHoldTime = 0;
  35. Timing.BusTurnAroundDuration = 15;
  36. Timing.CLKDivision = 16;
  37. Timing.DataLatency = 17;
  38. Timing.AccessMode = FMC_ACCESS_MODE_A;
  39. /* ExtTiming */
  40. if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
  41. {
  42. Error_Handler( );
  43. }
  44. /* USER CODE BEGIN FMC_Init 2 */
  45. /* USER CODE END FMC_Init 2 */
  46. }

3.2 LCD的初始化代码如下:

复制

  1. if (BSP_LCD_Init(0, LCD_ORIENTATION_PORTRAIT) != BSP_ERROR_NONE)
  2. {
  3. Error_Handler();
  4. }
  5. /* Set UTIL_LCD functions */
  6. lcdDrv.DrawBitmap = BSP_LCD_DrawBitmap;
  7. lcdDrv.FillRGBRect = BSP_LCD_FillRGBRect;
  8. lcdDrv.DrawHLine = BSP_LCD_DrawHLine;
  9. lcdDrv.DrawVLine = BSP_LCD_DrawVLine;
  10. lcdDrv.FillRect = BSP_LCD_FillRect;
  11. lcdDrv.GetPixel = BSP_LCD_ReadPixel;
  12. lcdDrv.SetPixel = BSP_LCD_WritePixel;
  13. lcdDrv.GetXSize = BSP_LCD_GetXSize;
  14. lcdDrv.GetYSize = BSP_LCD_GetYSize;
  15. lcdDrv.SetLayer = BSP_LCD_SetActiveLayer;
  16. lcdDrv.GetFormat = BSP_LCD_GetFormat;
  17. UTIL_LCD_SetFuncDriver(&lcdDrv);

3.3 显示部分代码如下所示:

复制

  1. UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);
  2. BSP_LCD_DisplayOn(0);
  3. UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);
  4. UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);
  5. UTIL_LCD_SetFont(&Font24);
  6. UTIL_LCD_DisplayStringAt(0, 60, (uint8_t *) "21 IC luntan", CENTER_MODE);
  7. UTIL_LCD_DisplayStringAt(0, 100, (uint8_t *)"STM32Board-DK", CENTER_MODE);
  8. UTIL_LCD_DisplayStringAt(0, 140, (uint8_t *)"LCD-FMC-Test", CENTER_MODE);
  9. UTIL_LCD_DisplayStringAt(0, 180, (uint8_t *)"congconggege", CENTER_MODE);
  10. UTIL_LCD_DisplayStringAt(10, 220, (uint8_t *)"2025-03-06", CENTER_MODE);
  11. UTIL_LCD_DrawBitmap(0, 0, (uint8_t *)st**);

四:实测图片如下:

实测动态如下所示:按下复位按键,程序运行显示开机界面。



调试代码后记:
1:对于touch gfx 软件中,没有找到该款开发板,不知道后期是否可以增加对该款的支持。
2:对于驱动LCD屏幕不太熟悉的人来说,可以直接去移植官方库里面的文件。BSP中有驱动代码,直接移植到自己工程目录下就可以。
3:由于使用cube MX 生成的底层的驱动,对于各个外设的驱动比较完善,压缩之后超过大小限制,感兴趣的人可以留下联系邮箱,看到后会及时发给您,作为参考。
4:目前仅仅是将屏幕功能正常点亮,稍后再屏幕上可以制作其他的功能测试。5:移植代码时候,需要格外注意时钟树的配置。


---------------------
作者:聪聪哥哥
链接:https://bbs.21ic.com/icview-3437076-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 3:32:54

[STM32L5] 【STM32L562E-DK测评活动】by clever:04-硬件IIC读取手势模块

一:STM32L526 硬件IIC的知识分享: 该设备嵌入四个12C。请参阅表17:12C实现以了解功能实现。 12C总线接口处理微控制器和串行12C总线之间的通信。它控制所有12C总线特定的序列、协议、仲裁和定时。 L2C外围设备支持: 12C总线规范和用户手册第5版兼容性: 奴…

作者头像 李华
网站建设 2026/3/14 14:04:59

[STM32L5] 【STM32L562E-DK测评活动】by clever:01-简简单单点个灯

一:STM32L562-DK芯片介绍: STM32L562E-DK探索套件是面向Arm Cortex-M33的完整演示和开发平台,带有 ArmTrustZone和基于 ARMV8-M 主线安全扩展内核的STM32L562QE16Q 微控制器,具有512 KB 的闪存和 256 KB 的 SRAM。 STM32L562E-DK …

作者头像 李华
网站建设 2026/4/2 3:53:07

2000-2024年各省居民消费价格指数CPI统计数据

数据简介 居民消费价格指数CPI(一组固定商品按当期价格计算的价值除以一组固定商品按基期价格计算的价值)100%,是一个宏观的经济指标,居民消费价格指数反映该地区居民家庭消费的物品和购买服务项目等价格水平变动的情况。 居民消费价格指数CPI是一个滞后…

作者头像 李华
网站建设 2026/4/15 13:54:40

深度测评!好评如潮的AI论文平台 —— 千笔·专业学术智能体

你是否曾为论文开题绞尽脑汁?是否在深夜面对空白文档文思枯竭?是否反复修改却总对表达不满意?论文写作的每一个环节都可能成为压力源,从选题到查重,从格式到语言润色,每一步都让人倍感焦虑。而如今&#xf…

作者头像 李华
网站建设 2026/4/12 6:20:20

【渗透测试】新手必练的15个靶场,来看下有没有你熟悉的!

前言 相信很多小伙伴们在学习渗透测试的时候,不知道如何开始,那么这下面15个靶场对你的学习将会有很大的帮助! 靶场推荐 1、Try Hack Me 官网:https://tryhackme.com/ Try Hack Me是一个在线渗透测试平台,提供丰富…

作者头像 李华