IAR forARM 建立第一个STM32F051的工程

一.自己画了个板子,打样后,自己测试。部分原理图如下:

IAR forARM 建立第一个STM32F051的工程

二.现在建立工程,编写程序来点亮这5个LED灯。

1.好的程序员自己写程序,优秀的程序员偷别人的程序。所以从ST官网上下载相应的资料en.stm32f0_stdperiph_lib.ZIP,解压到当
前文件夹得到STM32F0xx_StdPeriph_Lib_V1.5.0文件夹,打开后文件目录如下图:

IAR forARM 建立第一个STM32F051的工程
其中,_htmresc(html rescource)文件夹的目录下就三张图片
            
IAR forARM 建立第一个STM32F051的工程

           Utilities文件夹下是ST公司的评估板的应用Examples以及第三方支持工具补丁,暂时不关心;    
         MCD-ST Liberty SW License Agreement.pdf和 V2Release_Notes(html)顾名思义,暂时也不关心;
         stm32f0xx_stdperiph_lib_um这个文件是介绍如何使用STM32F0xx Standard Peripherals Firmware Library以及如何建立
         工程,需要重点关注;
            Libraries文件夹里是CMSIS库文件、STM32F0xx Standard Peripherals Firmware Library和STM32F0xx_CPAL_Driver(
            这个是干嘛的,现在我不是很清楚),该文件夹里的内容也需要重点关注;
            Projects文件夹下是一些工程模板和STM32F0xx_StdPeriph_Examples,该文件夹下的内容也需要重点关注;

2.说了那么多,可以知道ST给出的用IAR建立的工程模板在\:\STM32F0xx_StdPeriph_Lib_V1.5.0\Projects\STM32F0xx_StdPeriph_Templates\EWARM
目录下,如下图:

IAR forARM 建立第一个STM32F051的工程

箭头所指的Project就是ST官网给的模板工程,用IAR打开它看看。

IAR forARM 建立第一个STM32F051的工程
从图上可以看出文件目录结构有四个Group:CMSIS存放的是STM32F0xx CMSIS files;StdPeriph_Driver存放的是STM32F0xx Standard Peripheral's Driver files;
User存放的是main.c和stm32f0xx_it.c(stm32f0xx中断处理文件);Output程序输出Group。

Tips:在workspace toolbar选择工程配置,可以改变当前编译的对象(device 型号,默认是stm32f051),如下图:

IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程
注意观察上图中箭头所指地方的变化。

3.因为是要建立STM32F051的工程,所以我们选择STM32F051来编译一下。在Project - STM32F051上右击,选择Rebulid All,观察Message窗口的报错。

IAR forARM 建立第一个STM32F051的工程
按照上图所示操作后,我们惊讶的发现编译器报了一堆错误,如右上图。不过别担心我们一个一个错误来定位解决。

4.先看第一个错误,

IAR forARM 建立第一个STM32F051的工程

Fatal Error(致命错误):找不到源文件stm32f0xx.h,下面四行是编译器的四个搜索目录。大家应该注意到了,第一个目录就是工程文件的上一级目录,其他三个目录都是IAR编译器的安装文件的相关目录(为什么编译器会去找这几个目录,我也不是很清楚),结果就是都没有找到stm32f0xx.h这个文件。我们可以实际点开相关的目录来查看,也没有stm32f0xx.h这个文件。

Tips:既然编译器要找这个文件,说明有那个文件里include了stm32f0xx.h。双击上图中的Fatal Error或者四个searched目录行,可以在编辑窗口打开编译出错的第一地方,可以看见是什么文件include了stm32f0xx.h如下图:

IAR forARM 建立第一个STM32F051的工程

可以看见是main.h里面include了stm32f0xx.h。

5.解决第一个错误,首先要找到源文件stm32f0xx.h的所在目录,然后再告诉编译器这个目录,这样编译器在编译的时候就会在相应的目录里找寻目标文件。\:\ST\STM32F0xx_StdPeriph_Lib_V1.5.0\Libraries\CMSIS\Device\ST\STM32F0xx\Include这个目录下有stm32f0xx.h。如下图:

IAR forARM 建立第一个STM32F051的工程

然后再告诉编译器,编译的时候,要搜索这个目录。在Addtional include directories下添加路径,操作如下:

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

点击OK,我们再来编译看看结果如何。

Tips:这里有必要说明一下相对路径和绝对路径,绝对路径是说严格按照所给的路径,比如C:\Desktop\ST\STM32F0xx_StdPeriph_Lib_V1.5.0\Libraries\CMSIS\Device\ST\STM32F0xx\Include,
编译器会严格按照这个顺序一层一层的找。假设那天你把工程文件拷贝到另一个文件夹里,那么是不是意味着需要要重新添加或者改变路径呢?这样会很麻烦。所以用相对路径就不会有这个问题了,改的方法如下:

IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程

这样就不会出现工程拷贝到另外一个目录,需要再添加文件路径的问题。(左上图中第三个$TOOLKIT_DIR$\..\..\这个是干嘛的,我也不是很清楚)


IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程

会发现,错误还是24个,但是第一个错误已经不是找不到源文件stm32f0xx.h了,而是在stm32f0xx.h里没有选择相应的device型号(是STM32F051还是STM32F030呢?)。

6.解决新的第一个错误,双击上图中的箭头所指的错误,在编辑窗口中打开了错误的位置,如左下图:

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

如右上图中所示,把#define STM32F051的这行宏定义的注释符去掉,就等于把target device设置成了STM32F051。保存save all,再重新编译,看看结果如何。

IAR forARM 建立第一个STM32F051的工程

可以看出,错误只剩下21个,并且搜索路径变成了5个,多出的一个就是我之前新添加的。可以发现这些错都是找不到StdPeriph_Driver这个Group里的stm32f0xx_ppp.c文件对应的stm32f0xx_ppp.h文件。
这些文件在下图所示的目录下:

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

把这个路径添加以下,选用相对路径如右上图,再编译观察结果如下图:

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

从上图可以看出,只有一个错误,但是好几百个警告。并且编译器的第一个就是警告,这个警告是为我们少了一个宏定义,把他的注释符去掉就可以了。如下图:

IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程

关于这个问题的说明在 二.1里提到的stm32f0xx_stdperiph_lib_um这个文件里有说明。

Tips:注意解决错误或者warning要从第一个地方下手,这在学C语言的时候已经知晓的,此处不再赘述。

再保存,然后编译,再查看结果。如下图:


IAR forARM 建立第一个STM32F051的工程

IAR forARM 建立第一个STM32F051的工程

从上图中得知,错误还剩下21个,但其实是一个错误,就是找不到stm32f0xx_conf.h,这个文件在如下图所示的目录中:

IAR forARM 建立第一个STM32F051的工程

把他添加到编译器的搜索目录下,如下图:

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

再保存,再编译,看看结果如何。

IAR forARM 建立第一个STM32F051的工程

终于没有错误了。

三、添加程序,点亮LED灯。

1.开main.c添加如下程序,

IAR forARM 建立第一个STM32F051的工程
2.编译,下载发现LED灯亮了。

Tips:以上是在ST官方的的工程基础上修改的,实现点亮LED灯。但是这个工程里包含很多的文件分散在很多个不同的目录里,使用起来很不方便。比如需要把整个工程发给别人时,同时要把好多
不相关的文件发过去。还有一些相关的设置,我们也不是很清楚。下面,我们来跟深入的理解文件的目录结果,选择必要的文件。从零开始建立工程。

四、从零开始建立STM32F051工程。
1.在桌面新建一个名为“01STM32F051”的文件夹,这里面要存放很多各种各样源文件、头文件、工程文件以及编译输出的文件。参考ST官方工程的Group架构,我们新建名为“CMSIS”、“User”和“App”三个文件夹,其中App用来存放用户自己开发的应用程序文件,在“App”文件夹下新建“inc”和“src”两个文件夹,“inc”用来存放头文件,“src”用来存放源文件。拷贝C:\\ST\STM32F0xx_StdPeriph_Lib_V1.5.0\Libraries路径下的(如下图)“STM32F0xx_StdPeriph_Driver"文件夹到”01STM32F051"下。

IAR forARM 建立第一个STM32F051的工程

此时“01STM32F051”文件夹下的目录结构如下:

IAR forARM 建立第一个STM32F051的工程

2.现在除了“STM32F0xx_StdPeriph_Driver"文件夹,其它的文件夹里面都是空的,现在我们往每个文件夹里添加文件。 打开下图中的stm32f0xx_stdperiph_lib_um这个文件,在Main Page里面点击STM32F0xx_CMSIS files.

IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

在右上图中,可以看到CMSIS包含哪些文件,以及每个文件的介绍以及一些简单的用法。现在我们就拷贝右上图中的4个文件到CMSIS文件夹里。其中stm32f0xx.h和system_stm32f0xx.h这两个头文件在如下图的目录下,

IAR forARM 建立第一个STM32F051的工程

其中system_stm32f0xx.c在如下图目录下,

IAR forARM 建立第一个STM32F051的工程


其中startup_stm32f051.s在如下图的目录***意下图中的中的arm、iar、gcc_ride7和TrueSTUDIO都是编译器,每个编译器的device startup file不一样。我们用的是iar所以选择下图箭头所指示目录的下的
startup_stm32f051.s文件。

IAR forARM 建立第一个STM32F051的工程


Tips:细心的同学会发现上图中有startup_stm32f0xx.s和startup_stm32f0xx_ld.s这两个文件,这两个文件是干嘛的,建立工程需不需要用,我也不是很清楚。先不管,等一下建立工程编译的时候,看看有没有什么异常。

3.拷贝main.c、main.h、stm32f0xx_conf.h、stm32f0xx_it.c和stm32f0xx_it.h到User文件夹中,这些文件在下图所示的路径中,

IAR forARM 建立第一个STM32F051的工程
细心的朋友也许会发现上图中的目录下也有一个system_stm32f0xx.c这个文件。那么这个文件和我们已经拷贝到CMSIS这个文件夹的system_stm32f0xx.c文件有什么区别呢?(用记事本打开这两个文件比较
发现,除了被注释掉的说明部分有些区别外,其代码部分一样)

4.打开IAR建立一个工程,按照下图的步骤。

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程

这时候再看看”01STM32F051“这个文件夹下

IAR forARM 建立第一个STM32F051的工程

5.在工程里添加4个Group,CMSIS,StdPeriph_Driver和User,如下图,然后记得要保存。

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

6.往每个Group里添加文件,把startup_stm32f051.s和system_stm32f0xx.c添加CMSIS这个Group里。如下图,

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程


Tips:右上图的两个.h文件不用添加到Group里。如果不添加的话,那么编译器在编译的时候怎么找到这两个文件呢?还记得前一部分我们说的向编译器里添加搜索路径的内容,就是通过这样的方式,把文件相互关联起来。

7.往StdPeriph_Driver这个Group里添加文件,如下图,

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

8.往User这个Group里添加文件,如下图,

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

9.保存一下,现在我们来对工程进行一些设置。

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

选择Core和Device,stm32f051c8t6是cortex M0内核的,如下图,
IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

改为相对路径,另外C:\\Desktop\01STM32F051\App\inc这个目录里虽然什么都没有,但是以后开发的时候会在里面放置application.h文件,所以现在也把他的目录添加编译器的搜素目录下。

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程

因为我的烧录工具是ST-LINK,所以选择选择ST-LINK,大家可以根据自己的烧录工具来选择相应的Driver。

10.保存一下,然后按下图操作,

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

11.按下图所示插入图中代码,编译链接,下载,

IAR forARM 建立第一个STM32F051的工程

12.单步调试至如下图是,5个LED灯全亮。

IAR forARM 建立第一个STM32F051的工程

13.继续单步调试,则5个LED灯全灭,程序停在while(1)处。

IAR forARM 建立第一个STM32F051的工程

Tips:点开main.c前面的+号,可以看见main.c文件里包含(包括嵌套包含)的头文件,如左下图;在任意一个头文件上右击选择File Properties

IAR forARM 建立第一个STM32F051的工程
IAR forARM 建立第一个STM32F051的工程

可以看到文件的location,这个是iar编译器的安装目录。(在安装iar时或者iar后,可以随时选择安装iar支持的各个厂商的各个型号的device,否则编译器可能无法为我们所用。)这个从这个文件的名称可以看出它的作用,二者结合有助于我们理解编译器和我们的工程里的文件是怎么紧密结合在一起的。

IAR forARM 建立第一个STM32F051的工程

Tips:若设置工程时,不勾选左下图中的Use CMSIS选项,则编译会提示右下图的错误。

IAR forARM 建立第一个STM32F051的工程IAR forARM 建立第一个STM32F051的工程

为什么呢?是因为core_cm0.h是CMSIS的一个重要文件,但是呢?我们告诉编译器的搜索路径里根本没有这个文件,所以会报错。解决的方法1:勾选Use CMSIS选项,让编译器用iar自己安装时一起下载的core_cmo.h文件。解决方法2:其实ST的官方资料里,已经给出这些必要的文件。我们可以把这些文件拷贝到工程目录下,或者工程目录下新建的或者任意的文件夹下,然后把这目录添加到编译器的搜索路径,就可以解决问题。ST官方的打包资料里的相应文件在下图所示的目录里,

IAR forARM 建立第一个STM32F051的工程

Tips:更多的编译原理以及相应设置使用文件,我也在学习中,需要继续深入。