STM32下载程序至SRAM——基于正点原子精英STM32F103ZET6开发板

STM32下载程序至SRAM——基于正点原子精英STM32F103ZET6开发板

        如题,由于STM32的FLASH烧写寿命在1万次左右,对于本人这样的改一行代码都想下载到开发板中测试的强迫症患者,真是有些担心花我近200大洋的开发板还没学者啥,就寿终正寝了。因此,本人参考总结网上众多教程,并实际测试成功,在此跟网友分享下准处女座的强迫症之作,成功实现下载程序至SRAM中,并成功运行。

1、开发板:

    本人使用的开发板为正点原子精英STM32F103ZET6开发板,并自配了一个ST-LINK V2仿真下载器

   

开发板资料下载地址:http://www.openedv.com/thread-13912-1-1.html

2、实验目的:

    本次实验主要实现下载程序至STM32的SRAM中,并点亮开发板自带的LED灯,开发板上的LED灯电路为:

    

    本次实验点亮LED0,其通过PB5引脚与STM32连接,配置引脚工作模式为推挽输出GPIO_Node_Out_PP。

3、创建工程:

    话不多说,直接上步骤。

    所需的材料有:①、STM32F10x标准外设库(STM32F10x_StdPeriph_Lib_V3.5.0),可自行在网上下载;

                           ②、正点原子精英版标准例程中SYSTEM文件夹,要用其中的delay_ms延时函数,可在开发板提供的任意一个标准例程中找到。

    下面开始按步骤创建工程,本人使用的MDK版本为μVersion V5.21.1.0

1)、创建工程文件夹LoadToSRAM,并在其中创建子文件夹COREFWLIBOBJUSER

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个文件夹incsrc复制到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 TargetsTarget 1重命名为LoadToSRAM → 删除Groups中Source Group 1,然后在Groups中新建COREFWLIBSYSTEMUSER

8)、①COREAdd Files... 添加.../CORE文件夹下的2个文件core_cm3.cstartup_stm32f10x_hd.s;(注:添加文件时选择文件类型All Files (*.*)

        ②在FWLIBAdd Files... 添加.../FWLIB/src文件夹下的所有.c文件;

     ③在SYSTEMAdd Files... 添加.../SYSTEM/delay文件夹下的delay.c文件,.../SYSTEM/sys文件夹下的文件sys.c文件,.../SYSTEM/usart文件夹下的usart.c文件;

        ④在USERAdd Files...添加.../USER文件夹下的3个文件main.cstm32f10x_it.csystem_stm32f10x.cOK

9)、在"LoadToSRAM"上右击 → Option for Target 'LoadToSRAM'... → 在Target选项卡中设置:
    ①、Xtal(MHz) → 8.0;
    ②、IROM10x200000000x8000
    ③、IRAM10x200080000x8000

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(工具):
        ①、UtilitiesSettiings
        ②、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中的程序掉电会擦除。

4、有关中断:

    有关程序下载到SRAM中,中断设置的问题,本人将在接下来的文章中分享。

    

猜你喜欢

转载自blog.csdn.net/qtyt567/article/details/79761143