硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7196|回复: 16
收起左侧

[客户分享] ST早年做的FSMC总线驱动RGB接口裸屏,外部SRAM做显存,并且支持DMA加速,会玩

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
发表于 2017-12-22 10:16:44 | 显示全部楼层 |阅读模式
本帖最后由 eric2013 于 2017-12-25 01:47 编辑

文件: stm32_tft_lcd_drive.chm (1.39 MB, 下载次数: 264)
软件包: 工程文件.rar (7.17 MB, 下载次数: 2122)
==================================================
2_58_67beccfa7dfb17b.jpg

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
 楼主| 发表于 2017-12-25 01:47:23 | 显示全部楼层
已经补上工程文件
回复

使用道具 举报

2

主题

569

回帖

575

积分

金牌会员

积分
575
发表于 2018-2-2 23:15:08 | 显示全部楼层
特意花时间看了例程,例程DMA 属于死等。照着把LCD填充单色块,刷图还是会快点。死等的方式还是没办法改!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
 楼主| 发表于 2018-2-3 02:14:26 | 显示全部楼层
leiyitan 发表于 2018-2-2 23:15
特意花时间看了例程,例程DMA 属于死等。照着把LCD填充单色块,刷图还是会快点。死等的方式还是没办法改!

这种情况最好配合RTOS,显示屏任务放在最低优先级就行。
回复

使用道具 举报

2

主题

31

回帖

37

积分

新手上路

积分
37
发表于 2018-2-5 19:26:47 | 显示全部楼层
666,320x240的,估计800*480的就吃力了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
 楼主| 发表于 2023-4-24 11:38:43 | 显示全部楼层
经典老帖子,找了很长时间,无意中搜索到了。
回复

使用道具 举报

8

主题

51

回帖

75

积分

初级会员

积分
75
发表于 2023-7-15 15:53:05 | 显示全部楼层
请教下,stm32f407 使用fsmc  扩展外部sram作为缓冲,并且使用lvgl进行lcd显示,是否也可以用DMA进行数据搬运,加速屏幕刷新?感谢回复
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
 楼主| 发表于 2023-7-15 17:47:08 | 显示全部楼层
TRX 发表于 2023-7-15 15:53
请教下,stm32f407 使用fsmc  扩展外部sram作为缓冲,并且使用lvgl进行lcd显示,是否也可以用DMA进行数据搬 ...

可以的,供参考,底层做了的DMA加速,所有GUI适用。

【原创开源应用第4期】给ili9488,RA8875等类显示屏的emWin底层增加DMA加速,提供RTX,uCOS和FreeRTOS版本
https://forum.anfulai.cn/forum.p ... 7501&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

32

主题

88

回帖

184

积分

初级会员

积分
184
发表于 2024-12-9 16:13:47 | 显示全部楼层
这个地址线有没有什么要求。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
 楼主| 发表于 2024-12-10 08:18:42 | 显示全部楼层
Y1ng 发表于 2024-12-9 16:13
这个地址线有没有什么要求。

FSMC + VS控制信号

[C] 纯文本查看 复制代码
/**
  ******************************************************************************
  * @file    lcd_driver.h
  * @author  MCD Application Team
  * @version V1.0.0
  * @date    07/07/2010
  * @brief   This file contains exported variables and protoypes for lcd_driver.c            
  ******************************************************************************
  * @copy
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>
  */ 


/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __LCD_H
#define __LCD_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

/** @addtogroup lcd_driver
  * @{
  */  

/** @defgroup lcd_driver_Exported_Types
  * @{
  */ 
/**
  * @}
  */ 

/** @defgroup lcd_driver_Exported_Constants
  * @{
  */ 

#define LCD_R01             0x01
#define LCD_R02             0x02
#define LCD_R03             0x03
#define LCD_R04             0x04
#define LCD_R05             0x05
#define LCD_R0A             0x0A
#define LCD_R0B             0x0B
#define LCD_R0D             0x0D
#define LCD_R0E             0x0E
#define LCD_R0F             0x0F
#define LCD_R16             0x16
#define LCD_R17             0x17
#define LCD_R1E             0x1E
#define LCD_R30             0x30
#define LCD_R31             0x31
#define LCD_R32             0x32
#define LCD_R33             0x33
#define LCD_R34             0x34
#define LCD_R35             0x35
#define LCD_R36             0x36
#define LCD_R37             0x37
#define LCD_R3A             0x3A
#define LCD_R3B             0x3B

/* For SPI Data Configuration */
#define INDEX_DATA1          0x70 
#define INDEX_DATA2          0x72 

#define SPI_TFT_CS_HIGH()    GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define SPI_TFT_CS_LOW()     GPIO_ResetBits(GPIOA, GPIO_Pin_4)
#define TFT_RESET_HIGH()     GPIO_SetBits(GPIOC, GPIO_Pin_1)
#define TFT_RESET_LOW()      GPIO_ResetBits(GPIOC, GPIO_Pin_1)


/*------------------LCD Slideshow parameters ---------------------------------*/
#define MAX_SLIDESHOW_IMAGE_COUNT   (uint8_t)2

/* SRAM Image Address with image Header information */
#define SRAM_IMAGE1_ADDR             (uint32_t)0x68000000
#define SRAM_IMAGE2_ADDR             (uint32_t)0x68025884
#define IMAGE_SIZE                   (uint32_t)76866 
#define LCD_BANNER_IMAGES            (uint8_t)52

/* SRAM Image Address with image Header information removed */
#define SRAM_IMAGE1                 (uint32_t)0x68000042
#define SRAM_IMAGE2                 (uint32_t)0x680258C6

/* Frame Rate control Parameters */
/* Frame rate should not be set more than 40 Hertz */
/* Banner mode, maximum recommended frame rate    : 19Hertz */
/* Slideshow mode, maximum recommended frame rate : 40Hertz */

#define FRAME_RATE                   (uint32_t)19  /* In Hertz */

/* Slide show time should not be more than 60 sec */
#define SLIDESHOW_TIME_GAP           (uint32_t)1 /* In seconds */


/*------------------- LCD Sync parameters-------------------------------------*/

/* For QVGA Resolution LCD; there are 320 pixels per 1 LCD line */
#define LCD_HORZ_LINE            (uint16_t)320 /* Number of pixels in one line */
#define LCD_VERT_FRAME           (uint16_t)240 /* Number of lines in one frame */

#define LCD_FRAME_FRONT_PORCH    (uint8_t)2
#define LCD_FRAME_BACK_PORCH     (uint8_t)4
#define LCD_FRAME_BACK_PORCH_START (uint16_t)(LCD_FRAME_FRONT_PORCH+LCD_VERT_FRAME)
#define LCD_FRAME_END              (uint16_t)(LCD_FRAME_BACK_PORCH_START+\
                                              LCD_FRAME_BACK_PORCH)

#define LCD_LINE_FRONT_PORCH      (uint8_t)9
#define LCD_LINE_BACK_PORCH       (uint8_t)20


#define TFT_HSYNC_GPIO_PORT_CLOCK       RCC_APB2Periph_GPIOC
#define TFT_HSYNC_GPIO_PIN              GPIO_Pin_6
#define TFT_HSYNC_GPIO_PORT             GPIOC

#define TFT_VSYNC_GPIO_PORT_CLOCK       RCC_APB2Periph_GPIOA
#define TFT_VSYNC_GPIO_PIN              GPIO_Pin_8
#define TFT_VSYNC_GPIO_PORT             GPIOA


/* Image source is of 16bit data width , for LCD line display
Increment Image data source by (LCD_HORZ_LINE*2) = 320*2 =640 for QVGA */
#define IMG_SRC_LINE_SIZE          (uint16_t)(LCD_HORZ_LINE*2)    

/* HSYNC and VSYNC toggle */
#define TFT_HSYNC_HIGH              (GPIOC->BSRR = GPIO_Pin_6)
#define TFT_HSYNC_LOW               (GPIOC->BRR  = GPIO_Pin_6)
#define TFT_VSYNC_HIGH              (GPIOA->BSRR = GPIO_Pin_8)
#define TFT_VSYNC_LOW               (GPIOA->BRR  = GPIO_Pin_8)


/* LCD Display Modes */
typedef enum 
{
  LCD_BannerMode = 0x01,
  LCD_SlideShowMode,
}LCD_DisplayMode_Typedef; 



/**
  * @}
  */ 


/** @defgroup lcd_driver_Exported_Variables
  * @{
  */ 
extern __IO uint32_t ImageSourceAddrCounter;
extern __IO uint32_t ImageSourceAddress;
extern uint16_t DummyDisplayBuffer[LCD_HORZ_LINE];
extern __IO uint8_t NOR_ImageIndex ;
extern uint8_t volatile DMAComplete;
extern const uint32_t NORImageFileAddrMap[52];
/**
  * @}
  */ 


/** @defgroup lcd_driver_Exported_Functions
  * @{
  */ 

void LCD_Init(void);
void LCD_FSMCConfig(void);
void LCD_AgingModeDisplay(void);
void LCD_ImageDisplay(void);
void LCD_HysncVsyncMode(void);
void CopyToInternalFlash(void);
uint32_t PrepareInternalFlashDataForDisplay(void);
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue);
void LCD_CtrlLinesConfig(void);
void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, uint16_t CtrlPins, BitAction BitVal);
void LCD_SPIConfig(void);
void DMA_InterruptConfig(void);
void LCD_DriverConfig(void);
uint32_t ExternalSRAMCheckBitmapFiles(void);
void FSMC_SRAM_Init(void);
void CopyStartupImagesToExtSRAM(void);
void FSMC_SRAM_WriteBuffer(uint16_t* pBuffer, uint32_t WriteAddr, uint32_t NumHalfwordToWrite);
void CopyNewImageToExtSRAM(u32 src_address,u32 dest_address);
/**
  * @}
  */ 
#endif /* __LCD_H */

/**
  * @}
  */ 

/**
  * @}
  */ 
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
回复

使用道具 举报

32

主题

88

回帖

184

积分

初级会员

积分
184
发表于 2024-12-11 14:43:08 | 显示全部楼层
eric2013 发表于 2024-12-10 08:18
FSMC + VS控制信号

[C] 纯文本查看 复制代码
/**
[/quote]

那种8条腿的PSRAM能不能用来扩展单片机的RAM?(申请超大数组之类的)。
[mw_shl_code=c,true]#define LCD_R01             0x01
#define LCD_R02             0x02
#define LCD_R03             0x03
#define LCD_R04             0x04
#define LCD_R05             0x05
#define LCD_R0A             0x0A
#define LCD_R0B             0x0B
#define LCD_R0D             0x0D
#define LCD_R0E             0x0E
#define LCD_R0F             0x0F
#define LCD_R16             0x16
#define LCD_R17             0x17
#define LCD_R1E             0x1E
#define LCD_R30             0x30
#define LCD_R31             0x31
#define LCD_R32             0x32
#define LCD_R33             0x33
#define LCD_R34             0x34
#define LCD_R35             0x35
#define LCD_R36             0x36
#define LCD_R37             0x37
#define LCD_R3A             0x3A
#define LCD_R3B             0x3B

这些像魔法数一样,怎么来的呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
 楼主| 发表于 2024-12-12 09:55:51 | 显示全部楼层
Y1ng 发表于 2024-12-11 14:43
那种8条腿的PSRAM能不能用来扩展单片机的RAM?(申请超大数组之类的)。
[mw_shl_code=c,true]#define LCD ...

他的具体用法我没有深究。
回复

使用道具 举报

32

主题

88

回帖

184

积分

初级会员

积分
184
发表于 2024-12-12 11:21:12 | 显示全部楼层
eric2013 发表于 2024-12-12 09:55
他的具体用法我没有深究。

FSMC是不是只能驱动 8080时序的,像RGB的屏是不是不能用这个接口?
回复

使用道具 举报

32

主题

88

回帖

184

积分

初级会员

积分
184
发表于 2024-12-12 11:29:57 | 显示全部楼层
STM32F407[CUBEMX]只能驱动 PSRAM,没看到这篇文章说的SRAM                      https://blog.csdn.net/m0_74307146/article/details/140412463
那这个PSRAM怎么用呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
 楼主| 发表于 2024-12-13 01:07:09 | 显示全部楼层
Y1ng 发表于 2024-12-12 11:21
FSMC是不是只能驱动 8080时序的,像RGB的屏是不是不能用这个接口?

这个楼主位的实现做了特殊玩法,就是接的裸屏RGB,使用SRAM做显存。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
 楼主| 发表于 2024-12-13 01:07:52 | 显示全部楼层
Y1ng 发表于 2024-12-12 11:29
STM32F407[CUBEMX]只能驱动 PSRAM,没看到这篇文章说的SRAM                      https://blog.csdn.net/m0 ...

基于STM32L476+64M QSPI接口PSRAM(IPS6404L)开源分享(含源码)
https://forum.anfulai.cn/forum.p ... 0745&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

32

主题

88

回帖

184

积分

初级会员

积分
184
发表于 2024-12-13 10:51:53 | 显示全部楼层
eric2013 发表于 2024-12-13 01:07
这个楼主位的实现做了特殊玩法,就是接的裸屏RGB,使用SRAM做显存。

RGB屏幕不是有HV SV两条信号线,FSMC印象中是不带这个的。像ST7701这个也适用吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 11:11 , Processed in 0.048209 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表