[AT32F407] 【AT-START-F407测评】+SPIM接口外扩闪存

[复制链接]
 楼主| yinwuqing110 发表于 2023-1-7 22:29 | 显示全部楼层 |阅读模式
#申请原创# 前段时间感染新冠了,现在仍咳嗽不止,今天周末来分享一下最近使用AT-START-F407开发板的体验。关于AT-START-F407开发板,我们从官方的资料可知板载AT32F407VGT7微控制器是一个带有FPU内核的ARM Cortex® -M4F,32位处理器,内建1024 K字节的闪存存储器,96+128K字节的SRAM,LQFP100封装。板载AT-Link接口,可用板载AT-Link-EZ来编程和调试。板卡集成16M字节SPI闪存EN25QH128A作为扩充的闪存存储器区块3(Bank 3)使用。开发板的硬件框图如下:
硬件框图.png
      通过SPIM接口使用闪存存储器区块3时,JP8连体跳线须选择左侧SPIM端,此时PB1,PA8,PB10,PB11,PB6,和PB7没有连接到外部的I/O口扩展接口,也不能正常使用以太网MAC功能了,这点感觉有点差异,做网关项目能离开大容量存储?我司采用的NXP-K64开发的Zigbee网关方案,是采用外部存储设备、用户信息,并不影响以太网功能,采用的8M外部存储芯片原理图如下:
K64方案上的外部存储.png
        AT-START-F407开发板上与外部存储芯片U4连接的原理图如下:
SPIM接口原理图.png
        AT-START-F407开发板的正面点位图如下:
点位图.png
      从点位图可知,启动模式选择跳线处印有BOOT0、BOOT1的标识。在启动时,通过对启动引脚配置可以选择三种启动模式中的一种。
启动模式设置.png
      官方提供的SDK中有提供基于IAR,Keil的例程,本人习惯于Keil开发平台,在此之前,我们需要先将基于AT-START-F407的pack包安装到Keil中,雅特力官方已经提供,这里分享一下。
ArteryTek.AT32F403A_407_DFP.2.1.3.zip (348.27 KB, 下载次数: 6)
      安装好pack支持包后,我们将下载好的“AT32F403A_407_Firmware_Library_V2.1.3.zip”解压出来,进入到“\project\at_start_f407\examples\flash”路径下,这四个工程都是关于flash操作的,没有工程中都写有“readme.txt”文档,文件结构很是规范,这里我们关注一下“operate_spim”工程。在这个工程中实现了对外部存储EN25QH128A的擦除,读写一个扇区的检测,成功则串口打印读写地址,三颗指示灯流水闪烁。部分代码展示:
  1. #include "at32f403a_407_board.h"
  2. #include "at32f403a_407_clock.h"
  3. #include "operate_spim.h"

  4. int main(void)
  5. {
  6.   system_clock_config();

  7.   uart_print_init(115200);
  8.        
  9.   at32_board_init();

  10.   spim_operate();

  11.   while(1)
  12.   {
  13.   }
  14. }
  1. #include "at32f403a_407_board.h"
  2. #include "operate_spim.h"
  3. #include <string.h>

  4. uint8_t write_buffer[4096];  /* the content writed to spim flash */
  5. uint8_t read_buffer[4096];   /* the content read from spim flash */

  6. void spim_init(void)
  7. {
  8.   gpio_init_type gpio_init_struct;

  9.   crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
  10.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  11.   crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);

  12.   gpio_default_para_init(&gpio_init_struct);
  13.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  14.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  15.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  16.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  17.   gpio_init_struct.gpio_pins = GPIO_PINS_8;
  18.   gpio_init(GPIOA, &gpio_init_struct);
  19.   gpio_init_struct.gpio_pins = GPIO_PINS_1 | GPIO_PINS_6 | GPIO_PINS_7 | GPIO_PINS_10 | GPIO_PINS_11;
  20.   gpio_init(GPIOB, &gpio_init_struct);

  21.   gpio_pin_remap_config(EXT_SPIM_GMUX_1001, TRUE);
  22.   flash_spim_model_select(FLASH_SPIM_MODEL2);

  23.   while(flash_flag_get(FLASH_SPIM_OBF_FLAG));
  24.   flash_spim_unlock();
  25.   while(FLASH->ctrl3_bit.oplk);

  26.   flash_spim_encryption_range_set(0);
  27.   return;
  28. }

  29. void sector_read(uint32_t address, uint32_t sector_size, uint8_t *buf)
  30. {
  31.   while(sector_size)
  32.   {
  33.     *(uint32_t *)buf = *(uint32_t *)address;
  34.     sector_size -= sizeof(uint32_t);
  35.     address += sizeof(uint32_t);
  36.     buf += sizeof(uint32_t);
  37.   }
  38. }

  39. void spim_operate(void)
  40. {
  41.   uint16_t i = 0;
  42.   flash_status_type status = FLASH_OPERATE_DONE;

  43.   spim_init();

  44.   for(i = 0; i < SPIM_SECTOR_SIZE; i++)
  45.   {
  46.     write_buffer[i] = i % 256;
  47.   }

  48.   status = flash_operation_wait_for(ERASE_TIMEOUT);

  49.   if((status == FLASH_PROGRAM_ERROR) || (status == FLASH_EPP_ERROR))
  50.     flash_flag_clear(FLASH_PRGMERR_FLAG | FLASH_EPPERR_FLAG);
  51.   else if(status == FLASH_OPERATE_TIMEOUT)
  52.   {
       编译完成后,将Micro USB数据线连接开发板的CN6接口,数据线的USB口连接PC端,此时打开PC中的串口助手,选择识别到的串口号,波特率设置成代码中指定的115200,Keil中选择CMSIS-DAP Debugger方式。
选择下载调试方式.png
识别到下载目标.png
       下载完后,按一下RESET键,重启开发板,开发板与PC端的串口助手中呈现的效果如下图所示:
现象.gif
写闪存.gif
        此次SPIM外部存储操作体验就此告一段落,使用AT-START-F407开发板感觉下载调试很方便,虽然提供了JTAG接口,但有了AT-Link-EZ完全够用平时的下载调试需求了,能使用AT32F403CGT6作为AT-Link-EZ的MCU,值的点赞。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

106

主题

1096

帖子

7

粉丝
快速回复 返回顶部 返回列表