查看原文
其他

STM32工程模板建立之 FLASH 目标(四)

鱼鹰 鱼鹰谈单片机 2021-02-01

预计阅读时间: 7 分钟


04

FLASH 目标


在前面的基础上开始建立 FLASH 目标。


打开工程管理面板:



新建目标,然后可以发现右边的 group 和 Files 自动将 Simulation 目标的内容复制过来了,注意这只是它们的包含关系,并不是将实际的文件进行了复制(在实际的文件夹中你会发现 main.c 文件还是只有一个)。点击 OK,即完成了目标的创建。(可以拖动工程目标、组、文件以更改排列顺序,不过在一个目标里更改,另一个目标也会进行相应的更改)



这样一来,在一个工程内就存在两个目标了:Simulation & Flash(Debug)。如下图:



注意两个目标之间的文件关系是一样的,如果将一个目标文件移除,那么另一目标也会移除。比如说在 Flash(Debug) 目标中将 main.c 通过以下方式移除。



那么在 Simulation 中也会显示已移除该文件。



那么文件都一样,这样两个目标有什么用呢?据我所知有两种方式可以得到两个不同的目标:


1、 增加宏定义


在 Options 中增加宏定义(事实上 Options 的所有设置都是针对所选择的目标而言的,比如当前 Flash(Debug)目标的 Options 更改了,另外一个目标 Simulation 是不会改变的)。



但是使用宏定义的前提是你的代码中必须有相关的切换代码,比如宏定义 ENABLE_USART1,那么代码必须能够根据这个宏来分别编译的你的代码,否则的话,你设置的这个宏将没有一点意义。注意,在 Options 中定义的宏是全局有效的,也就是说你,目标内的所有文件都能识别到这个宏,所以这个宏必须是独一无二的才可。


2、 配置文件属性


通过如下方法可以配置文件的属性,可以让你的文件不属于某一个目标,这样它就不会参与编译了。


打开文件的 Options



去掉 Include in Target Build 勾选(再介绍一下另外几个选项:是否总是编译、总是不编译、改变时编译。如果有工程比较庞大,编译速度很慢,而有些代码一般情况下是不修改的,如官方库函数,此时也可以去掉 Always Build 勾选,这样它就不会总是编译了,事实上如果你使用点击“全部编译”按钮的话,它还是会对它们进行编译):



然后你可以看到你的文件增加了下面这样一个图标(一个文件的 Options 是否是默认的配置,可以通过这个文件图标来看出,灰色部分表示文件和默认的 Options 不一致,如果看到了这个标志,而这个工程你又不熟悉,那么最好打开文件的 Options 选项看看到底有何不同才是,而红色标志表示这个文件已不包含在目标里了,不会参与编译):



之前说过在目标的 Options 的宏定义是影响目标文件的,那么有没有让你的宏定义只设置单独对一个文件有效呢?有,就是在文件的 Options 的 C/C++ 界面中设置即可。



这样你设置的宏定义只对本文件有效。


查看一个文件是否定义(或识别)了某一个宏定义,可以在对应的文件内加入以下宏来确定一个定义是否存在于这个文件中。比如看一个文件是否认识 Debug 这个宏:



这样如果这个文件能识别 Debug,那么就会在编译窗口输出警告,如果这个定义很关键,也可以输出 error 信息,如 #error  “Debug is defined”,这样你就不得不重视它了。因为如果你不设法解决掉这个错误的话,是不能输出目标文件的。



这些都是基本的知识,接下来继续设置和 Simulation 不一样的目标。


Flash(Debug)目标和 Simulation 目标最大的区别就是下载。和 RAM 目标不同,掉电不会消失,因为这个目标的代码是会下载到 Flash(Debug)中的。



这个是配置下载的 FLASH 地址和 RAM 地址,一般采用默认即可。如果你需要固件升级功能则需要修改这里。



在 Debug 选项中选择硬件调试,调试工具选择 ST-Link,勾选 Run to main(),这样下载完成后自动运行到 main 函数中。为了充分利用 KEIL 强大的调试功能,需要添加如下参数:


TARMSTM.DLL

-pSTM32F103RE


现在进入 Setting 界面。如果连接了 ST-Link,那么这里是会显示信息的。并且我一般使用串行下载,所以选择 SW 模式。其他默认即可。



再看另一个 Trace 选项,这个是用来进行代码和数据跟踪的。详情看这个STM32调试利器之ITM


然后是 Flash Download 选项:



一般来说都会勾选 Reset and Run,这样下载后就会自动运行,否则你只能重新上电或者按复位按键才能运行程序了。而添加的编程算法最好和实际的芯片容量一致,比如 STM32F103RET6 FLASH 大小为 512K,这里就选择这个。当然这个编程算法我记得是可以自己编写的,以后有时间可以研究一下。


这样一来,Flash(Debug)目标就算完成了。


现在需要在上面版本的基础上再增加一个 Release 版本,就是用于产品代码正式发布的版本,这个版本要求运行效率高,所以可以从两个方面入手:参数检查功能关闭和提高代码的优化程度。


但是现在有个问题,就是已经有两个目标了,如何才能在 Flash(Debug)目标基础上建立而不是在 Simulation 基础上建立呢?


通过选择当前目标即可:



通过以上四步即可在 Flash(Debug)目标的基础上增加一个 Flash(Release)目标了。


目标建立好了,现在首先关闭该目标的参数检查功能。先选择当前目标为 Flash(Release),然后进行配置:



还可以通过以下方法设置当前目标:



这样一个新的目标就诞生了。但是因为这个目标的代码优化级别更高,代码量更少,所以如果代码书写不严谨,那么可能就会出现问题,主要可能就是有的数据没有使用 volatile 申明,那么代码运行过程中就可能出现问题,这一点要引起注意,如果在 Debug 版本运行没有问题,但是在 Release 版本出现了问题,很可能是这个原因。



-THE END-



如果觉得文章对你有帮助,欢迎转发、分享给朋友,感谢你的支持!


微信公众号「鱼鹰谈单片机

每周一更单片机知识

长按后识别图中二维码关注


    如果对你有帮助,在这里点个好看再走呗


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存