w494143467 发表于 2020-12-14 15:28

【AT-START-F403A测评】Part6:片上Flash性能测试

<p><strong>1.介绍</strong></p>

<p>上一篇讲了Flash的Demo,这一篇来讲一下【AT-START-F403A】的性能,了解Flash的性能之后还是比较好,为以后在这个芯片上开发时对Flash读写时间的把握,所以还是要来一贴特意写一下的!</p>

<p><strong>2.Flash内存</strong></p>

<p>首先查看芯片手册,可以看到板载的主控是1024K字节的,这个大小还是非常够用的,基本上应用开发都是足够的。</p>

<p></p>

<p>然后看一下Flash的地址主要存在哪一块,可以看到1024K字节可以存到【0x080FFFFF】地址上,所以到时候开项目时分配地址就可以存到这个范围,当然需要看一下程序存在哪一块了。</p>

<p></p>

<p>讲工程生成好的HEX文件,通过HEX文件查看器,我这里选择了【STM32 ST-LINK Utility】软件来查看代码分配的地址,可以看到,目前代码只到存到了【0x08002A40】地址,所以从【0x08002A40】地址后面都是可以存数据的,那么我还是直接用例程中的地址来存数据。</p>

<p></p>

<p>修改例程中的代码,有个不检测Flash写入数据函数【FLASH_Write_NoCheck】需要在flash.H文件中添加声明才不会报错。</p>

<pre>
<code>#define TEST_BUFEER_SIZE          65536/4
#define TEST_FLASH_ADDRESS_START(0x8000000+1024*522)
/* Private typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

u16 BufferWrite;   
u16 BufferRead;
u32 Index=0;
TestStatus Buffercmp(uint16_t* pBuffer1, uint16_t* pBuffer2, uint16_t BufferLength);

int main(void)
{

Delay_init();
UART_Print_Init(115200);       
AT32_LEDn_Init(LED2);                               
AT32_LEDn_Init(LED3);                       
        printf("Flash Demo Start!\r\n");

//Fill BufferWrite data to test
for(Index=0;Index&lt;TEST_BUFEER_SIZE;Index++)
{
    BufferWrite=Index;
}
                Delay_ms(1000);
                printf("Write Start!\r\n");
    FLASH_Write(TEST_FLASH_ADDRESS_START,BufferWrite,TEST_BUFEER_SIZE);                //Write data to flash
                printf("Write Success!\r\n");
       
                Delay_ms(1000);
                printf("Write NoCheck Start!\r\n");
    FLASH_Write_NoCheck(TEST_FLASH_ADDRESS_START,BufferWrite,TEST_BUFEER_SIZE);                //Write data to flash
                printf("Write NoCheck Success!\r\n");
       
                Delay_ms(1000);
                printf("Read Start!\r\n");
    FLASH_Read(TEST_FLASH_ADDRESS_START,BufferRead,TEST_BUFEER_SIZE);           //read data from flash
                printf("Read Success!\r\n");

if(Buffercmp(BufferWrite,BufferRead,TEST_BUFEER_SIZE)==PASSED)      //Compare the buffer
{
    AT32_LEDn_ON(LED2);
    AT32_LEDn_OFF(LED3);   
}
else
{
    AT32_LEDn_OFF(LED2);
    AT32_LEDn_ON(LED3);
}

while(1)
{

}
}
</code></pre>

<p>然后连续按下三次复位键,打印出来的内容如下,写入的字节数为【32769】可以看到写入Flash时校验时间将近670ms,而未校验写入Flash时间只需要不到20ms,读取Flash数据时间极小。</p>

<p></p>

<p>需要校验写入Flash的速度为48.9字节/S。</p>

<p></p>

<p>不需要校验写入Flash的速度为1638.4字节/S。</p>

<p></p>

<p><strong>3.结论</strong></p>

<p>可以看出来,写Flash最花时间是在校验上,如果可以自己写一个文件管理系统,那么就可以减少Flash写入的时间,从而达到数据管理最高效!</p>

okhxyyo 发表于 2020-12-21 14:37

<p><strong><a href="https://bbs.eeworld.com.cn/thread-1143018-1-1.html" target="_blank">雅特力AT-START-F403A测评</a></strong></p>

<p>汇总贴:<a href="https://bbs.eeworld.com.cn/thread-1143018-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1143018-1-1.html</a></p>

freebsder 发表于 2020-12-14 20:54

<p>谢谢分享,测量的时间很精确啊。</p>

w494143467 发表于 2020-12-14 21:23

freebsder 发表于 2020-12-14 20:54
谢谢分享,测量的时间很精确啊。

<p>用芯片自己的定时器会更精确呢!</p>

freebsder 发表于 2020-12-15 18:19

w494143467 发表于 2020-12-14 21:23
用芯片自己的定时器会更精确呢!

<p>flash写毕竟是偶发操作,能符合手册给的指标的80%我觉得就够了。写flash快3,5ms不影响使用。</p>

w494143467 发表于 2020-12-15 20:31

freebsder 发表于 2020-12-15 18:19
flash写毕竟是偶发操作,能符合手册给的指标的80%我觉得就够了。写flash快3,5ms不影响使用。

<p>也是哈!</p>

freebsder 发表于 2020-12-16 21:14

w494143467 发表于 2020-12-15 20:31
也是哈!

<p>读速度可以试试和手册比较。</p>
页: [1]
查看完整版本: 【AT-START-F403A测评】Part6:片上Flash性能测试