⑴在建立工程之前,我们建议用户在电脑的某个目录下面建立一个文件夹,后面所建立的工程都可以放在这个文件夹下面,这里我们建立一个文件夹为《STM32工程模板》,然后再在该文件夹下新建6个文件夹,分别为:
《CMSIS》 、《Listings》 、《Output》 、《Project》 、《STM32F10x_Stdperiph_Driver》 、《User》 。《CMSIS》用于存放ARM公司提供的内核函数接口文件,《STM32F10x_Stdperiph_Driver》用于存放ST公司的库文件,《Listings》用于存放编译时产生的中间文件,《Output》用于存放生成的下载所需的文件,《Project》用于存放工程文件,《User》用于存放用户文件,即我们自己编写的各种源文件。这六个文件夹是工程项目的主干,为了使我们的工程更加完善,我们可以在添加一个批处理文件(用来清除工程编译调试过程中产生的垃圾文件)和文本文档(用来对工程做一个整体介绍)。最后我们的工程模板文件夹下的文件构成应该是如图所示:
⑵向建立的工程文件夹中添加库文件。
将库文件中的inc和src文件夹复制到模板工程文件夹下的《STM32F10x_Stdperiph_Driver》如图所示
这是ST公司官方库文件,我们需要按照如图所示路径STM32F10x_StdPeriph_Lib_V3.5.0>Libraries>STM32F10x_StdPeriph_Driver将其中的inc和src复制到我们自己的工程的STM32F10x_StdPeriph_Driver文件夹中,如图。
将库文件中DeviceSupport文件夹和CoreSupport文件夹下的相关文件复制到我们自己的工程模板文件夹下的CMSIS文件夹。如图所示。
按图中红框中的路径STM32F10x_StdPeriph_Lib_V3.5.0>Libraries>CMSIS>CM3>DeviceSupport>ST>STM32F10x
目标文件夹下的所有四个文件复制到我们自己工程模板的CMSIS中
同样,如图红框中所示路径,将CoreSupport中的两个文件复制到我们的工程模板的CMSIS中。
最后我们的工程模板中的CMSIS中的文件如图所示
将库文件中Project文件夹下的相关文件复制到工程模板文件夹下的User文件夹中。如图所示。
至此,我们需要添加的库文件已经完成了。
⑶使用MDK(Keil)新建工程模板
打开MDK软件,点击MDK菜单:
Project –>New Uvision Project
,然后将目录定位到刚才建立的工程模板中的Project文件夹下。工程命名为Template(可根据不同项目工程更改),点击保存。
接下来会出现一个选择
Device 的界面,就是选择我们的芯片型号,这里我们定位到 STMicroelectronics
下面的 STM32F103ZE(针对我们的实验箱所用芯片是这个型号,如果使
用的是其他系列的芯片,选择相应的型号就可以了)。
点击 OK,MDK
会弹出一个对话框,如图所示
这里我们直接点击否即可。得到如图所示界面。
更改工程名(将默认的工程名改为“Template”的方法:选中工程,按“F2”键)并右击工程名,选择ManageComponents,得到如图所示。
在Grops里建立三个文件组,如图所示:
并给每一个文件组添加对应文件,将 Groups
定位到USER 下面,添加需要的文件。这里我们的 USER下面我需要添加main.c,stm32f10x_it.c
如图所示。
将Groups定位到CMSIS,CORE下面需要添加的文件为 core_cm3.c,system_stm32f10x.c,startup_stm32f10x_hd.s(注意,默认添加的时候文件类型为.c,也就是添加
startup_stm32f10x_hd.s启动文件的时候,你需要选择文件类型 为 All files
才能看得到这个文件此文件路径为CMSIS->startup->arm)。
将Groups定位到STM32F10x_StdPeriph_Driver将目
录 STM32F10x_FWLib/src
下面的全部文件添加到工程中,这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用
GPIO,我可以只用添加 stm32f10x_gpio.c
而
其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。如图所示
⑷工程配置
在配置工程前,我们首先把 main.c
文件里面的内容替换为如下内容:
int main(void)
{
while(1);
}
配置Target选项卡。具体操作如图所示。
首先点击MDK中的TargetOptions按钮,进入到工程配置界面。
配置Output选项卡,如图所示。
选择 Output。然后勾上下三个选项。
其中 Create HEX file
是编
译生成 hex
文件,BrowserInformation
是可以查看变量和函数定义。还有就是我们要选择
生产的 hex
文件和项目中间文件放在哪个目录,点击“Select folder for Objects…”定位目录,我们的选择定位到我们的工程建立的Output目录下面,点击OK。如图所示。
配置Listing选项卡。如图所示
此步骤与上一步配置Output选项卡一致。
配置C/C++选项卡。
与之前的步骤一样,定位到c/c++界面,然后填写
“STM32F10X_HD,USE_STDPERIPH_DRIVER”到
Define 输入框里面(请注意,两个标识
符中间是英文输入法状态下的逗号不是句号)。这里解释一下,如果你用的是中容量那么 STM32F10X_HD
修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD.
然后点击 OK。
因为我们学校的实验箱使用的是大容量,所以要选择“STM32F10X_HD”如图所示。
下面我们要告诉 MDK,在哪些路径之下搜索需要的头文件,也就是头文件路径。然后同样是在C/C++选项卡,继续点击
Include Paths右边的按钮。弹出一个添加 path
的对话框,然后我们将图上面的 3
个目录添加进去(\USER, \CMSIS,
\ STM32F10x_StdPeriph_Driver\inc)。记住,keil
只会在一级目录查找,所以如果你的目录
下面还有子目录,记得 path
一定要定位到最后一级子目录。然后点击 OK。如图所示
到这里,我们的工程就建立好了,编译程序,我们会看到,没有错误也没有警告,Output文件夹里生成了可下载的HEX文件,如图所示。
⑸完善工程
我们在进行工程的编译和调试过程中会产生大量的中间文件,例如刚才我们新建立的工程,在编译成功后,在Output文件夹和Listings文件夹中共产生了几十兆的文件如图所示:
这些文件在我们需要存储、拷贝传送工程的时候是多余的,所以我们可以通过批处理文件将其在不需要的时候删除,节省工程空间。
步骤:1、在工程文件夹下建立文本文档文件。命名为killkeil.txt
2、在killkeil中添加如下所示内容。
del *.bak /s
del *.ddk /s
del *.edk /s
del *.lst /s
del *.lnp /s
del *.mpf /s
del *.mpj /s
del *.obj /s
del *.omf /s
::del *.opt /s
::不允许删除JLINK的设置
del *.plg /s
del *.rpt /s
del *.tmp /s
del *.__i /s
del *.crf /s
del *.o /s
del *.d /s
del *.axf /s
del *.tra /s
del *.dep /s
del JLinkLog.txt /s
del *.iex /s
del *.htm /s
del *.sct /s
del *.map /s
exit
3、将文本文档的扩展名改为.bat
这时我们的批处理文件就建立好了,当我们建立其他工程时可以直接将批处理文件复制到工程目录下。
Readme文件是对我们的工程做一个详细的介绍例如:项目时间、作者、功能、现象、引脚配置、注意事项等等作者想要表达给用户的一些内容可以在这里说明。例如我们的实验一中的Readme文件:
⑹JLINK
下载与调试程序
在我们所建的工程中,代码比较简单,所以不需要硬件调试,我们直接一次就能成功。可是,如果你的代码工程比较大,难免存在一些 bug,这时,就有必要通过硬件调
试来解决问题了。
串口只能下载代码,并不能实时跟踪调试,而利用调试工具,比如 JLINK、ULINK、STLINK
等就可以实时跟踪程序,从而找到你程序中的 bug,使你的开发事半功倍。这里我们以
JLINK V8 为例,说说如何在线调试 STM32。 JLINK
V8 支持 JTAG
和 SWD,同时 STM32
也支持 JTAG
和 SWD。所以,我们有 2
种方
式可以用来调试,JTAG
调试的时候,占用的 IO
线比较多,而 SWD
调试的时候占用的 IO
线很
少,只需要两根即可。
JLINK V8 的驱动安装比较简单,我们在这里就不说了。在安装了 JLINK V8
的驱动之后,
我们接上 JLINK V8,并把 JTAG
口插到实验箱JLINK接口处,打开之前新建的工程,打开 Options
for Target 选项卡,在 Debug
栏选择仿真工具为 Cortex-M/R J-LINK/J-Trace如图所示:
上图中我们还勾选了 Runto main(),该选项选中后,只要点击仿真就会直接运行到
main 函
数,如果没选择这个选项,则会先执行 startup_stm32f10x_hd.s
文件的 Reset_Handler,再跳到 main
函数。
然后我们点击 Settings,设置 J-LINK
的一些参数,如图所示:
图中,我们使用 J-LINKV8
的 SW
模式调试,因为我们 JTAG
需要占用比 SW
模式多很多的 IO
口,而在我们的实验箱上这些 IO
口可能被其他外设用到,可能造
成部分外设无法使用。所以,我们建议大家在调试的时候,一定要选择 SW
模式。Max Clock,
可以点击 Auto Clk
来自动设置,图中我们设置 SWD
的调试速度为 10Mhz,这里,如果你的 USB
数据线比较差,那么可能会出问题,此时,你可以通过降低这里的速率来试试。
单击 OK,完成此部分设置,接下来我们还需要在 Utilities
选项卡里面设置下载时的目标编程器,如图所示:
图中,我们选择 J-LINK来调试
Cortex M3,然后点击 Settings,设置如图所示:
这里要根据不同的MCU选择
FLASH 的大小,因为我们实验箱使用的是 STM32F103ZET6,
其 FLASH
大小为 512KB,所以我们点击 Add,并在
Programming Algorithm 里面选择 512K
型
号的 STM32。然后选中 Resetand Run
选项,以实现在编程后自动启动,其他默认设置即可。
设置完成之后,如上图所示。
在设置完之后,点击 OK,然后再点击
OK,回到 IDE
界面,编译一下工程。接下来我们
就可以通过 JLINK
下载代码和调试代码。
配置好 JLINK
之后,使用 JLINK
下载代码就非常简单,大家只需要点击 LOAD
按钮就可以进行程序下载。下载完成之后程序就可以直接在开发板执行。我们也可以用JLINK
进行程序仿真。点击开始仿真如果开发板的代码没被更新过,则会先更新代码,再仿真,你也可以通过按,只下载代码,而不进入仿真。
作者:燕山大学电气工程学院李兴浩
如果错误欢迎指正批评,转载请标明来源和作者