哈哈哈本人比较菜,看了原子哥的视频还是稀里糊涂的,于是就来论坛逛逛,http://www.openedv.com/forum.php?mod=viewthread&tid=268608看了这个老哥发的帖子恍然大悟,但是感觉好多人还是不懂,于是补充说明一下。大家可以两边对照着看。
废话不多说,言归正传。
以BANK1第一区域为例,HADDR[27:00]总共28根地址线,对应FSMC分配为[27:26]作为片选由cpu置为00,[25:0]作为FSMC_A。根据手册1194页图404,FSMC NOR/PSRAM起始地址为0x6000 0000h,因此第一区也就从改地址开始,可寻址地址线为26根,因此可寻址地址范围也就是0x6000 0000h~0x63FF FFFFh(这个不懂的童鞋自己补一下)。stm32 FSMC一个地址表示一个存储单元就是一个字节,如果外部SRAM也是一个地址对应一个字节的话,很显然两者地址一一对应即可:
....
0x6000 0001 ---------- 0x0000 0001
0x6000 0000 ---------- 0x0000 0000
以此类推。简单来说就是,你对FSMC操作地址0x6000 0000,他就知道你其实是要访问外部SRAM 0x0000 0001 地址!没错~
但是问题来了,如果外部SRAM一个地址对应两个字节的话,明显FSMC跟外部SRAM的地址访问就肯定不一样了。为了说明这个情况的地址映射,我举个简单的例子,外部SRAM只有4个字节,也就是只有两个地址:0x0000 0000和0x0000 0001(一个地址对应两个字节),这个时候地址空间映射就变成了:
....
0x6000 0002 和 0x6000 0003 ---------- 0x0000 0001
0x6000 0000 和 0x6000 0001 ---------- 0x0000 0000
那这个时候我们要怎么访问外部SRAM呢?!!
STM32的设计是这样的:配置stm32寄存器告诉他外部SRAM是16位宽的,你对FSMC操作地址时由32对地址自动右移一位完成外部SRAM访问。比如说,对于0x6000 0000这个地址进行16位数据操作时,假设32没有对地址进行右移操作时,访问到的外部SRAM地址是0x0000 0000,好像是没啥问题!但是如果是0x6000 0001,这个时候访问的就是外部SRAM 0x0000 0001了,明显不对了!
我们在进行右移操作后看看:0x6000 0000对应地址0x0000 0000,0x0000 0000右移一位还是0x0000 0000,对上了!0x6000 0002 对应 0x0000 0002,右移一位变成0x0000 0001,同样也对上了!
但这个时候我们发现了,FSMC 只能利用偶数地址对SRAM进行访问,那奇数地址咋办,如果是0x6000 0001,对应0x0000 0001,0x0000 0001右移一位是0x0000 0000,跟0x6000 0000重复了!为了解决这个问题,需要利用LB UB信号帮忙。
如果地址是偶数地址,UB LB均为0,信号无效,寻址地址右移一位直接进行16位数据访问。如果地址是奇数地址,为了不跟偶数地址重复,利用UB LB信号区分高低字节访问,UB=0,LB=1时,奇数地址访问对应外部SRAM地址(比如0x6000 0001时对应0x0000 0000)的高字节。同理 UB=1,LB=0的情况。
可能我自己理解的也不全对,错的地方还请大家指出,一起学习学习。 |