STM32标准库新建工程教程
一、新建工程1.1新建文件夹
在建立工程之前,我们建议用户在电脑的某个目录下面建立一个文件夹,后面所建立的工程都可以放在这个文件夹下面,这里我们建立一个文件夹为NNHP01Test。
1.2文件夹分类
在NNHP01Test文件夹中分别建立BasicSYSTEM、CORELIB、DriverCode、Output、STM32F10xFWLib、Project这六个文件夹。方便分类管理代码。
1.3新建工程文件
点击MDK的菜单:Project–>New Uvision Project ,然后将目录定位到刚才建立的文件夹NNHP01Test之下,然后定位到这个目录下面的子文件夹Project(我们的代码工程文件都是放在Project目录),我们的工程文件就都保存到USER文件夹下面。工程命名为NNHP01Test,点击保存。
图3.3.1
图3.3.2
1.4选择CPU
接下来会出现一个选择CPU的界面,就是选择我们的芯片型号。如图3.3.3所示,因为NNHP启航STM32F103所使用的STM32型号为STM32F103VET6,所以在这里我们选择STMicroelectronicsSTM32F1 SeriesSTM32F103STM32F103VET6(如果使用的是其他系列的芯片,选择相应的型号就可以了,特别注意:一定要安装对应的器件pack才会显示这些内容哦!!,如果没得选择,请关闭MDK,然后安装光盘:6,软件资料\1,软件\MDK5\
Keil.STM32F1xx_DFP.1.0.5.pack这个安装包)。
图3.3.3
1.5Manage Run-Time Environment对话框
点击OK,MDK会弹出Manage Run-Time Environment对话框,如图3.3.4所示:
图3.3.4
1.6建成页面
这是MDK5新增的一个功能,在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境,不过这里我们不做介绍。所以在图3.3.4所示界面,我们直接点击Cancel,即可,得到如图3.3.5所示界面:
图3.3.5
到这里,我们还只是建了一个框架,还需要添加启动代码,以及.c文件等。
1.7工程所包含文件
现在我们看看Project目录下面包含2个文件夹和2个文件,如下图3.3.6所示。
图3.3.6
这里我们说明一下,NNHP01Test.uvprojx是工程文件,非常关键,不能轻易删除。Listings和Objects文件夹是MDK自动生成的文件夹,用于存放编译过程产生的中间文件。这里,为了跟MDK5.1之前版本工程兼容,我们把两个文件夹删除,我们会在下一步骤中新建一个OBJ文件夹,用来存放编译中间文件。当然,我们不删除这两个文件夹也是没有关系的,只是我们不用它而已。
下面我们要将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。
打开官方固件库包,定位到我们之前准备好的固件库包的目录
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver下面,将目录下面的src,inc文件夹copy到我们刚才建立的STM32F10xFWLib文件夹下面。
src存放的是固件库的.c文件,inc存放的是对应的.h文件,您不妨打开这两个文件目录过目一下里面的文件,每个外设对应一个.c文件和一个.h头文件。
图3.3.7
图3.3.8
下面我们要将固件库包里面相关的启动文件复制到我们的工程目录CORELIB之下。
打开官方固件库包,定位到目录
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport下面,将文件core_cm3.c和文件core_cm3.h 复制到CORELIB下面去。然后定位到目录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下面,将里面startup_stm32f10x_hd.s文件复制到CORELIB下面。这里我们我之前已经解释了不同容量的芯片使用不同的启动文件,我们的芯片STM32F103VET6是大容量芯片,所以选择这个启动文件。
现在看看我们的CORELIB文件夹下面的文件如图3.3.9:
图3.3.9
图3.3.10
图3.3.11
1.8定位到目录
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下面,将里面的三个文件stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,复制到我们的Project目录之下。
然后将STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下面的4个文件main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h复制到Project目录下面。
图3.3.12
图3.3.13
图3.3.14
二、运行工程
2.1添加文件
前面8个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。右键点击Target1,选择Manage Project Items。
图3.3.15
Project Targets一栏,我们将Target名字修改为NNHP01Test,然后在Groups一栏删掉一个Source Group1,建立三个Groups:USER,CORELib,STM32F10xFWLib。然后点击OK,可以看到我们的Target名字以及Groups情况。
图3.3.16
图3.3.17
下面我们往Group里面添加我们需要的文件。我们按照步骤10的方法,右键点击点击Tempate,选择选择Manage Project Itmes,然后选择需要添加文件的Group,这里第一步我们选择FWLIB,然后点击右边的Add Files,定位到我们刚才建立的目录STM32F10xFWLib/src下面,将里面所有的文件选中(Ctrl+A),然后点击Add,然后Close.可以看到Files列表下面包含我们添加的文件。
这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用GPIO,我可以只用添加stm32f10x_gpio.c而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。
图3.3.18
用同样的方法,将Groups定位到CORELIB和Project下面,添加需要的文件。这里我们的CORE下面需要添加的文件为core_cm3.c,startup_stm32f10x_hd.s(注意,默认添加的时候文件类型为.c,也就是添加startup_stm32f10x_hd.s启动文件的时候,你需要选择文件类型为All files才能看得到这个文件),USER目录下面需要添加的文件为main.c,stm32f10x_it.c,system_stm32f10x.c.
这样我们需要添加的文件已经添加到我们的工程中了,最后点击OK,回到工程主界面。
图3.3.19
图3.3.20
图3.3.21
图3.3.22
图3.3.23
2.2编译工程
在编译之前我们首先要选择编译中间文件编译后存放目录。方法是点击魔术棒data:image/png;base64,/9j/4AAQSkZJRgABAQEAkACQAAD/2wBDAAoHBwkHBgoJCAkLCwoMDxkQDw4ODx4WFxIZJCAmJSMgIyIoLTkwKCo2KyIjMkQyNjs9QEBAJjBGS0U+Sjk/QD3/2wBDAQsLCw8NDx0QEB09KSMpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT3/wAARCAAzADoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1n7Ref8+i/wDfz/61H2i8/wCfRf8Av5/9ai31NLi4WHypUZgSNw9KWTmZ+Tx71UVcluwn2i8/59F/7+f/AFqPtF5/z6L/AN/P/rUm33P5013jixvfbk4GW6mnyIXOP+0Xn/Pov/fz/wCtR9ovP+fRf+/n/wBaqg1KzN+bIXK/aQMmPJzirkfEycnn3o5V3HzNboT7Ref8+i/9/P8A61H2i8/59F/7+f8A1qfYXZvI5WZQuyVo+O+DVqoKMa2OdVgx/carz/65/wAKzrCEQX9rEpYhI2ALHJ7Vov8A65/wq4ETKWp38VhbEySiN3BCEqSM49q4S11gPfQ2mvRtdSczW8rHbz1AB6bW4wOo71oeOtbt0tkjjS4aSGYozoSoXjkZ75Bq2dO0vxf4fjsfLkikgiRo2YfPESOCD36VtKjopO/9f0jONRp6GimrxW+nLqGoWb28mfLCgbjjPHTPpW3Ed0sZHQ8/pXC6B4gutHvx4e8TY8zpb3DfdlXtz613Uf8Aro8dKhxaK5k+hDov+ouf+vmT+daVZui/6i5/6+ZP51pViamPZxzNqUTtBJGiqwJYVbmBMkoHU/4U3+27H/nuPyNQvqens5b7SQT6Cqi7EyVzA0vwzKLic6okLwyKvyq5bLBs7jn8Kl0/RLy18Qtdv5S2/wA4+RzlgfugjpxWz/aNh/z9H8qP7RsP+fo/lW7rt9fzMlSsQ6voVhrkSR6hAJAjblIJDA+xHNaEShZI1HQcD8qq/wBo2H/P0fypU1PT1cN9pJI9RWfMi+Vj9F/1Fz/18yfzrSrNi1TTYAwilVQzFjgHknqaf/bdj/z3H5GsjQ4qiiigAooooAKKKKACiiigD//Z,然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面新建的OBJ目录。这里大家注意,如果我们不设置Output路径,那么默认的编译中间文件存放目录就是MDK自动生成的Objects目录和Listings目录。
图3.3.24
图3.3.25
下面我们点击data:image/png;base64,/9j/4AAQSkZJRgABAQEAkACQAAD/2wBDAAoHBwkHBgoJCAkLCwoMDxkQDw4ODx4WFxIZJCAmJSMgIyIoLTkwKCo2KyIjMkQyNjs9QEBAJjBGS0U+Sjk/QD3/2wBDAQsLCw8NDx0QEB09KSMpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT3/wAARCAAyADUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1Tz0/587n8v8A69S/2g3/AD6XH/fI/wAauUU27iSSKf8AaDf8+lx/3yP8aP7Qb/n0uP8Avkf41b3ptLbl2r1OeBQXQbcso3cLz1+lIZU/tBv+fS4/75H+NH9oN/z6XH/fI/xq3vTeU3LvAztzziloAp/2g3/Ppcf98j/GirhIHXFFAEdvMJ4VkClc9iKfI4ijZ2+6oJP0qKzJa1Qtu6cbhjikvzjT7k+kTfyNAFBLYXGnPcfaFVZFd0JTCbW6bl74qpb3Ftc3/krdw745kxvIYP8AJj92P4fwqfSb3Gi2aNA7qYoxwAQcj+lZ9nZ2mm3899HY3DyMrMikD5MHGBz1PWt4KNpc2/Qzbd1Y1USLTNTto3lLm4j8mMsu5yVyx3P6YrWrmb69N14h0dfKePy7iRfm/i/d9RXTVi0WjM1TV7XTpI0uHKswyPk3cUVy/j+by9QtR6xH+dFaRgmiHKzO7qK6iM9pNEpAMiMoJ7ZGKb9ttv8AnvH/AN9Cj7bbf894/wDvoVkaHMQeHNagt4ohPpreWEAZo3ydvTvSHw1qzKVL6XgqVxsk6E5Pf1rqPttt/wA94/8AvoUfbbb/AJ7x/wDfQq+dk8qOdsvDeox6xbXd1NZ+XDI0jLCjAsxXb3NdTUH222/57x/99Cj7bbf894/++hUtt7jSsc74s8K3XiC7gltrmGERoVIkUnPOe1FdF9ttv+e8f/fQopqbWgnFM5ravoPyo2r6D8qKKskNq+g/KjavoPyoooANq+g/KjavoPyoooANq+g/KiiigD//2Q==编译按钮编译工程,可以看到很多报错,因为找不到头文件。
图3.3.26
下面我们要告诉MDK,在哪些路径之下搜索需要的头文件,也就是头文件目录。这里大家要注意,对于任何一个工程,我们都需要把工程中引用到的所有头文件的路径都包含到进来。回到工程主菜单,点击魔术棒data:image/png;base64,/9j/4AAQSkZJRgABAQEAkACQAAD/2wBDAAoHBwkHBgoJCAkLCwoMDxkQDw4ODx4WFxIZJCAmJSMgIyIoLTkwKCo2KyIjMkQyNjs9QEBAJjBGS0U+Sjk/QD3/2wBDAQsLCw8NDx0QEB09KSMpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT3/wAARCAAzADoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1n7Ref8+i/wDfz/61H2i8/wCfRf8Av5/9ai31NLi4WHypUZgSNw9KWTmZ+Tx71UVcluwn2i8/59F/7+f/AFqPtF5/z6L/AN/P/rUm33P5013jixvfbk4GW6mnyIXOP+0Xn/Pov/fz/wCtR9ovP+fRf+/n/wBaqg1KzN+bIXK/aQMmPJzirkfEycnn3o5V3HzNboT7Ref8+i/9/P8A61H2i8/59F/7+f8A1qfYXZvI5WZQuyVo+O+DVqoKMa2OdVgx/carz/65/wAKzrCEQX9rEpYhI2ALHJ7Vov8A65/wq4ETKWp38VhbEySiN3BCEqSM49q4S11gPfQ2mvRtdSczW8rHbz1AB6bW4wOo71oeOtbt0tkjjS4aSGYozoSoXjkZ75Bq2dO0vxf4fjsfLkikgiRo2YfPESOCD36VtKjopO/9f0jONRp6GimrxW+nLqGoWb28mfLCgbjjPHTPpW3Ed0sZHQ8/pXC6B4gutHvx4e8TY8zpb3DfdlXtz613Uf8Aro8dKhxaK5k+hDov+ouf+vmT+daVZui/6i5/6+ZP51pViamPZxzNqUTtBJGiqwJYVbmBMkoHU/4U3+27H/nuPyNQvqens5b7SQT6Cqi7EyVzA0vwzKLic6okLwyKvyq5bLBs7jn8Kl0/RLy18Qtdv5S2/wA4+RzlgfugjpxWz/aNh/z9H8qP7RsP+fo/lW7rt9fzMlSsQ6voVhrkSR6hAJAjblIJDA+xHNaEShZI1HQcD8qq/wBo2H/P0fypU1PT1cN9pJI9RWfMi+Vj9F/1Fz/18yfzrSrNi1TTYAwilVQzFjgHknqaf/bdj/z3H5GsjQ4qiiigAooooAKKKKACiiigD//Z,出来一个菜单,然后点击c/c++选项.在Preprocessor Symbols-->Define。在Define输入框里面(请注意,两个标识符中间是逗号不是句号,如果您不能确定您输入的是正确的,请直接打开我们资料中任何一个库函数实例,然后复制过来这串文字即可)。这里解释一下,如果你用的是中容量那么STM32F10X_HD修改为STM32F10X_MD,小容量修改为STM32F10X_LD 。然后点击Include Paths右边的按钮。弹出一个添加path的对话框,然后我们将图上面的3个目录添加进去。记住,keil只会在一级目录查找,所以如果你的目录下面还有子目录,记得path一定要定位到最后一级子目录。然后点击OK.
图3.3.27
图3.3.28
图3.3.29
接下来,我们再来编译工程,可以看到又报了一个错误。
图3.3.30
下面我们修改代码,我们记得打开工程USER下面的main.c文件,复制下面代码到main.c覆盖已有代码,然后进行编译。(记得在代码的最后面加上一个回车,否则会有警告),可以看到,这次编译已经成功了。
#include "stm32f10x.h"
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //LED1-->;PE.0 ,LED2-->;PE.1端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE.0,1
GPIO_SetBits(GPIOE,GPIO_Pin_0|GPIO_Pin_1); //PE.0,PE.1 输出高
while(1)
{
GPIO_ResetBits(GPIOE,GPIO_Pin_0);
GPIO_SetBits(GPIOE,GPIO_Pin_1);
Delay(3000000);
GPIO_SetBits(GPIOE,GPIO_Pin_0);
GPIO_ResetBits(GPIOE,GPIO_Pin_1);
Delay(3000000);
}
}
图3.3.31
2.3配置文件
这样一个工程模版建立完毕。下面还需要配置,让编译之后能够生成hex文件。同样点击魔术棒,进入配置菜单,选择Output。然后勾上下三个选项。其中Create HEX file是编译生成hex文件,Browser Information是可以查看变量和函数定义。
图3.3.32
重新编译代码,可以看到在Output目录下面生成了NNHP01Test.hex文件,这个文件我们用flymcu下载到mcu即可(程序下载章节)。到这里,一个基于固件库V3.5的工程模板就建立了。
这样一个工程模版建立完毕。如果使用仿真器下载程序(记得先插仿真器到电脑才会有如下界面),还需要配置仿真器。同样点击魔术棒,进入配置菜单,选择Debug。然后选择USE并下拉选择自己对应的仿真器,我们的板子默认使用ST-LINK,所有选择ST-LINK Debugger。然后点击settings,在debug标签中,port选择SW,MAX是下载速度,尽量选择大一点的。
图3.3.33
图3.3.34
图3.3.35
图3.3.36资料下载链接:链接:https://pan.baidu.com/s/1GXd8X9kH1xJfvd5y03_eSQ 提取码:074k
页:
[1]