天天看點

SRAM初始化&設定NVIC中斷表偏移

上篇《修改啟動代碼&重寫向量表》文章中我們介紹了中斷向量表的編寫,這次我們編寫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閃爍節奏将大大提速。

繼續閱讀