首先我们知道stm32是32位单片机,故它的ROM为4G(2^32),它是cpu通过地址访问外围电路元件比如flash、ram的助手,那stm32怎么管理这些地址呢,答案是地址映射,ROM是只读的,说明出厂前就已经固定了,结合下图:
我们就可以知道,用stm32f103c8t6的flash来举例子,flash的空间大小为64k,flash的绝对地址肯定是0x00000000-0x00010000,ram肯定也是0x00000000开始,但是,总不能有这么多0x00000000吧,所以stm32就把这些映射成一个4G范围的地址,对应下图:
可以看出,ram被映射到rom的0x20000000,外设寄存器被映射到ROM的0x40000000。
了解了芯片上各个器件和芯片外围器件的地址范围后,我引出一个问题,我们写的代码,放在哪?
分静态和动态,
(静态)全局变量和代码放flash上,全局变量在程序运行起来后会被加载到ram,结合下图:
(动态)静态量、函数参数(堆,栈),需要动态分配内存,则放到ram,且是系统运行动态分配,用完就删,结合上图。
由于栈和全局变量加载和堆组成的ram占用,所以栈大小应小于ram。
程序出行怪状,或者说是不符合想象,可能是栈给的太少、栈溢出,那怎么合理规划栈空间呢,靠经验,新手可以参考
http://t.csdnimg.cn/GZimr
或者下面