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, 速度相当快。
本测试带操作系统测试,测试任务设置为低优先级,其他高优先级任务无任务阻塞代码,测试速度应该是比较接近实际应用的,裸机单独读取速度应该高于本测试速度。
|