[活动专区] 【AT-START-F407测评】+SPIM测试

[复制链接]
901|5
 楼主| aple0807 发表于 2021-1-26 20:43 | 显示全部楼层 |阅读模式
SPIM是AT32的特色之一了,其他MCU厂商带SPIM主机的MCU基本都是几十大洋的高端控制器。

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

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

  1. void FLASH_InitExtFlash(void)
  2. {
  3.   GPIO_InitType GPIO_InitStructure;
  4.   
  5.   /* Enable ext.flash GPIO clock */
  6.   RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO|RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_GPIOB, ENABLE);
  7.   
  8.   /* Configure ext.flash pin */
  9.   GPIO_StructInit(&GPIO_InitStructure);
  10.   GPIO_InitStructure.GPIO_Pins = GPIO_Pins_8;
  11.   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  12.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  13.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  14.   GPIO_InitStructure.GPIO_Pins = GPIO_Pins_1|GPIO_Pins_6|GPIO_Pins_7|GPIO_Pins_10|GPIO_Pins_11;
  15.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  16.   
  17.   /* Select PB10, PB11 as SPIF_TX and SPIF_RX */
  18.   GPIO_PinsRemapConfig(GPIO_Remap_EXT_FLASH, ENABLE);
  19.   GPIO_PinsRemapConfig(AFIO_MAP7_SPIF_1001, ENABLE);
  20.   
  21.   /* In this example, use on-board EN25QH128A as ext.flash */
  22.   FLASH->B3SEL = FLASH_SPIM_TYPE2;
  23.   
  24.   /* Unlock the ext.flash program erase controller */  
  25.   while (BIT_READ(FLASH->STS3, FLASH_STS_BSY));
  26.   FLASH->FCKEY3 = FLASH_KEY1;
  27.   FLASH->FCKEY3 = FLASH_KEY2;
  28.   while (BIT_READ(FLASH->CTRL3, FLASH_CTRL_LCK));
  29.   
  30.   /* If the data written to ext.flash need to be scrambled, please specify the scrambled range */
  31.   FLASH->DA = 0;
  32.   
  33.   return;
  34. }


测试代码
  1. {
  2.     FLASH_InitExtFlash();
  3.    
  4.     FLASH_UnlockBank3();
  5.    
  6.     //erase all
  7.     tick_start = sys_st.u_tick;   
  8.     FLASH_EraseBank3AllPages();
  9.     sys_st.spim.erase_time = sys_st.u_tick - tick_start;
  10.    
  11.     //program
  12.     tick_start = sys_st.u_tick;
  13.     dat = 0;
  14.     for(addr=0x8400000; addr < ( 0x8400000 + 16 * 1024 *1024) ; addr+=4)
  15.     {
  16.         FLASH_ProgramWord(addr, dat++);
  17.     }
  18.     sys_st.spim.program_time = sys_st.u_tick - tick_start;
  19.    
  20.     //read
  21.     tick_start = sys_st.u_tick;
  22.     for(addr=0x8400000; addr < ( 0x8400000 + 16 * 1024 *1024) ; addr+=4)
  23.     {
  24.         rdat = *((volatile uint32_t *)addr);
  25.     }
  26.     sys_st.spim.read_time = sys_st.u_tick - tick_start;
  27.    
  28.     FLASH_LockBank3();  
  29. }
测试结果:
全片擦除:58.311s
全片编程:35.425s
全片读取:1.941s

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

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


spim_test.png
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,速度太高信号不稳定。

评论

是的 ,毕竟SPIM是外接falsh,IO太快,电路可能会有干扰。  发表于 2021-2-4 14:51
里面有晴雨 发表于 2021-2-5 09:12 | 显示全部楼层
代码写的很整齐,太好了。不错的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

326

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部