今天编写了一段程序验证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,小系统部分验证完成,下一步调试图像采集部分:)
我要赚赏金打赏帖 |
|
|---|---|
| 基于ArduinoUNO开发板的AT24C02读写测试被打赏¥16元 | |
| TCS3472S传感器及其色彩检测被打赏¥19元 | |
| 【S32DS】S32K3 RTD7.0.1 HSE 组件配置报错问题解决被打赏¥27元 | |
| 【S32K3XX】MCME 启动 CORE1被打赏¥23元 | |
| AG32VH407下温度大气压传感器及其检测被打赏¥20元 | |
| AG32VH407下光照强度传感器BH1750及其检测被打赏¥22元 | |
| AT32VH407下使用温湿度传感器DHT22进行检测被打赏¥20元 | |
| DIY一个婴儿澡盆温度计被打赏¥34元 | |
| 【FreeRtos】FreeRtos+MPU region 配置规则被打赏¥23元 | |
| 【分享开发笔记,赚取电动螺丝刀】三分钟快速上手驱动墨水屏(ArduinoIDE)被打赏¥28元 | |
我要赚赏金
