STM32N6的开发日记(4):快速上手LTDC显示图片-让屏幕刷新丝滑流畅

博主主要在WX写作,C站消息不能及时看见,如有需要联系请关注:《实在太懒于是不想取名》获取联系方式。

STM32N6作为意法半导体推出的首款集成自研神经处理单元的STM32产品以"MCU+NPU"的异构架构重新定义了边缘AI的算力边界,是意法半导体的MCU最前沿技术栈,不过由于其高难度技术应用以及需要的极其深厚的STM32使用经验以及神经网络基础概念,因此上手难度非常的高。

自从STM32N6发布以来,博主有幸获得一块STM32N6570-DK开发板,闲暇之余陆陆续续折腾如何开发。因此将会陆陆续续发表一些使用STM32N6的使用笔记,以供将来的使用者参考。

回顾学习历程,踩了很多很多的坑,在后续使用STM32N6的文章中也会向大家陆续介绍这些点。


上一期我们介绍了在如何利用STM32CubeMX快速实现神经网络模型在STM32N6中的模型部署和应用。但是在上一期文章中,模型的输入数据是随机的,仅仅只是测试其输出结果是否可靠。

为了更好的得到测试结果,我们需要完成:STM32N6的屏幕驱动用于显示和绘制以及摄像头的驱动和实现。这个内容我们分为两期来写,本期我们先完成STM32N6570-DK开发板的屏幕驱动实现。

STM32的LTDC

在高性能STM32系列中,通常搭载着LTDC外设,LTDC全称是LCD-TFT Display Controller。它是 STM32 高性能系列里专门用来驱动LCD 和 TFT 显示屏的硬件外设。它可以直接输出显示屏需要的行信号、场信号和像素数据。它支持多层图层叠加与混合显示。它能减轻CPU负担实现高刷新率稳定画面输出。

它自带硬件 DMA 功能直接读取显存数据无需 CPU 持续干预。它可配置背光控制信号与显示时序方便对接不同驱动屏。它支持窗口区域设置实现局部刷新降低系统功耗。它提供中断机制方便程序检测显示状态与异常处理。

LTDC显示有层和背景的逻辑,在层中选择想要显示的窗口(Window)作为实际的显示内容。

LTDC总共有一个背景(BG)和两个层(Layer)组成,三者融合后作为最后的显示内容。

CubeMX配置

首先勾选LTDC的两个层,刷新方式我们选择RGB888(根据自己的LCD显示屏幕修改)。

根据自己的屏幕参数来设置LTDC的刷新参数,最后3个参数RGB用于设置背景层参数。

这里我挑了一张图片,宽450像素,高299像素,因此我们创建一个450*299窗口的层:

不透明度设置为255(0为透明),缓存区长宽对应图片长宽。像素不透明设置为固定不透明度(Alpha constant)。

首先是检查LTDC的引脚配置是否和原理图实际引脚对应,没有对应的话需要修改。其次是功能性引脚,例如PQ3,PQ6等需要单独配置。

修改LTDC时钟为25MHZ,接着就是生成工程代码。

代码编写

进入工程后,首先还是先设置前面的指令

在链接文件中,我们添加外部SPRAM的配置。

复制代码
MEMORY
{
  ROM    (xrw)    : ORIGIN = 0x70100400,   LENGTH = 511K
  RAM    (xrw)    : ORIGIN = 0x34000000,   LENGTH = 2048K
  EXTRAM (rw)     : ORIGIN = 0x91000000,   LENGTH = 0x04000000  
}
  /* Used by the startup to initialize data */
  _sidata = LOADADDR(.data);

    .lcd_buf (NOLOAD) :
  {
     . = ALIGN(32);
    *(.lcd_buf)
    . = ALIGN(32);
  } >EXTRAM
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/
  HAL_Init();

  /* USER CODE BEGIN Init */
  RIMC_MasterConfig_t RIMC_master = {0};
  RIMC_master.MasterCID = RIF_CID_1;
  RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;
  HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);
  HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);
  HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
  HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
  HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
  /* USER CODE END Init */
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_LTDC_Init();
  SystemIsolation_Config();
  /* USER CODE BEGIN 2 */
  HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On *//* PQ3  LCD_ONOFF   */
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable *//* PG13 LCD_DE      */
  HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness *//* PQ6  LCD_BL_CTRL */
  /* USER CODE END 2 */

接着我们需要给LTDC的安全权限(鬼知道一开始玩这玩意的时候这个地方找了多久),同时使能LCD的三个引脚:PQ3,PQ6,PQ13

利用软件,将图片转为RGB888的数组,接着我们把数组地址填入LTDC层的地址:

烧录代码后就可以看到图片已经显示到了显示屏上:

相关推荐
AOI小白新手上路2 小时前
江科协51单片机16-1 AD/DA ADC 三通道综合显示(LCD1602 版)改造说明
单片机·嵌入式硬件·51单片机
HUI-4743 小时前
EG1135|SSOP‑16 同步整流降压控制器,大功率外置 MOS 降压优选
单片机·嵌入式硬件·硬件工程
单片机仿真设计4 小时前
【proteus仿真】基于 STM32 单片机恒温箱控制系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
国科安芯4 小时前
星载CAN总线通信网络中抗辐射MCU的通信可靠性设计分析
网络·人工智能·分布式·单片机·嵌入式硬件·架构
新晨单片机设计5 小时前
S003A-基于STM32单片机温度计(数码管显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·stm32单片机功能定制
一条破秋裤5 小时前
TIM 输入捕获与 PWMI:从边沿到频率、占空比
笔记·stm32·学习
AOI小白新手上路5 小时前
江科协51单片机16-1 DA数模转换实验(PWM 呼吸灯)
单片机·嵌入式硬件·51单片机
hongmai6668886 小时前
告别Wi-Fi,专注Mesh:ESP32-H2-MINI-1U-H2S模组规格与应用
单片机·嵌入式硬件·物联网·5g·h.265
Yiran_G6 小时前
BLE通信距离怎么判断?从发射功率、PHY到天线设计分析
单片机·嵌入式硬件
女神下凡6 小时前
芯参谋(11): 各种存储芯片电路设计
开发语言·嵌入式硬件