打印
[AT32F407]

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

[复制链接]
829|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 数码小叶 于 2021-2-3 13:56 编辑

第一次使用雅特力的单片机,资料和板卡给人的感觉就是颜色很多彩,看着比较舒服

在众多功能里,都是比较熟悉的,第一个想试的的就是SPIM,在参考手册里找到了这个的介绍“SPIM = 外部 SPI Flash memory 扩展(程序执行/数据储存/程序与数据可加密)。”     这就很容易理解了就是SPI口扩展,“透过 SPIM 传输接口控制外部 SPI 闪存 (bank3),读写最大容量16M 字节,操作方式和第一片闪存(bank1)及第二片闪存(bank2)相同” 这个特性也简化统一了外扩Flash操作。但是再往下看,却和想的又不太一样。查看ATF407的时钟树,发现SPIM是有独立时钟的,挂载在了AHB上,所以并不能简单地去等效SPI口接一个外部Flash


AT-START-F407开发板上,板载的是一颗EN25QH128

spi Flash芯片用的最多的是W25Qxxx,这个型号倒是第一次见到,就想对比下参数。
对于比较常用的W25Q128,在接口上两者完全兼容,都支持标准SPI, Dual SPI, Quad SPI,在SPI时钟速率上,W25Q比EN25Q要高,但是还是要看擦除和写入时间,
对于W25Q128的主要操作时间



对于EN25QH128的主要操作时间

可见W25Q在速度上略快一点。
查看原理图,EN25Q采用的是 Quad SPI,



通过JP8跳线帽,选择连接Flash还是普通IO口


板子连接上电脑后,会自动安装驱动,同时三个led开始一次交替闪烁


本以为不用手动安装了,看来还是需要手动操作一下啊


固件包里居然找到了三个驱动,除了命名不一样,不知道区别在哪
安装了其中两个,也没啥区别,除了串口名字不一样



测试了下载和仿真,都正常,那就不纠结差异了。就是下载的时候,调试器选择的是CMSIS-DAP


测试SPIM一般都是写入一串数据,再读出来,两数据进行对比,在at32f4xx_flash.c、at32f4xx_flash.h文件里提供了相关的操作函数,既然是扩展为BANK3,那应该就可以像操作内部flash一样直接操作。
准备利用RTC来测试下时间参数了,但是在在库文件里查看RTC的结构体定义,并未有亚秒级的定义


数值获取也是通过计算的方式
temp=timecount%86400;             
calendar.hour=temp/3600;
calendar.min=(temp%3600)/60;
calendar.sec=(temp%3600)%60;
再细看了下参考手册,ATF407的RTC模块确实很简陋,没有32哪些复杂的时钟寄存器,更像是一个简单的定时器,通过更改RTC 预分频装载寄存器低位(RTC_DIVL)值,可以产生不同是时长中断。所以可以人为的实现亚秒级定义扩展,但是打破秒定时时长,整个逻辑就乱了,那还不如直接使用一个普通定时器。

那就先测试下整片的擦除时间、写入以及读出功能吧,at32f4xx_flash.h文件里封装了bank3的整体擦除函数
        printf("Bank3 erase start:");
        RTC_Get();
        printf("%d/%d/%d ", calendar.w_year, calendar.w_month, calendar.w_date);
        printf("%02d:%02d:%02d ", calendar.hour, calendar.min, calendar.sec);
               
        FLASH_EraseBank3AllPages( );
        
        RTC_Get();        
        printf("\r\n%d/%d/%d ", calendar.w_year, calendar.w_month, calendar.w_date);
        printf("%02d:%02d:%02d ", calendar.hour, calendar.min, calendar.sec);        
        printf("Bank3 erase end\r\n");


再验证读写,可以参考给的读写例程,赋值一个数组,写满一个段,再读出整个段
for(i=0;i<SPIM_PAGE_SIZE;i++)
  {
    if(ReadBuffer[i]!=0xff)
    {
      printf("operate SPIM fail.\r\n");
      return;
    }   
  }
  
  printf("write one page.\r\n");
  i=0;
  while(i<SPIM_PAGE_SIZE)
  {
    FLASH_ProgramWord (SPIM_TEST_ADDR+i,*(u32 *)(WriteBuffer+i));
    i=i+4;  
  }
  
  printf("read one page.\r\n");
  memset(ReadBuffer,0,SPIM_PAGE_SIZE);
  ReadPage(SPIM_TEST_ADDR, SPIM_PAGE_SIZE, ReadBuffer);
  
  printf("compare the WriteBuffer/ReadBuffer.\r\n");
  for(i=0;i<SPIM_PAGE_SIZE;i++)
  {
    if(ReadBuffer[i]!=WriteBuffer[i])
    {
      printf("test SPIM fail.\r\n");
      return;
    }   
  }

  printf("test SPIM success!\r\n");

最后通过串口,显示测试结果



整片擦除耗时54s,介于45s和140s中间。读写测试也通过。
通篇操作体验下来,可以看出,因为兼容xxx单片机,所以上手真的很快,不用涉及什么环境搭建一类的,包括keil的使用,printf的重定向等都是轻车熟路的操作步骤。






使用特权

评论回复
沙发
ugugghghghg| | 2021-2-4 16:25 | 只看该作者
这个写不进去是什么问题呢?

使用特权

评论回复
板凳
caizhiwei| | 2021-2-4 20:53 | 只看该作者
SPIM_TEST_ADDR 这个宏定义是多少呀

使用特权

评论回复
地板
数码小叶|  楼主 | 2021-2-4 21:18 | 只看该作者
ugugghghghg 发表于 2021-2-4 16:25
这个写不进去是什么问题呢?

什么写不进去?

使用特权

评论回复
5
数码小叶|  楼主 | 2021-2-4 21:22 | 只看该作者
caizhiwei 发表于 2021-2-4 20:53
SPIM_TEST_ADDR 这个宏定义是多少呀

0x8400000

使用特权

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

本版积分规则

103

主题

2536

帖子

19

粉丝