今天编写了一段程序验证FLASH读写,编译后下到DSP板上执行,发现写FLASH没有成功。下面是一段写FLASH的函数:
void DM642_FLASH_write(Uint32 src, Uint32 dst, Uint32 length)
{
Uint8 *psrc, *pdst;
Uint32 i;
/* Establish source and destination */
psrc = (Uint8 *)src;
pdst = (Uint8 *)dst;
for (i = 0; i < length; i++)
{
/*Program one 8-bit word*/
*((Uint8 *)EVMDM642_FLASH_CTLAAA) = 0xaa; //A句
*((Uint8 *)EVMDM642_FLASH_CTL555) = 0x55; //B句
*((Uint8 *)EVMDM642_FLASH_CTLAAA) = 0xa0; //C句
*pdst = *psrc; //D句
/* Wait for operation to complete*/
while(1)
if (*pdst == *psrc)
break;
pdst++;
psrc++;
}
*((Uint16 *)EVMDM642_FLASH_BASE) = 0xf0;
}
主程序中调用函数如下:
DM642_FLASH_write(0x80000000, 0x90000100, 0xffff);
该段代码将SDRAM中开始的64K数据写入FLASH中。看程序没有问题,而板上的CPLD是经过仿真验证的。为定位问题,测量FLASH的WE脚和一根数据线。
代码前3句(A、B、C)三句是FLASH写“解锁”(29LV320:BYTE模式)。每个循环应当是四次写操作,而在示波器上只有三个低电平。然后单步执行,在B、C、D句执行后都能看到WE脚上的低电平。而一次循环结束后不是返回执行A句而是返回到B句,A句根本就没有执行。看编译后的代码,A句没有对应的代码。于是认为应当是CCS编译器的问题。突然想到A句、C句目的地址相同,也许是编译过程中自动优化把A句省掉了。于是在CCS编译器中寻找编译优化的相关配置,之后在project->Build Options的Compiler栏里找到了对应项--“Opt Level”,默认优化等级为3级(-o3),将此项改为“None”。重新编译程序,将程序下载到DM642单板,运行即看到A句能够执行,FLASH写读均正常。
将问题记录到日志,一方面如果以后再遇到此问题可以找回解决方法,另一方面也会对一些和我一样对DSP编程不熟悉的朋友有一些帮助(也可以通过命令对单句进行禁止编译优化来解决该问题)。
至今天中午,由偶单独开发的DM642硬件系统32MB SDRAM(133M)、GPIO、FLASH均验证OK,小系统部分验证完成,下一步调试图像采集部分:)
打赏帖 | |
---|---|
【S32K146】S32DS watchdog 配置使用被打赏20分 | |
【Zephyr】使用 IAR 调试 Zephyr 镜像被打赏20分 | |
【Zephyr】MCXN947 Zephyr 开发入门适配shell被打赏20分 | |
【我要开发板】6.联合MATLAB记录数据被打赏50分 | |
【瑞萨RA2E1开发板】:使用ADC功能实现位移传感器采集方案被打赏20分 | |
【nRF7002DK】基于sht30的温湿度计被打赏20分 | |
【nRF7002DK】日志打印被打赏20分 | |
【换取手持示波器】RGB屏幕移植ARM-2D库被打赏35分 | |
【分享开发笔记,赚取电动螺丝刀】分享一下如何解决瑞萨RA2E1使用printf编译报错问题被打赏27分 | |
rtthread硬件加密-5hash加密分析被打赏10分 |