1. 如何新建一个ARM工程

        学习嵌入式,第一步就是选择开发工具了,GCC,MDK,IAR每一种都有自己的优劣势,不再赘述。在这里,我选择使用的时MDK4.72。首次使用MDK,程序提供了了很多的模板,一上来就有很多例子供我们学习。但是我发现直接使用这些模板虽然让我快速的接触嵌入式软件开发,但是那庞大的函数库让我感觉迷茫,我甚至不知道程序的运行流程,因此我就有了脱离模板,自己建立工程的想法,初次建立错误一堆,通过百度以及自己查找解决这一个个错误花费了我接近4个小时,我把自己的整个经历记录下来,虽然以后遇到的芯片或者开发软件可能不同,但具体思路却是一致的。这个流程也基本上适用于所有使用MDK生成STM32F10x开发板程序。为了以后再次出现相同错误能快速的解决,我尽可能给出详细步骤处理。

准备工作

建立工程文件夹,在其下面添加OUTPUT,SOURCE这两个文件夹(如下):

然后在SOURCE文件夹下添加文件夹APP,用来存放用户文件。

PS:所有文件夹(包括工程的路径上的文件夹)名字一定要是要英文,这是因为中文在某些情况下会出现未知编译错误。

        移动标准库文件中的头文件和对应子文件代码到SOURCE文件夹,我使用的是STM32F10x_StdPeriph_Lib_V3.5.0,后续的库可能有其它改动,这就需要你自己按照这个思路去处理,解压STM32F10x_StdPeriph_Lib,找到...\\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries文件夹下的


并复制到...\\工程文件夹(当前工程,英文)\\SOURCE文件夹下,其中CMSIS是Cortex的微控制器软件接口标准,它提供了stm32的启动文件,外设定义,以及器件的定义。而STM32F10x_StdPeriph_Driver提供的就是库函数用来实现对芯片的操作。

SOURCE文件夹内容如下:

到此,整个工程的准备工作就做好了,下面就开始用MDK建立工程。

 使用MDK建立工程

1.新建ARM MDK工程,我选择的是芯片STM32F107VS,与开发板芯片保持一致,位置在当前工程文件下。工程建立中,添加对应芯片但不要添加启动代码,手动复制安装目录\\Keil\ARM\Startup\ST文件夹下的STM32F10x.s(启动文件,以后会详解)到当前工程文件夹,并添加到当前工程下的start_up中。

2.新建file,保存在上述的...//APP文件夹里,文件名保存为main.c,然后添加到USER文件夹下。

3.在工程中添加文件夹DRIVE,并把用到的驱动文件,也就是...\SOURCE\STM32F10x_ StdPeriph_Driver\src下需要使用的驱动文件添加到DRIVE文件夹里,如下:

同时给USER/DRIVER两个文件夹都添加inc查询支持,用于头文件查找。

注:重要,不然MDK是无法识别你包含的头文件

具体步骤如下:

1.选中MDK中APP和DRIVE文件夹,右键选择OPTION(快捷键ALT+F7),在弹出的对话框上方选中C/C++。


2.在对话框下方的includePathe处添加:当前工程文件夹\SOURCE\STM32F10x_StdPeriph_Driver\inc提供头文件支持(后序还要添加新的支持),USER和DRIVE两个文件夹都要添加。

编译和更正

上面的都完成后,再main函数里添加代码,头文件为#include"stm32f10x.h",编译。

这时会出现

C:\Keil\ARM\Inc\ST\STM32F10x\stm32f10x.h(8319):error:  #5: cannot open source input    file "stm32f10x_conf.h": No suchfile or directory

stm32f10x_conf.h里是所用外设的头文件的申明以及程序内部assert处理命令,在3.5的固态库我没有找到这个头文件,于是我下载一个具有所有外设头文件申明的头文件stm32f10x_conf.h,将其放入当前工程文件夹\SOURCE\STM32F10x_StdPeriph_Driver\inc中,继续编译,出现一堆端口未定义,这是因为stm32f10x_conf.h虽然添加进去了,但并没有真正启用,在stm32f10x.h中查找,大概100行的位置


取消掉#defineUSE_STDPERIPH_DRIVER这句话的注释,如上图即可。此外,#include”stm32f10x_conf.h”定义在#include"stm32f10x.h"的末尾,


下面就来讲stm32f10x_conf.h这个头文件。


里面包含了所有你需要用到的外设头文件,你需要用什么就取消对应得注释即可,记得一定要取消注释,不然你用到被注释文件里的库函数是不会被识别的。

此外如果出现

C:\Keil\ARM\Inc\ST\STM32F10x\stm32f10x.h(97):error:  #35: #error directive:"Please select first the target STM32F10x device used in your application(in stm32f10x.h file)"

表明你没有申明当前选择的STM芯片隶属于的类型,在stm32f10x.h找到如下的代码段,下方会有英文注释告诉你如何选择,取消掉你所用板子型号对应类型的注释即可,取消后的如下。


解决以上问题,第一个程序就可以运行起来了。

        库函数的使用作为嵌入式的开发的基础必须熟练掌握,它一定程度上脱离了硬件的桎梏,方便了理解,但是直接寄存器操作也有自己的优势,代码量少,程序效率稍高(当然直接使用汇编的寄存器操作效率是最高的),这两种各有优劣,但初学状态下,以库函数编程为主(简单易上手),同时理解相关寄存器控制的含义,在学习嵌入式开发的过程中意义重大。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值