【STM32F4如何通过FPGA扩展IO口】

STM32F4如何通过FPGA扩展IO口

作者:bighard51(liuqf78@163.com),2021.10

1 接口电路

在这里插入图片描述
STM32F4与FPGA之间通过FSMC总线进行双向通信,通过FPGA实现IO口扩展。本例中FPGA无地址输入信号,数据线AD0-AD15为地址数据复用总线,地址信号可通过地址锁存信号NADV的上升沿,锁存AD总线获得。本例中STM32F4可扩展输出16个输出口F_OUT0:F_OUT15和16个输入口F_IN0:F_IN15。
假定STM32F4的片选NE1的地址为0x60000000,则本程序扩展的输出口F_OUT0:F_OUT15对应的访问地址为:0x60000000 +0x02,即0x60000002,0x02为程序偏址,0x60000000为片选NE1的基址。地址0x60000002寄存器的bit0对应于F_OUT0输出口,0x60000002的bit1对应于F_OUT1输出口,直至0x60000002的bit15对应于F_OUT15输出口。因此程序:
要使F_OUT0=1,其它输出口为0,则需要写*(u16*)(0x60000002) = 0x0001;
要使F_OUT1=1,其它输出口为0,则需要写*(u16*)(0x60000002) = 0x0002;
要使F_OUT2=1,其它输出口为0,则需要写*(u16*)(0x60000002) = 0x0004;
要使F_OUT3=1,其它输出口为0,则需要写*(u16*)(0x60000002) = 0x0008;
……
要使F_OUT15=1,其它输出口为0,则需要写*(u16*)(0x60000002) = 0x8000;
要使F_OUT0=F_OUT1=1,其它为0,则需要写*(u16*)(0x60000002) = 0x0003;
要使F_OUT14=F_OUT15=1,其它为0,则需要写*(u16*)(0x60000002) = 0xC000;
其它类似,也即寄存器0x60000002的每一位对应一个输出口。
同理,本程序的输入口F_IN0:F_IN15对应的访问地址为:
0x60000000 +0x00,即0x60000000,0x00为程序偏址,0x60000000为片选NE1的基址。地址0x60000000寄存器的bit0对应于F_IN0输入口,0x60000000的bit1对应于F_IN1输入口,直至0x60000000的bit15对应于F_IN15输入口。因此程序:
Io_status= (u16)(0x60000000) ;执行完后,变量Io_status即为F_IN0:F_IN15的输入电平状态,也即:
若Io_status=1,则代表F_IN0为高电平,其它输入口为低电平;
若Io_status=2,则代表F_IN1为高电平,其它输入口为低电平;
若Io_status=4,则代表F_IN2为高电平,其它输入口为低电平;
……
若Io_status=0x4000,则代表F_IN14为高电平,其它输入口为低电平;
若Io_status=0x8000,则代表F_IN15为高电平,其它输入口为低电平;
若Io_status=0x0003,则代表F_IN0与F_IN1为高电平,其它输入口为低电平;
若Io_status=0xc000,则代表F_IN14与F_IN15为高电平,其它输入口为低电平;

本例中,为了测试方便,新增了0x60000000 +0x02寄存器,读取它时可得到0x1234,具体为test_status= (u16)(0x60000002),读到的结果为test_status=0x1234

2 信号说明

在这里插入图片描述

3 原理图说明

在这里插入图片描述

4 STM32F4与FPGA接口时序说明

在这里插入图片描述
本例中,要求ADDSET=ADDHLD>18ns,DATAST>42ns,此要求主要是因为同步时钟设计对接口时序的要求。
(2):读时序要求
在这里插入图片描述
ADDSET=ADDHLD>18ns,DATAST>42ns,此要求主要是因为同步时钟设计对接口时序的要求。
(3)程序代码时序配置,参见FPGA_init(void)函数
static void FPGA_Init(void)
{
FMC_NORSRAMInitTypeDef FMC_NORSRAMInitStructure;
FMC_NORSRAMTimingInitTypeDef p;

p.FMC_AddressSetupTime = 3; //16 //51
p.FMC_AddressHoldTime = 3; //6 //0
p.FMC_DataSetupTime = 5; //15 //3
p.FMC_BusTurnAroundDuration = 2;
p.FMC_CLKDivision = 0;
p.FMC_DataLatency = 0;
p.FMC_AccessMode = FMC_AccessMode_D;

5 STM32F4程序说明

需设置NE1片选及总线功能
修改fmc_mem.c文件:主要是:
(1) 配置相应的管脚为FMC功能管脚:对应函数名为static void FMC_GPIOConfig(void);
(2) 配置片选NE1为16位地址复用总线,对应的函数名为static void FPGA_Init(void);
具体文件可参考:
相关代码请写e-mail索取liuqf78@163.com

6 FPGA程序说明

本例程基于基于LATTICE的LCMXO2-4000HC-4TG144C设计完成,主要有三个文件:
(1)you_ale_sample.v为地址译码文件,通过ALE锁存地址复用总线,获得地址线;
(2)you_decoder.v为扩展输入输出口译码电路,用于实现IO扩展;
(3)you_top.v为顶层文件;
(4)you_tb_top.v为测试代码
相关代码请写e-mail索取liuqf78@163.com

7 程序仿真说明

(1) 先向0x60000000写入0x55aa,此时F_OUT应该也输出0x55aa,由于是16位总线,因此实际写是,偏址为2 x 0=0;
(2) 再向0x60000002写入0x66bb,此时F_OUT应该也输出0x66bb,由于是16位总线,因此实际写是,偏址为2 /1=1;
(3) 初始化f_in =16’h55aa;
(4) 读取0x60000000地址值于d_in,由于F_IN对应的地址为0x60000000,因此F_IN的值将给d_in,即d_in=0x55aa;
(5) 读取0x60000002地址值于d_in,由于地址0x60000002寄存器值为0x1234,因此d_in=0x1234;
(6)两个写入仿真波形如下:
在这里插入图片描述
在这里插入图片描述
可以看出,则nwe上升沿时,f_out分别输出0x55aa和0x66bb,与仿真设定一致;
(6) 两个读入仿真波形如下:
在这里插入图片描述
可以看出,则noe上升沿时,d_in分别输出0x55aa和0x66bb,与仿真设定一致,d_in分别输出f_in的值0x55aa和0x1234;

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值