本帖最后由 john_lee 于 2012-3-28 10:11 编辑
有一个项目用了 mini51,还需要写 dataflash,并且有一定的时间要求,查了一下 TRM,TRM 并没有给出写 flash 的 AC 参数,相关的内容只有一句话:“当 ISPGO 比特被设时, CPU 将等待 ISP 操作完成, 在此期间, 外设将保持正常工作. 如果发生任何中断, CPU等ISP过程完成之后才会处理.”,还有一张图:
在这里要对新唐的文档吐一下槽:给个 AC 参数难吗?
没办法,只有编程测试一下了,我手上只有菜农老哥赠送的助学板,是 nuc120re3an 的 MPU,写 flash 的 AC 参数,想来应该与 mini51 的差不多。
编程的思路是,在“写”flash 之前,记录一下 Systick 的当前值,然后循环写 64 个 32bits 数据,一共 256 字节,“写”完成后,再次记录Systick的当前值,其差值就是“写”flash 需要的时间。
程序(片段)如下:void test()
{
using namespace sfr::fmc;
uint32_t* addr = reinterpret_cast<uint32_t*>(0x1fe00);
uint32_t data = 0x03020100;
FMC.ISPCON().ISPEN(1);
FMC.ISPCMD(0).FOEN(1).FCTRL(1);
uint32_t n = 64;
volatile uint32_t* p = reinterpret_cast<volatile uint32_t*>(0xe000e018);
uint32_t t = *p;
do {
FMC.ISPADR = addr++;
FMC.ISPDAT = data;
FMC.ISPTRG(0).ISPGO(1);
data += 0x1010101;
while (FMC.ISPTRG().ISPGO);
} while (--n);
t -= *p;
cout << "t = " << t << endl;
}
输出截图:
差值为146660,由于设定的Systick时钟源为HCLK = 48MHz,所以共耗时 146660 / 48 = 3055us,单次写(32 bits)数据耗时 3055 / 64 = 47.7us。
----------------------
今天才看到TRM中其实是有 FLASH 相关的 AC 参数的,怪我看得不全面,主要是受 ATMEL 文档的影响。
|