aple0807 发表于 2021-1-26 20:43

【AT-START-F407测评】+SPIM测试

SPIM是AT32的特色之一了,其他MCU厂商带SPIM主机的MCU基本都是几十大洋的高端控制器。

AT32的SPIM外频时钟是固定的1/2 HCLK,用SPIM的话MCU必须降频使用,本次测试MCU主频为168MHz,SPIM外频84MHz。

模块初始化直接使用官网配置:

void FLASH_InitExtFlash(void)
{
GPIO_InitType GPIO_InitStructure;

/* Enable ext.flash GPIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO|RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_GPIOB, ENABLE);

/* Configure ext.flash pin */
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_8;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_1|GPIO_Pins_6|GPIO_Pins_7|GPIO_Pins_10|GPIO_Pins_11;
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* Select PB10, PB11 as SPIF_TX and SPIF_RX */
GPIO_PinsRemapConfig(GPIO_Remap_EXT_FLASH, ENABLE);
GPIO_PinsRemapConfig(AFIO_MAP7_SPIF_1001, ENABLE);

/* In this example, use on-board EN25QH128A as ext.flash */
FLASH->B3SEL = FLASH_SPIM_TYPE2;

/* Unlock the ext.flash program erase controller */
while (BIT_READ(FLASH->STS3, FLASH_STS_BSY));
FLASH->FCKEY3 = FLASH_KEY1;
FLASH->FCKEY3 = FLASH_KEY2;
while (BIT_READ(FLASH->CTRL3, FLASH_CTRL_LCK));

/* If the data written to ext.flash need to be scrambled, please specify the scrambled range */
FLASH->DA = 0;

return;
}

测试代码
{
    FLASH_InitExtFlash();
   
    FLASH_UnlockBank3();
   
    //erase all
    tick_start = sys_st.u_tick;   
    FLASH_EraseBank3AllPages();
    sys_st.spim.erase_time = sys_st.u_tick - tick_start;
   
    //program
    tick_start = sys_st.u_tick;
    dat = 0;
    for(addr=0x8400000; addr < ( 0x8400000 + 16 * 1024 *1024) ; addr+=4)
    {
      FLASH_ProgramWord(addr, dat++);
    }
    sys_st.spim.program_time = sys_st.u_tick - tick_start;
   
    //read
    tick_start = sys_st.u_tick;
    for(addr=0x8400000; addr < ( 0x8400000 + 16 * 1024 *1024) ; addr+=4)
    {
      rdat = *((volatile uint32_t *)addr);
    }
    sys_st.spim.read_time = sys_st.u_tick - tick_start;
   
    FLASH_LockBank3();
}测试结果:
全片擦除:58.311s
全片编程:35.425s
全片读取:1.941s

擦除和编程时间受flash芯片本身特性影响比较大,外部flash主要用于存储历史记录,GUI数据等,读取速度是最重要的参数。

板载flash为16MB, 平均8MB/s, 速度相当快。
本测试带操作系统测试,测试任务设置为低优先级,其他高优先级任务无任务阻塞代码,测试速度应该是比较接近实际应用的,裸机单独读取速度应该高于本测试速度。



ugugghghghg 发表于 2021-2-3 19:32

有没有完整的驱动代码?能发我一份吗?

aple0807 发表于 2021-2-4 14:35

ugugghghghg 发表于 2021-2-3 19:32
有没有完整的驱动代码?能发我一份吗?

上面的就是完整的,第一段为配置,用来开启SPIM模块。第二段是应用,访问SPIM和访问内部flash的方法实际是一样的,只是写入时调用的函数名不同。

aple0807 发表于 2021-2-4 14:37

ugugghghghg 发表于 2021-2-3 19:32
有没有完整的驱动代码?能发我一份吗?

另外,开启SPIM模块时,主频不能太高,最好限定再192以内。外频是主频的1/2,速度太高信号不稳定。

里面有晴雨 发表于 2021-2-5 09:12

代码写的很整齐,太好了。不错的。
页: [1]
查看完整版本: 【AT-START-F407测评】+SPIM测试