[STM32H7] STM32H735G-DK 无法切换像素格式

[复制链接]
48|10
唐纳德d 发表于 2026-9-19 14:20 | 显示全部楼层 |阅读模式
在 STM32H735G-DK 开发板运行时动态切换 LTDC 的像素格式模式,但没有成功。我使用的是 CubeMX 中该开发板对应的 BSP 示例。复位后,首次设置像素格式是可以成功的,但此后无论我怎么做都不再生效。我用 HAL_DeInit () 做完整反初始化,但依然不起作用。固件包版本为 STM32Cube_FW_H7_V1.12.1。

举例来说,同样的切换 LTDC 像素格式在 STM32U5G9J-DK2 上运行完全没有问题。

我的 main () 函数大致如下:
int main(void)
{
MPU_Config();
CPU_CACHE_Enable();
HAL_Init();
/* Configure the system clock to 520 MHz */
SystemClock_Config()
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
BSP_LED_Init(LED1);
/*##-1- Initialize the LCD #################################################*/
/* Initialize the LCD */
//BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
BSP_LCD_InitEx(0, 1, LCD_PIXEL_FORMAT_RGB565, 480, 272);
UTIL_LCD_SetFuncDriver(&LCD_Driver);
uint32_t * pBuffAddr = (uint32_t*) 0x70000000; // clr buff addr
uint8_t * pFrameAddr = (uint8_t* ) 0x70000000; // read pic into
// clear 2 framebuffers size
for(uint32_t i = 0; i < (480*272*2);i++){
        pBuffAddr[i] = 0;
}
BSP_LCD_SetBrightness(0, 100); // 0-100%
BSP_OSPI_NOR_Init_t Flash;
BSP_OSPI_NOR_DeInit(0);
Flash.InterfaceMode = BSP_OSPI_NOR_OPI_MODE;
Flash.TransferRate = BSP_OSPI_NOR_DTR_TRANSFER;
BSP_OSPI_NOR_Init(0, &Flash);
BSP_OSPI_NOR_Read(0, pFrameAddr, 0, 261120);
BSP_OSPI_NOR_DeInit(0);
HAL_Delay(1111);
// clear 2 framebuffers size
for(uint32_t i = 0; i < (480*272*2);i++){
        pBuffAddr[i] = 0;
}
//-------------------------------------------------
//- below unsuccessful try to change pixel format -
//-------------------------------------------------
BSP_LCD_DeInit(0);
BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
BSP_LCD_SetBrightness(0, 100); // 0-100%
UTIL_LCD_SetFuncDriver(&LCD_Driver);

// clear 2 framebuffers size
for(uint32_t i = 0; i < (480*272*2);i++){
        pBuffAddr[i] = 0;
}
//-------------------------------------------------
//-------------------------------------------------
//-------------------------------------------------
extern void main_app(void);
while(1) {
         __NOP();
         main_app();
}
}

公羊子丹 发表于 2026-9-19 15:40 | 显示全部楼层
首次能切、之后死活不行,这很像 LTDC 的某个寄存器被'锁'了。LTDC 有几个位是'只能写一次'或需要重载才生效的(比如和时钟/极性相关的配置),BSP_LCD_DeInit 如果没把 LTDC 完全复位到初始态,后面的配置就写不进去。建议对比首次成功和后续失败时 LTDC 的关键寄存器值,差异一眼就能看出来。
周半梅 发表于 2026-9-19 15:41 | 显示全部楼层
我赌问题在 HAL_DeInit 没真正复位 LTDC 的时钟或外设。F7/H7 的 LTDC 关掉后要重新使能时钟、重配才生效。你试的 BSP_LCD_DeInit + BSP_LCD_Init 走的是 BSP 层,BSP 里可能没做完整的 LTDC 时钟复位。手动加一句 __HAL_RCC_LTDC_FORCE_RESET() + RELEASE_RESET,再重配试试。
帛灿灿 发表于 2026-9-19 15:42 | 显示全部楼层
补充个关键:像素格式切换涉及帧缓冲的重新解释。你先用 RGB565 初始化(480x272),帧缓冲按 2 字节/像素走。再切成别的格式时,如果帧缓冲地址和行 stride 没跟着改,LTDC 会按旧 stride 读,可能越过缓冲边界导致异常。确认切换后 LTDC 的 LxCFBAR/LxPFCR/LxCFBLR 都按新格式重算了。
童雨竹 发表于 2026-9-19 15:43 | 显示全部楼层
想问下你 U5G9 上没问题、H735 上有问题,是不是两边的 BSP 实现不一样?U5 的 BSP 可能对切换做了更完整的处理,H735 的 BSP 版本较老。分别看两版 BSP_LCD_InitEx 的源码,找出 H735 版少了哪一步(大概率是 LTDC 重载或时钟复位),补齐就好。
万图 发表于 2026-9-19 15:43 | 显示全部楼层
从 LTDC 手册看,改像素格式后需要等 SRCR 的 VBR(垂直消隐重载)或立即重载位生效。如果你切格式时正好在扫描中,又没触发重载,新配置可能不会应用。BSP 通常用 HAL_LTDC_SetPixelFormat 会帮你重载,但如果 BSP 绕过了这层直接写寄存器,重载就得自己做。
Wordsworth 发表于 2026-9-19 15:44 | 显示全部楼层
测试建议:把'切换'拆成两步验证——① 只关 LTDC、重开、不换格式,看能否正常;② 加上换格式。如果第①步就失败,说明是 LTDC 重启本身没做好(时钟/复位);如果第①步 OK 第②步失败,那是格式相关寄存器(CFBLR/CFBAR)没重算。二分定位。
Bblythe 发表于 2026-9-19 15:45 | 显示全部楼层
我之前在 H7 上切 LTDC 格式也卡过,最后发现是 BSP 的 Handle 里缓存了旧格式参数,DeInit 没清缓存,重新 Init 时又用了旧值。你去 BSP 的 LCD_Driver 句柄里看有没有 pData/PixelFormat 这类成员没被重置。这种'状态残留'是 BSP 层的经典坑。
Pulitzer 发表于 2026-9-19 15:46 | 显示全部楼层
补充个思路:如果 LTDC 是双图层,切格式要两个图层都处理,或者确认你切的是正在显示的那层。只切了后台层,前台没动,看起来就'没生效'。确认 Lx 图层和你帧缓冲对应的层号一致。
Uriah 发表于 2026-9-19 15:46 | 显示全部楼层
问一下你 520MHz 主频下 LTDC 的像素时钟是多少?格式切换有时会牵扯到像素时钟分频。如果切格式时改了时钟但没等 PLL/分频稳定就启动,LTDC 会跑飞。建议切完格式后给一点延时或等 LTDC 状态稳定再进 while(1)。
Clyde011 发表于 2026-9-19 15:47 | 显示全部楼层
从根因排序:① LTDC 外设时钟/复位未彻底(DeInit 不完整)② 帧缓冲 CFBAR/CFBLR 未按新格式重算 ③ BSP 句柄状态残留 ④ 重载未触发。建议直接对比'首次成功'与'后续失败'的 LTDC 全套寄存器,这是最快的定位法,别在代码里盲猜。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

208

主题

209

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0