1、系統構成,黑色塊表示組件非必須
2、環境准備
CubeMX:6.0.1
touchgfx:4.15.0
rt-thread:2020-8-14 commit
Keil:5.30
board:stm32f29igt6 + SDRAM-256Mb(16M x 16)+ SPI-FLASH-16MB + LCD-1024*600
3、打開CubeMX開始創建項目
3.1、安裝軟件包touchgfx最新版本4.15.0
3.2、系統時鍾源RCC配置
3.3、系統調試口及時基SYS配置
3.4、配置SDRAM--W9825G6KH,電氣參數及管腳配置
3.5、配置SPI-FLASH--W25Q128JVSQ
3.6、配置圖形加速器 ChromART
3.7、顯示LTDC接口配置
3.8、觸摸芯片I2C接口配置
3.9、組件CRC激活,TouchGFX需要
3.10、加入freertos操作系統,目的是生成touchgfx與操作系統接口文件,方便移植rt-thread,參數配置保持默認即可
3.11、在附加軟件管理器中選擇TouchGFX用以生成其代碼,並做相關配置
3.12、IO口配置,LCD復位、背光,FLASH片選,LED等
3.13、時鍾樹配置
3.14、生成工程
3.15、直接打開生成的Keil工程編譯會報錯,這是因為這些文件都是TouchGFX Designer生成,所以需要使用TouchGFX Designer 先生成代碼
3.16、打開CubeMX生成的TouchGFX Designer模板工程,加入TEXT、BOX和BUTTON控件后生成touchgfx代碼
3.17、再次編譯Keil工程
4、補全工程,使之能運行起來
4.1、加入SDRAM配置代碼
1 #define REFRESH_COUNT 636//1000//1755//636 2 #define SDRAM_TIMEOUT ((uint32_t)0xFFFF) 3 #define SDRAM_MODEREG_BURST_LENGTH_1 ((uint32_t)0x0000) 4 #define SDRAM_MODEREG_BURST_LENGTH_2 ((uint32_t)0x0001) 5 #define SDRAM_MODEREG_BURST_LENGTH_4 ((uint32_t)0x0002) 6 #define SDRAM_MODEREG_BURST_LENGTH_8 ((uint32_t)0x0004) 7 #define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint32_t)0x0000) 8 #define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint32_t)0x0008) 9 #define SDRAM_MODEREG_CAS_LATENCY_2 ((uint32_t)0x0020) 10 #define SDRAM_MODEREG_CAS_LATENCY_3 ((uint32_t)0x0030) 11 #define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint32_t)0x0000) 12 #define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint32_t)0x0000) 13 #define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint32_t)0x0200) 14 15 /** 16 * @brief Programs the SDRAM device. 17 * @retval None 18 */ 19 void MX_SDRAM_InitEx(void) 20 { 21 __IO uint32_t tmpmrd = 0; 22 FMC_SDRAM_CommandTypeDef Command; 23 24 /* Step 1: Configure a clock configuration enable command */ 25 Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; 26 Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; 27 Command.AutoRefreshNumber = 1; 28 Command.ModeRegisterDefinition = 0; 29 30 /* Send the command */ 31 HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT); 32 33 /* Step 2: Insert 100 us minimum delay */ 34 /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */ 35 HAL_Delay(1); 36 37 /* Step 3: Configure a PALL (precharge all) command */ 38 Command.CommandMode = FMC_SDRAM_CMD_PALL; 39 Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; 40 Command.AutoRefreshNumber = 1; 41 Command.ModeRegisterDefinition = 0; 42 43 /* Send the command */ 44 HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT); 45 46 /* Step 4: Configure an Auto Refresh command */ 47 Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; 48 Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; 49 Command.AutoRefreshNumber = 8; 50 Command.ModeRegisterDefinition = 0; 51 52 /* Send the command */ 53 HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT); 54 55 /* Step 5: Program the external memory mode register */ 56 tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 | \ 57 SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | \ 58 SDRAM_MODEREG_CAS_LATENCY_3 | \ 59 SDRAM_MODEREG_OPERATING_MODE_STANDARD | \ 60 SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; 61 62 Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE; 63 Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; 64 Command.AutoRefreshNumber = 1; 65 Command.ModeRegisterDefinition = tmpmrd; 66 67 /* Send the command */ 68 HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT); 69 70 /* Step 6: Set the refresh rate counter */ 71 /* Set the device refresh rate */ 72 HAL_SDRAM_ProgramRefreshRate(&hsdram1, REFRESH_COUNT); 73 }
4.2、加入SPI-FLASH驅動
4.3、加入觸摸驅動
5、FAQ
5.1、LTDC刷新頻率過高導致的屏幕閃爍錯位情況,相同硬件第一次設置25M工作正常,第二次25M就出現下面現象,修改為23M后工作正常,感覺會變很奇怪
5.2 、framebuffer過小導致的顯示斷屏錯位,大小應該是分辨率×色深 (800×480×3) Byte
5.3、FT5436觸摸IC獲取第一點觸摸Y坐標概率性負值,即MSB是1,須轉為正值 ,可 & 0x7FFF,否則造成觸摸間歇性失效,如 drag 效果達不到