上篇《修改啟動代碼&重寫向量表》文章中我們介紹了中斷向量表的編寫,這次我們編寫SRAM初始化代碼,在《調試初步:點亮LED燈》文章中,我們提到了MDK腳本代碼,其實這部分代碼和MDK腳本代碼實作類似的功能。
1、編寫PreStackInit代碼
我們從./DeviceCode/Drivers/Stubs/Processor/stubs_PreStackInit目錄到./DeviceCode/Targets/Native/CortexM3/DeviceCode,并修改目錄的名字為PreStackInit,下一步我們在子目錄RVD_S下的PreStackInit.s中添加如下彙編代碼:
EXPORT PreStackInit
IMPORT PreStackInit_Exit_Pointer
PRESERVE8
AREA SectionForBootstrapOperations, CODE, READONLY
ENTRY
PreStackInit
; 初始化SRAM
; 使能FSMC時鐘
; Enable FSMC clock
LDR R0,= 0x00000114
LDR R1,= 0x40021014
STR R0,[R1]
; 使能FSMC相關的GPIO的時鐘
; Enable GPIOD, GPIOE, GPIOF and GPIOG clocks
LDR R0,= 0x000001E0
LDR R1,= 0x40021018
STR R0,[R1]
; SRAM Data lines, NOE and NWE configuration
; SRAM Address lines configuration
; NOE and NWE configuration
; NE3 configuration
; NBL0, NBL1 configuration
LDR R0,= 0x44BB44BB
LDR R1,= 0x40011400
STR R0,[R1]
LDR R0,= 0xBBBBBBBB
LDR R1,= 0x40011404
STR R0,[R1]
LDR R0,= 0xB44444BB
LDR R1,= 0x40011800
STR R0,[R1]
LDR R0,= 0xBBBBBBBB
LDR R1,= 0x40011804
STR R0,[R1]
LDR R0,= 0x44BBBBBB
LDR R1,= 0x40011C00
STR R0,[R1]
LDR R0,= 0xBBBB4444
LDR R1,= 0x40011C04
STR R0,[R1]
LDR R0,= 0x44BBBBBB
LDR R1,= 0x40012000
STR R0,[R1]
LDR R0,= 0x44444B44
LDR R1,= 0x40012004
STR R0,[R1]
; FSMC Configuration
; Enable FSMC Bank1_SRAM Bank
LDR R0,= 0x00001000
LDR R1,= 0xA0000010
STR R0,[R1]
LDR R0,= 0x00000200
LDR R1,= 0xA0000014
STR R0,[R1]
LDR R0,= 0x0FFFFFFF
LDR R1,= 0xA0000114
STR R0,[R1]
LDR R0,= 0x00001001
LDR R1,= 0xA0000010
STR R0,[R1]
; 重設向量表的位址 (定位到SRAM起始位址 0x20000000)
IF TargetLocation="RAM"
LDR R0,= 0x20000000
LDR R1,= 0xE000ED08
STR R0,[R1]
ENDIF
PreStackEnd
B PreStackInit_Exit_Pointer
END
其中下面的代碼很重要,如果你通過RAM進行調試,并且該中斷表位于RAM其實位置,則需要執行該指令。
IF TargetLocation="RAM"
LDR R0,= 0x20000000
LDR R1,= 0xE000ED08
STR R0,[R1]
ENDIF
2、修改./Solutions/STM3210E/NativeSample/NativeSample.proj檔案
在NativeSample.proj檔案中作如下修改:
<ItemGroup>
<RequiredProjects Include="$(SPOCLIENT)/DeviceCode/Drivers/Stubs/Processor/stubs_PreStackInit/dotNetMF.proj" />
<DriverLibs Include="cpu_prestackinit_stubs.$(LIB_EXT)" />
</ItemGroup>
修改為:
<ItemGroup>
<RequiredProjects Include="$(SPOCLIENT)/DeviceCode/Targets/Native/CortexM3/DeviceCode/PreStackInit/dotNetMF.proj" />
<DriverLibs Include="PreStackInit.$(LIB_EXT)" />
</ItemGroup>
3、修改./Solutions/STM3210E/NativeSample/Scatterfile_tools_mdk.xml檔案
<ExecRegion Name="ER_RAM_RO" Base="0x00000000" Options="ABSOLUTE" Size="0x0005ffe0">
<ExecRegion Name="ER_RAM_RO" Base="0x20000000" Options="ABSOLUTE" Size="">
4、編譯測試
上一篇文章和本篇文章所完成的操作其實隻是鋪墊,外在并沒有什麼效果表現。不過我們下一步将要做的設定晶片時鐘将是重要一步,經過初始化時鐘後,我們的開發闆将會運作在72M的最高頻率上,這時我們原先做LED閃爍節奏将大大提速。