目录

银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2020-07-10 gingko 初次建立

实验二十八:FSMC实验——文读写FPGA

一、 实验目的与意义

  1. 了解STM32 FSMC结构。
  2. 了解STM32 FSMC特征。
  3. 掌握FSMC的使用方法。
  4. 掌握STM32 HAL库中FSMC属性的配置方法。
  5. 掌握KEIL MDK 集成开发环境使用方法。

二、 实验设备及平台

  1. iCore4 双核心板点击购买
  2. JLINK(或相同功能)仿真器点击购买
  3. Micro USB线缆。
  4. USB-Blaster 和USB线。
  5. Keil MDK 开发平台。
  6. STM32CubeMX开发平台。
  7. 装有WIN XP(及更高版本)系统的计算机。

三、 实验原理

1、FSMC简介

2、FMC主要特性

3、FMC框图

4、FPGA简介

5、原理图

四、 实验程序

1、主函数

int main(void)
{
    int i;
  /* MCU 配置 */
  /* 重置所有外设,初始化Flash接口和 Systick. */
  HAL_Init();
  /* 配置系统时钟 */
  SystemClock_Config();
  /* 初始化所有已配置的外设 */
  MX_GPIO_Init();
  MX_FMC_Init();
  //向FPGA RAM中写入数据
  for(i = 0;i < 512;i ++){
      fpga_write(i, 2 * i); 
    }
    //从FPGA RAM中读取数据
    for(i = 0;i < 512;i ++){
        if(fpga_read(i) != 2*i){
            while(1){
                LED_RED_ON;
                HAL_Delay(500);
                LED_RED_OFF;
                HAL_Delay(500);
            }
        }
    }
    //测试成功
  LED_GREEN_ON;
 
  while (1)
  {
        //通过映射寄存器来控制FPGA三色LED循环点亮
        FPGA_LED_RED_ON;
        FPGA_LED_GREEN_OFF;
        FPGA_LED_BLUE_OFF;
        HAL_Delay(500);
 
        FPGA_LED_RED_OFF;
        FPGA_LED_GREEN_ON;
        FPGA_LED_BLUE_OFF;
        HAL_Delay(500);
 
        FPGA_LED_RED_OFF;
        FPGA_LED_GREEN_OFF;
        FPGA_LED_BLUE_ON;
        HAL_Delay(500);
  }
}
 
 

2、FMC初始化

void MX_FMC_Init(void)
{
  FMC_NORSRAM_TimingTypeDef Timing;
  /** 执行NOR1存储器初始化序列*/
  hnor1.Instance = FMC_NORSRAM_DEVICE;
  hnor1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  /* hnor1.Init */
  hnor1.Init.NSBank = FMC_NORSRAM_BANK1; //指定将使用的NORSRAM存储设备。
  hnor1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_ENABLE;  
//指定地址和数据值在数据总线上多路复用
  hnor1.Init.MemoryType = FMC_MEMORY_TYPE_NOR; //外部存储器的类型。
  hnor1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16; 
//外部存储设备的宽度
  hnor1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
//禁用闪存的突发访问模式
  hnor1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
//等待信号极性
  hnor1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS; //FMC等待时间
  hnor1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;// FMC写操作使能
  hnor1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;// 禁用FMC等待信号
  hnor1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;// 禁用FMC扩展模式
  hnor1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
// 禁止FMC异步等待
  hnor1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;// FMC禁止写突发
  hnor1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;
// FMC连续时钟
  hnor1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE; //FMC写FIFO
  hnor1.Init.PageSize = FMC_PAGE_SIZE_NONE; //FMC页大小
  /* Timing */
  Timing.AddressSetupTime = 7;
  Timing.AddressHoldTime = 1;
  Timing.DataSetupTime = 6;
  Timing.BusTurnAroundDuration = 0;
  Timing.CLKDivision = 0;
  Timing.DataLatency = 0;
  Timing.AccessMode = FMC_ACCESS_MODE_A;
  /* ExtTiming */
  if (HAL_NOR_Init(&hnor1, &Timing, NULL) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}
 

3、FMC宏定义

#define fpga_write(offset,data)    *((volatile unsigned short int *)(0x60000000 + (offset << 1))) = data
#define fpga_read(offset)  *((volatile unsigned short int *)(0x60000000 + (offset << 1)))
 
//FPGA三色LED控制寄存器地址
#define FPGA_LED_RED    10
#define FPGA_LED_GREEN  11
#define FPGA_LED_BLUE   12
 
//控制寄存器值
#define ON  0    //点亮相应LED
#define OFF 1    //关闭相应LED
 
//ARM控制LED命令
#define FPGA_LED_RED_ON        fpga_write(FPGA_LED_RED,ON)
#define FPGA_LED_RED_OFF       fpga_write(FPGA_LED_RED,OFF)
 
#define FPGA_LED_GREEN_ON      fpga_write(FPGA_LED_GREEN,ON)
#define FPGA_LED_GREEN_OFF     fpga_write(FPGA_LED_GREEN,OFF)
 
#define FPGA_LED_BLUE_ON       fpga_write(FPGA_LED_BLUE,ON)
#define FPGA_LED_BLUE_OFF      fpga_write(FPGA_LED_BLUE,OFF)
 
 

五、 实验步骤

  1. 把仿真器与iCore4的SWD调试口相连(直接相连或者通过转接器相连);
  2. 将USB-Blaster与iCore4的JTAG调试口相连;
  3. 将跳线帽插到USB UART;
  4. 把iCore4(USB UART)通过Micro USB线与计算机相连,为iCore4供电;
  5. 打开Quartus II开发环境,打开本实验工程;
  6. 烧写程序到iCore4上;
  7. 打开Keil MDK 开发环境,并打开本实验工程;
  8. 烧写程序到iCore4上;
  9. 也可以进入Debug模式,单步运行或设置断点验证程序逻辑。

六、 实验现象

  1. 先烧写FPGA程序,再烧写ARM程序,ARM程序烧写完毕后即开始读写测试,测试成功,绿色ARM·LED常亮,测试失败,红色ARM·LED闪烁。
  2. 测试成功,ARM通过映射寄存器来控制FPGA三色LED循环点亮。