如题,由于STM32的FLASH烧写寿命在1万次左右,对于本人这样的改一行代码都想下载到开发板中测试的强迫症患者,真是有些担心花我近200大洋的开发板还没学者啥,就寿终正寝了。因此,本人参考总结网上众多教程,并实际测试成功,在此跟网友分享下准处女座的强迫症之作,成功实现下载程序至SRAM中,并成功运行。
本人使用的开发板为正点原子精英STM32F103ZET6开发板,并自配了一个ST-LINK V2仿真下载器:
开发板资料下载地址:http://www.openedv.com/thread-13912-1-1.html
本次实验主要实现下载程序至STM32的SRAM中,并点亮开发板自带的LED灯,开发板上的LED灯电路为:
本次实验点亮LED0,其通过PB5引脚与STM32连接,配置引脚工作模式为推挽输出GPIO_Node_Out_PP。
话不多说,直接上步骤。
所需的材料有:①、STM32F10x标准外设库(STM32F10x_StdPeriph_Lib_V3.5.0),可自行在网上下载;
②、正点原子精英版标准例程中SYSTEM文件夹,要用其中的delay_ms延时函数,可在开发板提供的任意一个标准例程中找到。
下面开始按步骤创建工程,本人使用的MDK版本为μVersion V5.21.1.0。
1)、创建工程文件夹LoadToSRAM,并在其中创建子文件夹CORE、FWLIB、OBJ、USER;
2)、将SYSTEM文件夹复制到LoadToSRAM工程文件夹下;
3)、①将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport下的2个文件 core_cm3.c 、core_cm3.h 复制到 CORE 文件夹下;
②将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下的1个文件startup_stm32f10x_hd.s(第4个)复制到 CORE 文件夹下;
4)、将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver目录下的2个文件夹inc、src复制到FWLIB文件夹内;
5)、①将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下的3个文件 stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h,复制到 USER 文件夹下;
②将 STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下的3个文件 stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h复制到USER文件夹下;
③在 USER 文件夹下新建空文本文件main.c;
6)、①启动Keil MDK软件 → Project → New μVersion Project... → 定位到LoadToSRAM\USER→ 工程文件名LoadToSRAM → 保存;
②选择芯片STM32F103ZE → OK → Cancel;
7)、在Target 1上右击 → Manage Project Items... → 将Project Targets中Target 1重命名为LoadToSRAM → 删除Groups中Source Group 1,然后在Groups中新建CORE、FWLIB、SYSTEM、USER;
8)、①在CORE内Add Files... 添加.../CORE文件夹下的2个文件core_cm3.c、startup_stm32f10x_hd.s;(注:添加文件时选择文件类型All Files (*.*))
②在FWLIB内Add Files... 添加.../FWLIB/src文件夹下的所有.c文件;
③在SYSTEM内Add Files... 添加.../SYSTEM/delay文件夹下的delay.c文件,.../SYSTEM/sys文件夹下的文件sys.c文件,.../SYSTEM/usart文件夹下的usart.c文件;
④在USER内Add Files...添加.../USER文件夹下的3个文件main.c、stm32f10x_it.c、system_stm32f10x.c → OK;
9)、在"LoadToSRAM"上右击 → Option for Target 'LoadToSRAM'... → 在Target选项卡中设置:
①、Xtal(MHz) → 8.0;
②、IROM1:0x20000000、0x8000;
③、IRAM1:0x20008000、0x8000;
10)、在Output选项卡中:
①、Select Folder for Objects... → 选择文件夹OBJ ;
②、勾选"Create HEX File";
11)、C/C++(编译选项卡):
①、Define内填"STM32F10X_HD,USE_STDPERIPH_DRIVER" ;
②、Include Paths内加入路径“..\CORE、..\FWLIB\inc、..\SYSTEM\delay、..\SYSTEM\sys、..\SYSTEM\usart、
..\USER”(包含.h头文件的文件夹路径)。
12)、Debug(调试选项卡):
①、下载器Use选择ST-Link Debugger;
②、USER文件夹下新建 RAM.ini文本 文件,加入如下代码:
SP = _RDWORD(0x20000000); // Setup Stack Pointer
PC = _RDWORD(0x20000004); // Setup Program Counter
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
并加载到 Debug 选项卡下的 Initialization File 中;
③、右侧Dialog DLL:内填"TARMSTM.DLL" → 右侧Parameter:内填"-pSTM32F103ZE"。
13)、Utilities(工具):
①、Utilities → Settiings;
②、RAM for Algorithm设置:art:0x2000 8000,设置ize:0x8000;
③、Prodramming Algorithm中的STM32F10x High-density...设置:art:0x2000 8000,设置ize:0x8000 → 确定。
14)、在main.c中加入如下代码,并编译、下载、执行:
#include "stm32f10x.h"
#include "delay.h"
int main()
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO参数设置结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //APB2外设时钟使能:GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //选定引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //工作方式:推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最大速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化引脚
delay_init(); //延时函数初始化
while(1) //无限循环
{
GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0亮
delay_ms(500); //延时500ms
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED0灭
delay_ms(500); //延时500ms
}
}
(注:程序最后一行多加一个空行,若有其他文件最后一行都要加一个空行)
程序成功运行,但下载到SRAM中的程序掉电会擦除。
有关程序下载到SRAM中,中断设置的问题,本人将在接下来的文章中分享。