天天看點

STM32接口FSMC/FMC難點詳解

STM32接口FSMC/FMC難點詳解

        STM32F767的FMC将外部存儲器劃分為6個固定大小的256M的存儲區域,如下圖

STM32接口FSMC/FMC難點詳解

        STM32F767的FMC 存儲塊 1(Bank1 )被分為 4個區,每個區管理64M 位元組空間,每個 區都有獨立的寄存器對所連接配接儲進行配置。Bank1 的 256M 位元組空間由  28 根位址線 根位址線(HADDR[27:0] )尋址。 這裡 HADDR[27:0]是内部AHB位址總線,其中位址總線HADDR[25:0]來自外部存儲器位址FMC_A[25:0](FMC_A[25:0]會接到外部存儲器的位址線上,也就是HADDR内部總線的[25:0]來自外部存儲器位址線), 而 HADDR[26:27] 對4個區進行尋址。如表 18.1.2.1所示:

STM32接口FSMC/FMC難點詳解

        比如外部存儲器接到FMC_NE1上面,那麼外部存儲器的位址為HADDR[26:27] +FMC_A[25:0]=0x60000000+FMC_A[25:0]。

​        HADDR[25:0] 位包含外部存儲器位址,由于 HADDR 為位元組位址,而存儲器按字尋址,是以根據存儲器資料寬度不同,實際向存儲器發送的位址也将有所不同,如下表所示。

STM32接口FSMC/FMC難點詳解

​        因為一個位址對應1個位元組資料,是以64M位元組的位址量,就能表示64x8=512Mb的資料,也就是外部存儲器最大容量為512Mb。

        當接的是8位寬度存儲器的時候,也就是一個位址正好可以操作一個位元組(8位)的資料,需要26根位址線:那麼 HADDR[25:0] = FMC _A [25:0] ,就可以了。

        當接的是16位寬度存儲器的時候,那麼一個位址就可以操作一個字(16位)的資料那麼就不需要26根位址線了,HADDR[0]就沒有用到,是以: HADDR[25:1] = FMC _A[24:0] 。

       ​例如TFTLCD屏(16位寬存儲器)的RS腳接到FMC_A18上面,使用FMC_NE1(就是使用BANK1的子bank1),

        外部存儲器位址線尋址到A18為0時也即是FMC_A[24:0]=0x3FFFF,左移一位付給内部總線HADDR[25:1]=00 0000 0111 1111 1111 1111 1110=0x7fffe,是以内部總線讀寫外部存儲器指令(REG)的位址(尋址)就變為0x60000000+0X7FFFE(FMC_A18即RS為0時);

​        部存儲器位址線尋址到A18為1時也即是FMC_A[24:0]=0x40000,左移一位付給内部總線HADDR[25:1]=00 0000 1000 0000 0000 0000 0000 =0x8000,内部總線讀寫外部存儲器資料(RAM)的位址變為0x60000000+0X80000(FMC_A18即RS為1時)。

        32位寬的存儲器也是如此。​​​

        無論外部接8位/16位/32位寬裝置,FMC_A[0]永遠接在外部裝置位址A[0],HADDR[27:26]的設定,是不需要我們幹預的,比如當你使用Bank1的第一個區,即使用FMC_NE1連接配接外部裝置的時候,即對應了HADDR[27:26]=00,然後我們需要配置第一區的寄存器組,就可以使用了。

繼續閱讀