FSMC外设中的 HADDR[x]和 FSMC_A[x]的对应问题

学习野火 STM32霸道板子的时候,在液晶显示那一章,讲到了HADDR和FSMC_A的地址对应问题

先对HADDR有个了解,HADDR是需要转换到外部存储器的内部AHB地址线。 

HADDR[26:27]对4个区(bank)进行寻址。如下表所示:

有一个著名的 "地址左移一位" 原则。这个问题看上去很难理解,其实简单讲就是:

当外部存储器是8位数据宽度时, HADDR[25:0]与FSMC_A[25:0]对应相连

当外部存储器是16位数据宽度时,HADDR[25:1]与FSMC_A[24:0]对应相连,HADDR[0]未接

其实这是官方手册里讲的:

HADDR是字节地址(这里HADDR,是内部AHB地址总线),如果访问外部存储器是字节型,也就是八位存储器,那么通过地址线访问(FSMC_A)时,直接可以一次性接收这个数据,所以每根地址线线一一对应即可。

那么如果外部存储器是16位时,通过地址线访问时,要将这16位数据接收完,一次接收8位,就需要分两次。那么HADDR的地址会比存储器地址多一倍。比如:共256个字节的数据,HADDR需要256个地址,而16位存储器只需要128个地址。这在二进制地址线上体现出来就是HADDR会多出一个位(一根地址线)。

也就是说(下面的0b代表二进制前缀,后面是26位 HADDR 字节地址线 )

             0b00 0000 0000 0000 0000 0000 0000 访问存储器第0个地址(...00)的第1个字节

             0b00 0000 0000 0000 0000 0000 0001 访问存储器第0个地址(...00)的第2个字节

             0b00 0000 0000 0000 0000 0000 0010 访问存储器第1个地址(...01)的第1个字节

             0b00 0000 0000 0000 0000 0000 0011 访问存储器第1个地址(...01)的第2个字节

             0b00 0000 0000 0000 0000 0000 0100 访问存储器第2个地址(...10)的第1个字节

             0b00 0000 0000 0000 0000 0000 0101 访问存储器第2个地址(...10)的第2个字节

             0b00 0000 0000 0000 0000 0000 0110 访问存储器第3个地址(...11)的第1个字节

             0b00 0000 0000 0000 0000 0000 0111 访问存储器第3个地址(...11)的第2个字节

以此类推

观察一下,通过HADDR[1]是0还是1正好能够区别外部存储器上的0地址和1地址,而通过HADDR[2]和HADDR[1]是10还是11又正好能够区别外部存储器上的2地址和3地址。

不难发现HADDR[0]其实在寻址过程中是不起作用的,从第HADDR[1]位开始往左的高位才起作用,也正好 一 一 对应存储器上的地址值,存储器每个地址包含16位数据。也就是说HADDR[25:1],正好对应存储器的地址(这些地址通过FSMC_A[24:0]来访问,可以直接理解成FSMC_A[24:0]代表存储器上的地址线)。既然 25:1可以 完整地对应存储器地址 FSMC_A[24:0] ,我们就可以通过这高25位来判断访问的是存储器哪一个地址,而把第0位直接忽略(当然,CPU按字节地址访问时还是在它自己地地址线第0位 +1,只是它不知道它 +1的时候,其实16位存储器地址那边没有 +1,还是维持在一个地址,只是访问第二个字节)。

HADDR[0]不接到FSMC上,CPU依然是逐次增一地去访问外部存储器,也还是发出一个地址读回一个字节,但是CPU每发两个地址都会停留在外部存储器的同一个地址上,所以最终,同一个地址上的两个字节都会被CPU读取。

所以“左移一位”说的是 把FSMC_A地址的位编号,转换到HADDR的时候,要把编号加1。因为HADDR[0]不接到FSMC上,剩下的HADDR[25:1]分别接到 FSMC_A[24:0]上,就是连接关系不再是数字对应,而是FSMC[0] --> HADDR[1],... , FSMC[24] --> HADDR[25]。


本文参考了CSDN博主「Stm32新手村npc」的原创文章:
原文链接:https://blog.csdn.net/weixin_70698272/article/details/129409873

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值