1.1 sram启动介绍 sram启动多用于程序调试阶段,将MCU内部自带的sram划分为两个范围,一个作为code区,一个作为数据堆栈区 ,code区和堆栈区大小的划分要结合mcu内部sram大小、code及数据堆栈区的大小划分。本文介绍基于GD32F350芯片在keil工程中的sram配置方法。 1.2 keil工程中sram启动配置 通过查看GD32F350芯片用户手册可知内部sram大小为20k,在keil工程中将code区划分为12k,堆栈区为8k,如下图所示。 在debug->setting->flash download界面中将flash烧写算法移除,注意选择Do not Erase,否则会一直出现flash擦除错误,具体如下图所示: 编译整个工程,点击查看.map文件信息可以看到code的加载地址和运行地址都在sram地址范围区间,如下图所示。 由启动文件可知,程序启动首先执行Reset_Handler函数,GDmcu sram启动硬件强制将PC指针赋值为0x200001e0,PC指针加1开始执行启动文件,故Reset_Handler函数的运行地址需为0x200001e1才行,否则程序就会跑飞。由上图.map文件可知Reset_Handler函数的运行地址为0x20000165,并非0x200001e1,那我们需修改启动文件,使Reset_Handler函数的运行地址为0x200001e1。具体修改如下图所示。 通过在中断向量表的末尾添加SPACE 0x7C(开辟一段连续空间)使Reset_Handler函数的运行地址为0x200001e1,同时在Reset_Handler函数中,调用系统时钟配置前,添加LDR SP,=_initial_sp,将实际的栈顶指针地址赋值给SP,而不是默认的,这样做的目的是避免默认的栈顶指针指向code区,可能会造成程序跑飞。配置完成后,我们再编译工程,可以看到Reset_Handler函数的地址为0x200001e1。如下图所示。 至此sram启动的所有配置都已完成(还需将boot0、boot1引脚接高),我们点击keil工程中的debug按钮就可以愉快的调试工程了哈。
|