手把手学STM32(一)构建工程
这篇文章详细的介绍编写第一个固件工程(F103ZET6版本的)。文档里的操作部分我使用了黄色背景色标出,如觉麻烦,可直接参考黄色部分。
资料下载链接:https://pan.baidu.com/s/1nmjR5SxauIyVWej46-YE1A
提取码:stu8
*
一.编程的简单逻辑
- 在开始之前,需要有一个清晰的思路。首先问三个问题
1.你的需求是什么?也就是完成什么功能
2.怎么做?(也就是你设计的思想是啥,怎么设计完成)
3.具体的实现(代码怎么写)
二. 工程结构
明确了思路之后。我们首先要构建一个工程。那么工程怎么构建的呢?一个工程由什么组成。正点原子给的模板是这样的。实际上这些文件夹没有起对程序影响作用,但是都放到一起会导致层次比较混乱。最好养成一个良好的编程习惯,分层级。把不同的程序分成几个不同的文件夹存放。来我们找一个工程看一下工程的架构。首先我们打开一个例程 战舰V3\战舰V3 资料盘(A盘)\4,程序源码\2,标准例程-库函数版本\2,标准例程-库函数版本\实验1 跑马灯实验
1)CORE
路径在\战舰V3\战舰V3 资料盘(A盘)\8,STM32参考资料\1,STM32F1xx固件库\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport它里面存放的代码是一些关于芯片的核心驱动。这个代码我们一般自己不要改动。构建工程的时候照搬就可以。所有的例程里这些东西都是一样的。
打开看一下有三个文件一个.h结尾一个.c结尾一个.s结尾的文件,前两个个文件是context-3系列内核的驱动。.c存放代码 .h存放函数的声明和变量的宏定义 .s文件是启动文件,如果你用的是F1系列的就选这个,但是这个启动文件有三种
路径在战舰V3\战舰V3 资料盘(A盘)\8,STM32参考资料\1,STM32F1xx固件库\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
startup_stm32f10x_ld.s: 适用于小容量 产品
startup_stm32f10x_md.s : 适用于中等容量产品
startup_stm32f10x_hd.s: 适用于大容量产品.
这里的容量是指 FLASH 的大小.判断方法如下:
小容量:FLASH≤32K
中容量:64K≤FLASH≤128K
大容量:256K≤FLASH
我们ALIENTEK STM32战舰板,精英板以及mini板采用的STM32F103ZET6和stm32F103RCT6
芯片都属于大容量产品,所以我们的启动文件选择 startup_stm32f10x_hd.s,
它的作用是启动文件主要是进行堆栈之类的初始化,中断向量表(中断处理的函数名已经起好了,不能自己另外起中断处理名的,但中断处理函数体为空,自己写函数体内容)以及中断函数定义。
上面的是拓展知识,初学者就算弄不懂,暂时也没太大关系。总之就把他们三个拷贝过来就可以。
2)FWLIB
路径为\战舰V3\战舰V3 资料盘(A盘)\8,STM32参考资料\1,STM32F1xx固件库\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver。其他板子同理目录结构相似。即固件库的意思。它主要用于存放STM32的一些寄存器的定义及一些底层驱动函数。打开之后如下图,有两个文件夹。
一个叫inc一个叫src inc里面包含的是我们上面说过的.h文件也就是头文件.。src里面包含的是.c文件。
inc
src
这两个里面的东西我们先不管(后面给大家讲里面的东西),直接复制过来,我们可以看到他们的不一样的部分其实是一些外设的底层的驱动。第二个文件夹直接复制过来。
3)OBJ
这个文件夹先空着,把这个文件夹当做一个存放编译过程的中间文件的东西。
4)README
这个文件夹下放的文档是用来给自己写代码的注释和用法的文本文档。先在里面放一个空的文本文档。备用。
5)STSTEM
打开里面有三个文件夹,第一个delay用于存放延时函数
第二个sys用于存放系统函数
第三个usart 用于存放串口1的函数(里面有串口打印函数以及串口1中断函数)
把这个SYSTEM文件夹整体复制过来.
三.实战演练
到这里准备工作参不多了。接下来在桌面新建一个文件夹给它命名为第一篇_我的工程
打开文件夹“第一篇_我的工程”把刚才准备的四个文件夹放进去,再在里面新建一个文件夹命名叫USER
打开keiluV5软件,左上角project
然后点第一个new uVersion project 然后选择保存路径为刚刚建好的USER目录。这里我,给你的工程命名。我命名为FRIST_PRO工程名字最好是英文。
点击保存,然后会弹出这个界面。我们可以看到左上角的CPU。这个就是选择我们的芯片
我们1.点击STMicroeletronics前面的加号,
2.再点击STM32F1 Series(选芯片) 前的加号又会出现一排,
3. STM32F103 前的加号,这时候会出现一列绿色的东西,这个绿色的东西就是芯片,对于战舰版和精英板选择STM32F103ZE,对于mini板来说选择STM32F103RC。点击OK
点确定后出现
点击OK,它自己关闭了。然后就可以看到左上角的project栏的工程建好了。
然后我们返回桌面查看USER文件夹,这时我们会发现文件夹下多了几个文件
接下来我们需要复制一些文件,打开路径J:\战舰V3\战舰V3 资料盘(A盘)\8,STM32参考资料\1,STM32F1xx固件库\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下复制下面三个文件到USER.
还要复制一些别的文件在路径战舰V3\战舰V3 资料盘(A盘)\8,STM32参考资料\1,STM32F1xx固件库\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下复制下面四个文件
Copy完的USER目录下应该新增了7个文件,最后将USER的main.c替换成跑马灯实验里的main.c文件。路径在战舰V3\战舰V3 资料盘(A盘)\4,程序源码\2,标准例程-库函数版本\2,标准例程-库函数版本\实验1 跑马灯实验\USER\main.c到这里我们就把所有的文件复制完了。
接下来我们需要到MDK里把这些文件加到我们工程里来。现在只是在目录里并没有在工程中。打开keil5选中左上角的target1 然后点击三个方块 manage Projiect
把target1的名字改成FIRST_PRO,然后点击new(insert)接着新建六个文件夹然后给他们命名如下。
建完目录之后点击Add files ,找到与名字相应的目录把.C文件添加进去。
这里要注意的一点是添加core里的文件的时候,首先选择文件类型为ALL files,然后选中.c后缀与.s后缀的两个文件,关闭。点击FWLIB文件夹的之后会出现两个目录选择src目录打开ctrl+A全选,然后点击ADD.(实际上使用哪个选哪个就可以,这里我们就当做介绍使用全选)
然后就是最后一步将头文件也加到工程中点击魔术棒
然后选C/C++然后点…
出现下图,点击1点击2,然后找到我们之前建的文件夹。加加加、
加完以后是这样的,然后点击OK
点击编译会发现有一个ERROR。提示如下。
这个错误是mai.c里的错误,不能打开led.h。#include “led.h”却没有找到,这时我们应该添加led.h文件进去。
打开路径 战舰V3\战舰V3 资料盘(A盘)\4,程序源码\2,标准例程-库函数版本\2,标准例程-库函数版本\实验1 跑马灯实验\HARDWARE 把里面的LED文件夹复制,然后打开工程新建一个HARDWARE文件夹粘贴过去,
按照之前的方法,点击三个方块,点击groups里的new然后输入HARDWARE,选中HARDWARE点击Add files找到路径HARDWARE下的LED下的led.c文件选中点Add。然后关掉点击OK,
再把.h头文件所在的文件夹包含进去上面的重复C/C++添加的操作,添加好点击OK。
再次点击编译,点击build这时候会显示0错误0警告。
到这一步,整个工程就新建完了。如果要修改它实现的功能,应该到对应的文件里修改程序,或在main里修改逻辑,这样会使你的程序层次分明逻辑清晰,编程效率提高。