429+SDRAM+LTDC 的IMPRECISERR硬件异常
同样硬件和软件,个别出现IMPRECISERR硬件异常,在LTDC_IRQHandler里引发:void LTDC_IRQHandler(void)
{
uint32_t Addr;
uint32_t layer;
LTDC->ICR = (U32)LTDC_IER_LIE;
for (layer = 0; layer < GUI_NUM_LAYERS; layer++)
{
if (layer_prop.pending_buffer >= 0)
{
Addr = layer_prop.address + layer_prop.xSize * layer_prop.ySize * layer_prop.pending_buffer * layer_prop.BytesPerPixel;
////HAL_LTDC_SetAddress(&hltdc, Addr, layer);
////__HAL_LTDC_RELOAD_CONFIG(&hltdc);
__HAL_LTDC_LAYER(&hltdc, layer)->CFBAR = Addr;
__HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hltdc);
GUI_MULTIBUF_ConfirmEx(layer, layer_prop.pending_buffer);
layer_prop.pending_buffer = -1;
}
}
////HAL_LTDC_ProgramLineEvent(&hltdc, 0);
}
请问硬汉,这种是否SDRAM硬件问题?
运行时表现上电正常,但一段时间后屏幕刷新卡顿,最终看门狗复位 芯片为W9825G6KH-6 这个是emWin的多缓冲处理,是不是三缓存的空间大小没有开够,或者SDRAM批量数据测试有异常 一般来说,同一批硬件出现这个问题的极少。SDRAM批量数据测试有什么办法? waterx3 发表于 2023-12-7 12:12
一般来说,同一批硬件出现这个问题的极少。SDRAM批量数据测试有什么办法?
批量测试这个即可
/*
*********************************************************************************************************
* 函 数 名: bsp_TestExtSDRAM
* 功能说明: 扫描测试外部SDRAM的全部单元。
* 形 参: 无
* 返 回 值: 0 表示测试通过; 大于0表示错误单元的个数。
*********************************************************************************************************
*/
uint32_t bsp_TestExtSDRAM1(void)
{
uint32_t i;
uint32_t *pSRAM;
uint8_t *pBytes;
uint32_t err;
const uint8_t ByteBuf = {0x55, 0xA5, 0x5A, 0xAA};
/* 写SRAM */
pSRAM = (uint32_t *)EXT_SDRAM_ADDR;
for (i = 0; i < EXT_SDRAM_SIZE / 4; i++)
{
*pSRAM++ = i;
}
/* 读SRAM */
err = 0;
pSRAM = (uint32_t *)EXT_SDRAM_ADDR;
for (i = 0; i < EXT_SDRAM_SIZE / 4; i++)
{
if (*pSRAM++ != i)
{
err++;
}
}
if (err >0)
{
return(4 * err);
}
/* 对SRAM 的数据求反并写入 */
pSRAM = (uint32_t *)EXT_SDRAM_ADDR;
for (i = 0; i < EXT_SDRAM_SIZE / 4; i++)
{
*pSRAM = ~*pSRAM;
pSRAM++;
}
/* 再次比较SDRAM的数据 */
err = 0;
pSRAM = (uint32_t *)EXT_SDRAM_ADDR;
for (i = 0; i < EXT_SDRAM_SIZE / 4; i++)
{
if (*pSRAM++ != (~i))
{
err++;
}
}
if (err >0)
{
return (4 * err);
}
/* 测试按字节方式访问, 目的是验证 FSMC_NBL0 、 FSMC_NBL1 口线 */
pBytes = (uint8_t *)EXT_SDRAM_ADDR;
for (i = 0; i < sizeof(ByteBuf); i++)
{
*pBytes++ = ByteBuf;
}
/* 比较SDRAM的数据 */
err = 0;
pBytes = (uint8_t *)EXT_SDRAM_ADDR;
for (i = 0; i < sizeof(ByteBuf); i++)
{
if (*pBytes++ != ByteBuf)
{
err++;
}
}
if (err >0)
{
return err;
}
return 0;
} 出现问题的硬件测试了SDRAM,16MB测试没有错误返回。单图层,emWin缓存设置为8*1024*1024,问题依然,设置为4*1024*1024目前还没出问题,还是没找到原因。
出现HardFault后的截图
waterx3 发表于 2023-12-18 09:01
出现HardFault后的截图
faults report窗口截图看下。 eric2013 发表于 2023-12-18 13:03
faults report窗口截图看下。
这个问题不是一定出现,昨天连着仿真器到现在也没有出现。继续观察。
又出现了,请教一下,这个bsp_delayus函数,在多任务系统里,会不会有问题?
waterx3 发表于 2023-12-19 14:18
又出现了,请教一下,这个bsp_delayus函数,在多任务系统里,会不会有问题?
没问题,你的这个是非精确异常,无法锁定具体位置。 eric2013 发表于 2023-12-20 09:07
没问题,你的这个是非精确异常,无法锁定具体位置。
这种不精确的总线访问错误,一般查找的方向是什么?堆栈溢出? 各种测试后,想起来屏换了供应商,按新的时序重新配置,目前来看竟然好了。时序影响有这么大吗?而且,原先的时序配置也在新屏的时序有效范围里,怎么就有问题呢? 另外,请教一下,LTDC的线中断优先级怎么设置合适,最高还是最低?
waterx3 发表于 2024-1-12 09:50
各种测试后,想起来屏换了供应商,按新的时序重新配置,目前来看竟然好了。时序影响有这么大吗?而且,原先 ...
会有这个问题,SDRAM的时序配置错误也会导致这种问题。 waterx3 发表于 2024-1-12 09:56
另外,请教一下,LTDC的线中断优先级怎么设置合适,最高还是最低?
这个各种优先级都行,基本没什么影响。
页:
[1]