做一个简单功能,知道RAM大小,然后直接把栈顶做到最后
This commit is contained in:
parent
a9c996a25b
commit
c947b6437e
37
Sys.cpp
37
Sys.cpp
|
@ -31,9 +31,11 @@ uint IRQ_STACK[IRQ_STACK_SIZE]; // MSP 中断嵌套堆栈
|
||||||
|
|
||||||
#pragma arm section code
|
#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_MSP((uint)&IRQ_STACK[IRQ_STACK_SIZE]);
|
||||||
__set_CONTROL(2);
|
__set_CONTROL(2);
|
||||||
__ISB();
|
__ISB();
|
||||||
|
@ -210,8 +212,6 @@ void ShowError(int code) { debug_printf("系统错误!%d\r\n", code); }
|
||||||
|
|
||||||
TSys::TSys()
|
TSys::TSys()
|
||||||
{
|
{
|
||||||
Set_SP();
|
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
Debug = true;
|
Debug = true;
|
||||||
#else
|
#else
|
||||||
|
@ -235,8 +235,35 @@ TSys::TSys()
|
||||||
CPUID = SCB->CPUID; // MCU编码。低字设备版本,高字子版本
|
CPUID = SCB->CPUID; // MCU编码。低字设备版本,高字子版本
|
||||||
MCUID = DBGMCU->IDCODE; // MCU编码。低字设备版本,高字子版本
|
MCUID = DBGMCU->IDCODE; // MCU编码。低字设备版本,高字子版本
|
||||||
FlashSize = *(__IO ushort *)(0x1FFFF7E0); // 容量
|
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(IsGD) Clock = 120000000;
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
|
1
Sys.h
1
Sys.h
|
@ -58,6 +58,7 @@ public:
|
||||||
byte MessagePort; // 消息口,默认0表示USART1
|
byte MessagePort; // 消息口,默认0表示USART1
|
||||||
uint ID[3]; // 芯片ID
|
uint ID[3]; // 芯片ID
|
||||||
uint FlashSize; // 芯片Flash容量
|
uint FlashSize; // 芯片Flash容量
|
||||||
|
uint RAMSize; // 芯片RAM容量
|
||||||
uint CPUID; // CPUID
|
uint CPUID; // CPUID
|
||||||
uint MCUID; // MCU编码。低字设备版本,高字子版本
|
uint MCUID; // MCU编码。低字设备版本,高字子版本
|
||||||
bool IsGD; // 是否GD芯片
|
bool IsGD; // 是否GD芯片
|
||||||
|
|
|
@ -8,7 +8,7 @@ __initial_sp
|
||||||
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||||||
; </h>
|
; </h>
|
||||||
|
|
||||||
Heap_Size EQU 0x00001000
|
Heap_Size EQU 0x00000200
|
||||||
|
|
||||||
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
||||||
__heap_base
|
__heap_base
|
||||||
|
|
Loading…
Reference in New Issue