找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2968|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

外部SRAM實(shí)驗(yàn),讓STM32的外部SRAM操作跟內(nèi)部SRAM一樣

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:91350 發(fā)表于 2015-10-29 19:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 piaolin 于 2015-10-29 19:07 編輯

前幾天看到論壇有人在問(wèn)這個(gè)問(wèn)題,我特意去做了這個(gè)實(shí)驗(yàn),這樣用外部SRAM就跟用內(nèi)部SRAM一樣,不用自己去申請(qǐng)內(nèi)存,也不用考慮什么內(nèi)存地址,一切讓編譯器自己去解決。

       廢話不多說(shuō),我直接拿原子哥的戰(zhàn)艦開發(fā)板庫(kù)函數(shù)版的外部SRAM實(shí)驗(yàn)來(lái)修改。在庫(kù)函數(shù)的system_stm32f10x.c這個(gè)初始化文件當(dāng)中其實(shí)就已經(jīng)有外部SRAM的初始化,我們只要增加“#defineDATA_IN_ExtSRAM 1”這句宏定義


        #if defined (STM32F10X_HD) || (defined STM32F10X_XL)|| (defined STM32F10X_HD_VL)
        #define DATA_IN_ExtSRAM 1
        #endif

       再編譯的時(shí)候就會(huì)把外部SRAM的初始化編譯進(jìn)去,初始化的代碼大家可以去看文件中的voidSystemInit_ExtMemCtl(void) 這個(gè)函數(shù)。然后我們?cè)诠こ淘O(shè)置那里把外部SRAM地址增加進(jìn)去,如下圖

       修改啟動(dòng)文件中的中的第39行,把__initial_sp修改成 __initial_sp  EQU 0x20000000+ Stack_Size

       然后我們把Main中的testsram中的地址去掉,讓編譯器自己去指定地址

       再把原子哥的外部SRAM的初始化注釋掉,因?yàn)榍懊嬉呀?jīng)在System_init已經(jīng)初始化了。其實(shí)這里我們可以把原子的SRAM.c文件去掉不用它了,我這里沒(méi)去掉,其實(shí)只是為了能正常調(diào)用fsmc_sram_test()來(lái)測(cè)試實(shí)驗(yàn)結(jié)果

       到這里我們可以編譯了,下載到開發(fā)板,我們就可以看到實(shí)驗(yàn)結(jié)果

       我們繼續(xù)深入點(diǎn),看看testsram[]這個(gè)大數(shù)組到處編譯在到哪里去了,用IDA64來(lái)反匯編下編譯出來(lái)的AXF文件

       可以看到testsram這個(gè)大數(shù)組自動(dòng)編譯到外部sram的0x68000000這個(gè)地址上。我們?cè)僭囋囋俣x幾個(gè)大數(shù)組看看

       再來(lái)看看編譯后的結(jié)果

       可以看到每個(gè)大數(shù)組都由編譯器自己分配了內(nèi)存的地址,壓根不用我們自己去定義。

       到這里相信大家會(huì)有一個(gè)疑問(wèn),那編譯是怎么來(lái)決定把哪些變量定義在內(nèi)部SRAM,那些定義在外部SRAM。這一點(diǎn)我也研究清楚,我只知道編譯會(huì)優(yōu)先把變量都定義外部SRAM,當(dāng)外部SRAM不夠用情況才會(huì)定義在內(nèi)部SRAM上,至于怎么讓編譯優(yōu)先使用內(nèi)部SRAM,我也沒(méi)有搞明白。目前我能做到的是把已經(jīng)初始化的全局變量都放在SRAM,做法是修改散列文件,讓RW只在內(nèi)存SRAM上編譯。

      去掉小紅框的勾,然后點(diǎn)擊Edit我們來(lái)修改SRAM.sct文件,也就是編譯散列文件

      把RW_RAM1中(也就是外部SRAM)的+RW去掉,這樣已經(jīng)初始化的全局變量就只會(huì)編譯在內(nèi)部SRAM中

      重新編譯下工程,再來(lái)反匯編下看看編譯結(jié)果

       可以看到usmart_nametab[]這個(gè)已經(jīng)初始化的數(shù)組編譯在內(nèi)部SRAM上,adc2[]這個(gè)未初始化的數(shù)組,數(shù)組的大小比較而且能在內(nèi)部Sram編譯得下的,卻還是編譯在外部SRAM上。

       最后散列相關(guān)的知識(shí),大家可以看看這里http://blog.csdn.net/lindabell/a ... 2d2a4e8d1a374a433f596ad1440

       前面沒(méi)有修改啟動(dòng)文件,其它變量全部在內(nèi)部SRAM的時(shí)候,程序運(yùn)行是沒(méi)有問(wèn)題,減小數(shù)組的時(shí)候程序運(yùn)行不起來(lái),修改前面的紅字部分后,程序就可以運(yùn)行起來(lái),但是LCD偶爾正常,偶爾不正常,調(diào)試下感覺(jué)是延時(shí)的問(wèn)題,沒(méi)有再繼續(xù)調(diào)試了


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表