共计 3514 个字符,预计需要花费 9 分钟才能阅读完成。
STM32 CubeMX 无法将 STM32H7 的最大 CPU 频率设置为 480 MHz
使用 STM32CUBMX5.6 移植 touchGFX4.13
【SDRAM】STM32 外扩 SDRAM 学习总结 + CubeMX 配置教程
STM32CubeMX | 41 – 使用 LTDC 驱动 TFT-LCD 屏幕(RGB 屏)
手把手教你制作 TouchGFX 的工程模板
其他问题
Cannot Load Flash Programming Algorithm!
stm32 修改堆栈大小(堆栈空间不足导致死机)
1. 选择调试下载方式
用 STM32CubeMX 工具选择好芯片后,在 Trace and Debug
里面选择下载调试方式。
2. 选择晶振和时基
在 System Core
里面配置晶振和时基
3. 打开 CRC 检验
在 Computing
中打开 CRC
, 勾选Activated
即可。ST 使用 TouchGFX 必须使能 CRC。
4. 使能 DMA2D
在 Multimedia
中打开 DMA2D
, 勾选Activated
,并配置和 使能 DMA2D 中断。
5. 配置 SDRAM
Connectivity
中找到FCM
, 相关配置如图:
下面的相关配置参考《野火 29- 电容触摸屏 - 触摸画板》的 bsp_sdram.c
文件中的 SDRAM_Init(void)
函数内容进行配置。也可根据数据手册配置。额~~~ 我还不会看数据手册。
切记:需要对 SDRAM 的片选信号和时钟使能信号进行重新配置,否则屏幕只能点亮,而不能正常显示 touchgfx。PH6
引脚更改为 FMC_SDNE1
,PH7
引脚更改为FMC_SDCKE1
。
7. 配置 LTDC
在 Multimedia
中选择 LTDC
,并使能LTDC
中断。
下面的相关配置参考《野火 29- 电容触摸屏 - 触摸画板》的 bsp_lcd.c
文件中的 LCD_PARAM_TypeDef lcd_param[LCD_TYPE_NUM]
数组内容进行配置。
需要对 LTDC 的相关引脚重新手动配置,和原理图一一对应 ,这里使用RGB565
, 相关配置引脚如下
这里可参考手把手教你制作 TouchGFX 的工程模板 里面介绍了触摸中断的引脚设置方式。本文未用到此方法,因为触摸中断已经在野火 stm32h743xih6 touchgfx 添加触摸代码 (二) 的bsp_i2c_touch.h
文件中定义。
显示屏背光设置
8. 检查相关中断是否开启
9. 配置FREERTOS
在 Middleware
中选择CMSIS_V1
10 配置 touchgfx
在 Software packs
中配置 touchgfx
11. 配置时钟
野火七寸屏最大时钟 33Mhz,FMC 最大支持 240Mhz
12. 生成工程
13. 先使用 touchgfx designer 工具配置 GUI
步骤 12 完成后直接打开 mdk 工程会报错
在 STM32cubemx 生成的文件夹下的 TouchGFX
中打开 ApplicationTemplate.touchgfx.part
配置 GUI 界面。
14. 添加 SDRAM 相关代码
在 main.c
中添加 SDRAM 的相关代码
#define SDRAM_SIZE 0x4000000
#define FMC_BANK_SDRAM FMC_Bank2_SDRAM
#define FMC_COMMAND_TARGET_BANK FMC_SDRAM_CMD_TARGET_BANK2
#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200)
#define SDRAM_TIMEOUT ((uint32_t)0xFFFF)
static FMC_SDRAM_CommandTypeDef Command;
static void MX_SDRAM_InitEx(void);
static void SDRAM_delay(__IO uint32_t nCount)
{
__IO uint32_t index = 0;
for(index = (100000 * nCount); index != 0; index--)
{
}
}
static void MX_SDRAM_InitEx(void)
{
uint32_t tmpr = 0;
Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;
HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);
SDRAM_delay(1);
Command.CommandMode = FMC_SDRAM_CMD_PALL;
Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;
HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);
Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
Command.AutoRefreshNumber = 8;
Command.ModeRegisterDefinition = 0;
HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);
tmpr = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 |
SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
SDRAM_MODEREG_CAS_LATENCY_3 |
SDRAM_MODEREG_OPERATING_MODE_STANDARD |
SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = tmpr;
HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);
HAL_SDRAM_ProgramRefreshRate(&hsdram1, 824);
}
在 main.c
的static void MX_FMC_Init(void)
函数中调用 MX_SDRAM_InitEx()
函数
在 main.c
的void StartDefaultTask(void const * argument)
函数中调用 MX_TouchGFX_Process()
函数,
到这里,屏幕可以正常显示 touchgfx 的内容。
关于 Software Packs
选项找不到的解决办法:
原文地址: 野火 stm32h743xih6 touchgfx 显示屏点亮(一)