打印
[活动专区]

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

[复制链接]
653|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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,速度太高信号不稳定。

使用特权

评论回复
评论
muyichuan2012 2021-2-4 14:51 回复TA
是的 ,毕竟SPIM是外接falsh,IO太快,电路可能会有干扰。 
5
里面有晴雨| | 2021-2-5 09:12 | 只看该作者
代码写的很整齐,太好了。不错的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

328

帖子

2

粉丝