硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6578|回复: 43
收起左侧

[FMC] 【已更新】STM32H7使用FMC扩展32路高速IO教程(2019-03-15)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-3-12 02:57:08 | 显示全部楼层 |阅读模式
说明:
1、先说下为什么要做高速IO扩展,因为V7板子(H743XIH6,240脚)使用了32位SDRAM和RGB888硬件接口,消耗IO巨大,虽然比V6的F429BIT6 208脚多些,但是新增了QSPI等器件。
所以继续做IO扩展,通过FMC扩展出32路高速IO。
2、对于扩展的IO,使用非常方便,用户仅需配置好FMC后,32路IO就可以随意使用,即使FMC外接的SDRAM在高速通信中。平时通过扩IO翻转测试个执行时间什么的,也非常方便,且可以同时测试多路。
3、扩展IO的方案很多,比如串行转并的595方案,缺点是速度慢;专用的数字IC,DRV8860,缺点是价格贵;使用便宜的F0,ST的综合板喜欢这么干。

V7的IO扩展与V6的IO扩展略有不同,下面逐一做个说明。

第1步,先来看FMC的块区分配

FMC总线可操作的地址范围0x60000000到0xDFFFFFFF,具体的框图如下:
1.png

从上面的框图可以看出,NOR/PSRAM/SRAM块区有4个片选NE1,NE2,NE3和NE4,但由于引脚复用,部分片选对应的引脚要用于其他功能,而且要控制的总线外设较多,导致片选不够用。因此需要增加译码器。


第2步,增加译码器及其地址计算
有了前面的认识之后再来看下面的译码器电路:
2.png

SN74LVC1G139APWR是双2-4线地址译码器。也就是带了两个译码器。原理图上仅用了一个。下面是139的真值表和引脚功能:
3.jpg
4.jpg
通过上面的原理图和真值表就比较好理解了,真值表的输出是由片选FMC_NE1和地址线FMC_A10、FMC_A11控制。
FMC_NE1 输出低电平:
-->FMC_A11(B),FMC_A10(A) = 00时,1Y0输出的低电平,选择的是OLED。
-->FMC_A11(B),FMC_A10(A) = 01时,1Y1输出的低电平,选择的是74HC574。
-->FMC_A11(B),FMC_A10(A) = 10时,1Y2输出的低电平,选择的是DM9000。
-->FMC_A11(B),FMC_A10(A) = 11时,1Y3输出的低电平,选择的是AD7606。

然后我们再计算译码器的地址,注意,这里地址的计算都是按照FMC的32bit访问模式计算的,因为我们的V7程序中是将NE1对应的FMC配置为32bit模式了。

具体FMC的32bit访问模式,16bit访问模式和8bit访问模式的区别就在这里:


32bit模式下,我们计算A10和A11的时候,实际上需要按HADDR12和HADDR13计算的。
如果来算NE2 + HADDR12 + HADDR13的四种组合地址就是如下:
NE1 + HADDR13 + HADDR12 = 0x6000000 +  0<<13 + 0<<12 = 0x60000000
NE1 + HADDR13 + HADDR12 = 0x6000000 +  0<<13 + 1<<12 = 0x60001000
NE1 + HADDR13 + HADDR12 = 0x6000000 +  1<<13 + 0<<12 = 0x60002000
NE1 + HADDR13 + HADDR12 = 0x6000000 +  1<<13 + 1<<12 = 0x60003000
这样一来,原理图里面给的地址就对应上了。同理如果配置为16位模式和8位模式,大家应该也都会计算了。


第3步,FMC的IO扩展部分
先来看下IO扩展的原理图实现,如果不太了解FMC的通信时序和数字逻辑芯片的使用,可能会比较懵,下面逐一为大家说明。
6.png

有了这个原理图,首先要做的就是了解74HC574和SN74HC02的功能。
74HC574是一款8位三态D触发器,起到锁存的功能,上升沿触发,对应的真值表如下(L表示低电平,H表示高电平,Z表示高阻):
7.jpg

SN74HC32是一款2输入或门,一个芯片带了四组或门,对应的真值表如下(L表示低电平,H表示高电平):
8.png

有了这个认识后,我们再来看FMC的配置,V7开发板的BSP驱动包里面专门做了一个IO扩展的FMC配置,即文件bsp_ext_io.c,配置方式是FMC_AccessMode_A,这种模式对应的写时序是:
9.png

那么问题来了,我们要实现的功能是通过FMC输出的数据要锁存在扩展IO的输出端,否则FMC时序信号消失了,扩展IO的输出数据也消失了,就起不到控制作用了。所以就用到74HC574的锁存功能,而锁存的实现需要一个上升沿触发,这个上升沿就是通过74HC02输出的。
  再结合上面FMC写时序图,在NE片选为低电平,NEW写使能信号为高电平期间,即地址建立时间段ADDSET内,74HC02是输出的低电平。进入到DATAST数据建立阶段,在NE片选为低电平,NEW写使能信号也为低电平时,74HC02输出高电平,正好是实现1个上升沿的变化,将数据总线上的数据锁存到74HC574的输出端了。这里隐含了一个知识点,数据还没有完全建立起来就锁存是不是会有问题。


第4步,时序配置
这里要补充两个重要的知识点,74HC574的CP端接收到上升沿触发到Qn输出的时间参数:
10.png
11.png
通过时序图和对应的参数要了解到以下几点:
-->tpd传输延迟在这里等效于tPHL和tPLH。
-->V7开发板的74HC574有两片是3.3V供电,另外两片是5V供电。参数表格里面没有给3.3V供电时的参数,也没有最小值。

了解了74HC574,再来看SN74HC02:
13.png
14.png
通过时序图和对应的参数要了解到以下几点:
-->tpd传输延迟在这里等效于tPHL和tPLH。
-->tt过渡时间等效于tr上升沿时间和tf下降沿时间
-->V7开发板的74HC574有两片是3.3V供电,另外两片是5V供电。参数表格里面没有给3.3V和5V供电时的参数,也没有最小值。
        
对应74HC574和74HC02的时序参数有个了解后,再来看第3步末尾的问题:


  当写使能信号NEW出现下降沿后,74H02或非门就会输出一个上升沿,然后出发74HC574做锁存。此时我们要考虑到一个重要的知识点,就是使用的数字逻辑芯片有个传输延迟问题,也就是要我们要保证74HC02的tpd传输延迟时间 + 74HC02的tr传输延迟时间 + 74HC574的tpd传输延迟时间的这段时间内,数据总线上要有数据,所以保证DATAST数据建立时间够大就行,实际测试FMC频率在200MHz的情况下,2-3个FMC时钟周期就已经可以正常使用。
有了这些认识后,再来看FMC的时序配置就比较好理解了:
888.jpg


第5步,应用举例
配置完毕后,要操作那个IO就非常简单了,比如IO翻转
HC574_TogglePin(GPIO_PIN_23);
HC574_TogglePin(GPIO_PIN_20);
IO翻转10MHz,方波频率5MHz,效果如下:


为了帮助大家理解,再进一步的深入下,比如控制LED闪烁:
15.png
16.png

对地址0x64001000发送数据就可以了,但是如何对这个地址发送数据呢? 反映到C语言的实现上就是通过固定地址的指针变量(跟我们操作寄存器是一样的),即
#define  HC574_PORT     *(uint32_t *)0x64001000
如果要点亮LED1(低电平点亮),就是 HC574_PORT = 0x0000 0000
如果要熄灭LED1就是HC574_PORT = 0x0000 0100,即操作FMC_D8的高低电平即可。

总结:
关于IO扩展还有很多的方法,只是我们这里采用的是FMC总线扩展,主要是考虑到速度比较快。大家扩展的话可以使用595等串行转并行的数字逻辑芯片,或者直接用便宜些的MCU做扩展都是不错的选择。






回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-12 02:57:46 | 显示全部楼层
下面是V6的,也补上地址,方便对比:

【简易教程】关于采用F429的FMC总线实现IO扩展和采用32位总线方式时译码器的地址计
http://www.armbbs.cn/forum.php?m ... 6290&fromuid=58
(出处: 安富莱电子论坛)
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-3-12 09:45:10 | 显示全部楼层
这个是V7的图?
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-12 10:10:53 | 显示全部楼层
byccc 发表于 2019-3-12 09:45
这个是V7的图?

软件和硬件上都有些区别,一会我会更新下。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-3-12 10:18:27 | 显示全部楼层
请教一下,SN74HC02PW 与 SN74HC32PW 有那些不同啊 ??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-12 10:29:58 | 显示全部楼层
hpdell 发表于 2019-3-12 10:18
请教一下,SN74HC02PW 与 SN74HC32PW 有那些不同啊 ??

U21最好用74HC02或非门。V7 用74HC32不稳定。用74HC02没问题。
回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
发表于 2019-3-12 13:27:43 | 显示全部楼层
是因为FMC速度的200M太快了吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-12 13:36:17 | 显示全部楼层
dy84082666 发表于 2019-3-12 13:27
是因为FMC速度的200M太快了吗

影响不大,因为有个地址建立时间和数据建立时间,一般10个FMC时钟周期一次,速度就将到20MHz。

改成或非门后稳定些。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-12 13:36:59 | 显示全部楼层
byccc 发表于 2019-3-12 09:45
这个是V7的图?

是的。
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-3-12 13:57:01 | 显示全部楼层
或非的话,程序会有哪些区别?FMC
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-12 13:58:08 | 显示全部楼层
在水一方 发表于 2019-3-12 13:57
或非的话,程序会有哪些区别?FMC

程序没区别。
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-3-12 14:38:36 | 显示全部楼层
eric2013 发表于 2019-3-12 10:29
U21最好用74HC02或非门。V7 用74HC32不稳定。用74HC02没问题。

板载的更改了吗老大
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-12 14:40:08 | 显示全部楼层
sanit 发表于 2019-3-12 14:38
板载的更改了吗老大

改了,已经采用新设计了。
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-3-12 14:41:34 | 显示全部楼层
eric2013 发表于 2019-3-12 14:40
改了,已经采用新设计了。

好的,近2天下单。以表示支持安富莱,支持老大。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-12 15:00:37 | 显示全部楼层
sanit 发表于 2019-3-12 14:41
好的,近2天下单。以表示支持安富莱,支持老大。

感谢兄弟
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-3-12 15:38:47 | 显示全部楼层
eric2013 发表于 2019-3-12 10:29
U21最好用74HC02或非门。V7 用74HC32不稳定。用74HC02没问题。

原来如此啊,期待的核心板还有 10天了喔
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-12 16:32:04 | 显示全部楼层
hpdell 发表于 2019-3-12 15:38
原来如此啊,期待的核心板还有 10天了喔

继续加油中。
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-3-12 18:08:20 | 显示全部楼层

对比了下,原来是二输入或门改成或非门了。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-3-12 19:21:44 | 显示全部楼层
byccc 发表于 2019-3-12 18:08
对比了下,原来是二输入或门改成或非门了。

是的,他们的逻辑输出貌似刚好相反
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-3-12 20:31:16 | 显示全部楼层
本帖最后由 在水一方 于 2019-3-12 20:43 编辑
hpdell 发表于 2019-3-12 19:21
是的,他们的逻辑输出貌似刚好相反

时序相反后,锁存  从哪个时序开始呢??有点没想明白
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-3-12 21:14:17 | 显示全部楼层
在水一方 发表于 2019-3-12 20:31
时序相反后,锁存  从哪个时序开始呢??有点没想明白

NWE写使能下降沿开始锁存
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-3-12 21:25:46 | 显示全部楼层
byccc 发表于 2019-3-12 21:14
NWE写使能下降沿开始锁存

那个时候不是数据才进行发送吗?这个时间锁存没有问题吗,我硬件不是很懂再请教一下了
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-3-12 22:19:08 | 显示全部楼层
在水一方 发表于 2019-3-12 21:25
那个时候不是数据才进行发送吗?这个时间锁存没有问题吗,我硬件不是很懂再请教一下了

QQ截图20190312221717.jpg
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-13 02:27:52 | 显示全部楼层

FMC输出NWE下降沿后,通过74HC02的或非门输出是有个延迟的,然后出发74HC574锁存也是有个延迟时间,这两个延迟时间就有几十ns。所以用户只需保持ADDST数据建立时间参数配置稍大些即可。实际测试2个FMC时钟周期就稳了。
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-3-13 07:25:15 | 显示全部楼层
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-3-13 07:25:29 | 显示全部楼层
eric2013 发表于 2019-3-13 02:27
FMC输出NWE下降沿后,通过74HC02的或非门输出是有个延迟的,然后出发74HC574锁存也是有个延迟时间,这两 ...

明白了,谢谢
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-3-13 10:02:33 | 显示全部楼层
本帖最后由 hpdell 于 2019-3-13 10:03 编辑
eric2013 发表于 2019-3-13 02:27
FMC输出NWE下降沿后,通过74HC02的或非门输出是有个延迟的,然后出发74HC574锁存也是有个延迟时间,这两 ...

你好,我想使用 hc245 作为io 扩展,作为按键输入检测及 sd 卡是否插入检测口,不知道是否可以呀 ??

电路图如下:
74hc02_key.png

r123 为硬件使能

r68 为使用 new 信号控制
r100 是使用 574 输出低电平来控制,

这3个方法到时根据实际情况选择一个即可

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-13 10:17:02 | 显示全部楼层
hpdell 发表于 2019-3-13 10:02
你好,我想使用 hc245 作为io 扩展,作为按键输入检测及 sd 卡是否插入检测口,不知道是否可以呀 ??

...

这样的话,只能查询方式了。另外读取要用NOE
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-3-13 10:20:16 | 显示全部楼层
eric2013 发表于 2019-3-13 02:27
FMC输出NWE下降沿后,通过74HC02的或非门输出是有个延迟的,然后出发74HC574锁存也是有个延迟时间,这两 ...



详细
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-3-13 10:23:54 | 显示全部楼层
本帖最后由 hpdell 于 2019-3-13 10:32 编辑
eric2013 发表于 2019-3-13 10:17
这样的话,只能查询方式了。另外读取要用NOE

ok , 使用查询费也是可以的,每隔 10-60 ms 之间读取一次也可以
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-13 17:22:33 | 显示全部楼层
hpdell 发表于 2019-3-13 10:23
ok , 使用查询费也是可以的,每隔 10-60 ms 之间读取一次也可以

也可以。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-15 01:03:32 | 显示全部楼层
已经更新,内容略多。
回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
发表于 2019-3-21 15:49:28 | 显示全部楼层
DATAST数据建立时间 < (74HC02的tpd传输延迟时间 + 74HC02的tr传输延迟时间 + 74HC574的tpd传输延迟时间的这段时间)

是这样理解吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-21 16:29:09 | 显示全部楼层
dy84082666 发表于 2019-3-21 15:49
DATAST数据建立时间 < (74HC02的tpd传输延迟时间 + 74HC02的tr传输延迟时间 + 74HC574的tpd传输延迟时间的 ...

要大于等于,也就是当前的这个FMC配置,需要DataSet时间参数配置为2-255均可。
回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
发表于 2019-3-21 16:58:37 | 显示全部楼层
eric2013 发表于 2019-3-21 16:29
要大于等于,也就是当前的这个FMC配置,需要DataSet时间参数配置为2-255均可。

看您填写的DATASET = 2(10ns)
而前面那三个参数加起来 14ns(Tpd-574) + 9ns(Tpd-C02) + 8ns(Tr-C02) =31ns
DATASET >= 31ns ? 没看明白呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-3-21 17:03:27 | 显示全部楼层
dy84082666 发表于 2019-3-21 16:58
看您填写的DATASET = 2(10ns)
而前面那三个参数加起来 14ns(Tpd-574) + 9ns(Tpd-C02) + 8ns(Tr-C02) = ...

数字芯片的那个几个时序参数没有给最小时间,实际测试2-3个5ns就稳定了。项目应用建议开个5-10好些。
回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
发表于 2019-3-21 17:13:35 | 显示全部楼层
eric2013 发表于 2019-3-21 17:03
数字芯片的那个几个时序参数没有给最小时间,实际测试2-3个5ns就稳定了。项目应用建议开个5-10好些。

这下子完全明白,需要理论与实践结合。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2019-5-28 15:55:32 | 显示全部楼层
595级联,好处是可以做成隔离,但是只能输出信号吧,没法检测输入电平的高低?   这个FMC扩展IO口,用在不需要隔离的场合可以的,不过这个可以检测输入信号吗?
还有个小白的问题,FMC_NE1 /FMC_NE2/FMC_NE3/FMC_NE4 是分别控制上面的 6块区域吗 ,怎么不是划分成4块 ,一个信号使能一块区域?
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2019-5-28 16:31:37 | 显示全部楼层
夏清 发表于 2019-5-28 15:55
595级联,好处是可以做成隔离,但是只能输出信号吧,没法检测输入电平的高低?   这个FMC扩展IO口,用在不 ...

之前搞错了,原来只有第一个区块 有4路片选,其他的都是固定的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-5-29 10:31:39 | 显示全部楼层
夏清 发表于 2019-5-28 16:31
之前搞错了,原来只有第一个区块 有4路片选,其他的都是固定的。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 14:28 , Processed in 0.319621 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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