From c947b6437e8415e8d869a890fa6fef606d3e6b3c Mon Sep 17 00:00:00 2001 From: nnhy Date: Thu, 14 Aug 2014 15:58:41 +0000 Subject: [PATCH] =?UTF-8?q?=E5=81=9A=E4=B8=80=E4=B8=AA=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E7=9F=A5=E9=81=93RAM=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=EF=BC=8C=E7=84=B6=E5=90=8E=E7=9B=B4=E6=8E=A5=E6=8A=8A?= =?UTF-8?q?=E6=A0=88=E9=A1=B6=E5=81=9A=E5=88=B0=E6=9C=80=E5=90=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sys.cpp | 37 ++++++++++++++++++++++++++++++++----- Sys.h | 1 + startup_stm32f10x_hd.s | 2 +- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Sys.cpp b/Sys.cpp index e2d24e18..d9b716f9 100644 --- a/Sys.cpp +++ b/Sys.cpp @@ -31,9 +31,11 @@ uint IRQ_STACK[IRQ_STACK_SIZE]; // MSP 中断嵌套堆栈 #pragma arm section code -force_inline void Set_SP() +force_inline void Set_SP(uint ramSize) { - __set_PSP(__get_MSP()); + //__set_PSP(__get_MSP()); + // 直接使用RAM最后 + __set_PSP(0x20000000 + (ramSize << 10)); // 左移10位,就是乘以1024 __set_MSP((uint)&IRQ_STACK[IRQ_STACK_SIZE]); __set_CONTROL(2); __ISB(); @@ -210,8 +212,6 @@ void ShowError(int code) { debug_printf("系统错误!%d\r\n", code); } TSys::TSys() { - Set_SP(); - #if DEBUG Debug = true; #else @@ -235,8 +235,35 @@ TSys::TSys() CPUID = SCB->CPUID; // MCU编码。低字设备版本,高字子版本 MCUID = DBGMCU->IDCODE; // MCU编码。低字设备版本,高字子版本 FlashSize = *(__IO ushort *)(0x1FFFF7E0); // 容量 - IsGD = Get_JTAG_ID() == 0x7A3; + RAMSize = FlashSize >> 3; // 通过Flash大小和MCUID识别型号后得知内存大小 +#ifdef STM32F0XX + switch(FlashSize) + { + case 16: RAMSize = 4; break; + case 32: RAMSize = 4; break; // 130有4k,150有6k + case 64: RAMSize = 8; break; + } +#endif +#ifdef STM32F10X + switch(FlashSize) + { + case 16: RAMSize = 6; break; + case 32: RAMSize = 10; break; + case 64: + case 128: RAMSize = 20; break; + case 256: RAMSize = 48; break; + case 384: + case 512: RAMSize = 64; break; + case 768: + case 1024: + case 2048: + case 3072: RAMSize = 96; break; + } +#endif + Set_SP(RAMSize); + + IsGD = Get_JTAG_ID() == 0x7A3; if(IsGD) Clock = 120000000; #if DEBUG diff --git a/Sys.h b/Sys.h index 610e8b2c..66689fea 100644 --- a/Sys.h +++ b/Sys.h @@ -58,6 +58,7 @@ public: byte MessagePort; // 消息口,默认0表示USART1 uint ID[3]; // 芯片ID uint FlashSize; // 芯片Flash容量 + uint RAMSize; // 芯片RAM容量 uint CPUID; // CPUID uint MCUID; // MCU编码。低字设备版本,高字子版本 bool IsGD; // 是否GD芯片 diff --git a/startup_stm32f10x_hd.s b/startup_stm32f10x_hd.s index 2ec85a75..1d0c66e3 100644 --- a/startup_stm32f10x_hd.s +++ b/startup_stm32f10x_hd.s @@ -8,7 +8,7 @@ __initial_sp ; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; -Heap_Size EQU 0x00001000 +Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base