【.Net Micro Framework PortingKit - 05】SRAM初始化&设置NVIC中断表偏移

本文介绍STM32开发板SRAM的初始化过程,包括修改启动代码、配置FSMC时钟及SRAM各项参数,最后调整中断向量表的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇《修改启动代码&重写向量表》文章中我们介绍了中断向量表的编写,这次我们编写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闪烁节奏将大大提速。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值