做一个简单功能,知道RAM大小,然后直接把栈顶做到最后

This commit is contained in:
nnhy 2014-08-14 15:58:41 +00:00
parent a9c996a25b
commit c947b6437e
3 changed files with 34 additions and 6 deletions

37
Sys.cpp
View File

@ -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有4k150有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

1
Sys.h
View File

@ -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芯片

View File

@ -8,7 +8,7 @@ __initial_sp
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00001000
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base