目录
一、新建工程文件夹
二、新建一个工程框架
三、添加文件
四、仿真验证
五、仿真调试中遇到的问题并解决
一、新建工程文件夹
新建工程文件夹分为 2 个步骤:1,新建工程文件夹;2,拷贝工程相关文件。
1.新建工程文件
首先我们在桌面新建一个工程根目录文件夹,后续的工程文件都将在这个文件夹里建立, 我们把这个文件夹重命名为:寄存器版本,如下图所示:
为了让工程的文件目录结构更加清晰易懂,我们会在工程根目录文件夹下建立以下几个文 件夹,每个文件夹名称及其作用如下表所示:
新建完成以后,最后得到我们的工程根目录文件夹如下图所示:
工程根目录及其相关文件夹新建好以后,我们需要拷贝一些工程相关文件过来(主要是在 Drivers 文件夹里面),以便等下的新建工程需要。
2. 拷贝工程相关文件
接下来我们需要往刚才新建的文件夹里边拷贝一些文件。
Drivers 文件夹
该文件夹用于存放与硬件相关的驱动层文件,一般包括如下表所示的三个文件夹:
BSP 文件夹,用于存放一些驱动文件,如:LED、蜂鸣器、按键等。
CMSIS 文件夹,用于存放 CMSIS 底层代码(ARM 和 ST 提供),如:启动文件(.s 文件)、 stm32f1xx.h 等各种头文件。该文件夹我们可以直接从 STM32CubeF1 固件包里面拷贝,不过由于固件包里面的 CMISIS 兼容 了太多芯片,导致非常大(100 多 MB),因此我们根据实际情况,对其进行了大幅精简,精简 后的 CMSIS 文件夹大小为 1MB 左右。
SYSTEM 文件夹,用于存放系统级核心驱动代码
执行完以上操作后,Drivers 文件夹最终结构如下图所示;
Middlewares 文件夹
该文件夹用于存放第三方提供的中间层代码(组件/Lib 等)
Output 文件夹
该文件夹用于存放编译器编译工程输出的中间文件,比如:.hex、.bin、.o 文件等等。这里 不需要操作,后面只需要在 MDK 里面设置该文件夹为编译过程中间文件的存放文件夹就行
Projects 文件夹
该文件夹用于存放编译器(MDK、IAR 等)工程文件,我们主要用 MDK,为了方便区分, 我们在该文件夹下新建:MDK-ARM 文件夹,用于存放 MDK 的工程文件,
User 文件夹
该文件夹用于存放用户编写的代码,如:main.c 等。
二、新建一个工程框架
首先,打开 MDK 软件。然后点击 Project→New uVision Project 如下图所示
然后弹出工程命名和保存的操作窗口,我们将工程文件保存路径设置在上一节新建的工程 文件夹内,具体路径为:桌面→寄存器版本,→Projects→MDK-ARM, 工程名字我们取:zy_f103,最后点击保存即可。具体操作窗口下图所示:
之后,弹出器件选择对话框,如图 6.1.2.3 所示。因为战舰开发板所使用的 STM32 型号为 STM32F103ZET6,所以我们选择:STMicroelectronics→STM32F1 Series→STM32F103→ STM32F103ZE(如果使用的是其他系列的芯片,选择相应的型号就可以了。如下图所示:
点击 OK,MDK 会弹出 Manage Run-Time Environment 对话框,我们关闭就行了
接下来进入KIEL5界面
此时,我们打开 MDK-ARM 文件夹,会看到 MDK 在该文件夹下自动创建了 3 个文件夹 (DebugConfig、Listings 和 Objects),这三个文件夹的作用如下表所示:
编译过程产生的链接列表、调试信息、预览、lib 等文件,统称为中间文件。为了统一管理, 方便使用,我们会把输出在 Listings 和 Objects 文件夹的内容,统一改为输出到 Output 文件夹 (通过魔术棒设置),我们先把 MDK 自动生成的这两个文件夹(Listings 和 Objects)删除。
三、添加文件
本节将分 3 个步骤:1,设置工程名和分组名;2,添加启动文件;3,添加 SYSTEM 源码。
1.设置工程名和分组名
在 Project→Target 上右键,选择 Manage Project Items…(方法一)或在菜单栏点击品字形 红绿白图标(方法二)进入工程管理界面,如下图所示:
在工程管理界面,我们可以执行设置工程名字(Project Targets)、分组名字(Groups)以 及添加每个分组的文件(Files)等操作。我们设置工程名字为:Template,并设置四个分组: Startup(存放启动文件)、User(存放 main.c 等用户代码)、Drivers/SYSTEM(存放系统级驱 动代码)、Readme(存放工程说明文件),如下图所示:
设置好之后,我们点击 OK,回到 MDK 主界面,可以看到我们设置的工程名和分组名如下图所示:
2.添加启动文件
启动文件(.s 文件)包含 STM32 的启动代码,其主要作用包括:1、堆栈(SP)的初始化; 2、初始化程序计数器(PC);3、设置向量表异常事件的入口地址;4、调用 main 函数等,是每 个工程必不可少的一个文件。
该文件由 ST 官方提供,对于 STM32F103 来说有 4 个启动文件可选,如下表所示:
启动文件存放在 STM32CubeF1 软件包的:Drivers→CMSIS→Device→ST→STM32F1xx→ Source→Templates→arm 文件夹下。因为我们开发板使用的是 STM32F103ZET6,对应的启动文 件为:startup_stm32f103xe.s,为了节省空间,在精简版 CMSIS 文件夹里面我们把其他启动文件 都删了。而且,为了更好的匹配寄存器版本代码,我们对 startup_stm32f103xe.s 做了 2 处修改:
1.我们用不到编译器的内存管理函数,为节省内存,将 Heap_Size 改成 0,源码如下:
;未用到编译器自带的内存管理(malloc,free 等),设置 Heap_Szie 为 0
Heap_Size EQU 0x00000000
2,寄存器代码不需要调用 SystemInit 函数,因此修改 Reset_Handler 函数,去掉 SystemInit 调用,源码如下:
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
;寄存器版本代码,因为没有用到 SystemInit 函数,所以注释掉以下代码为防止报错!
;HAL 库版本代码,建议加上这里(提供 SystemInit 函数),以初始化 stm32 时钟等。
;IMPORT SystemInit
;LDR R0, =SystemInit
;BLX R0
LDR R0, =__main
BX R0
ENDP
这了我们使用方法 1 添加(路径:寄存器版本\Drivers\CMSIS\ Device\ST\STM32F1xx\Source\Templates\arm),
上图中,我们也可以点击 Add 按钮进行文件添加。添加完后,点击 Close,完成启动文件 添加,得到工程分组如下图所示。
3. 添加 SYSTEM 源码
这里我们在工程管理界面(方法 2)进行 SYSTEM 源码添加。点击:管理按钮,进入工程 管理界面,选中 Drivers/SYSTEM 分组,然后点击:Add Files,进入文件添加对话框,依次添加delay.c、sys.c 和 usart.c 到该分组下,
添加完成以后如下:
接下来我们编写主函数,并且添加到user中,如下:
编译程序,0 error 0warnning
四、仿真验证
1.我们新建一个proteus文件,并且连接如下图所示:
2.双击芯片,并且将程序下载进去,调试
由串口输出的值来看,我们所创建的工程是正确的。
五、仿真调试中遇到的问题并解决
解决办法:点击Design,再点击Power Rail Configuration,将VVC添加过去