学习stm32,第一步就是选择开发工具了,GCC,MDK,IAR每一种都有自己的优劣势,这里我选择使用MDK软件实现STM32模板。当然如果想更快的接触stm32实例,领略嵌入式开发的魅力,STM也提供了丰富的例程供开发者学习使用,具体参考http://www.stmcu.com.cn/design_resources.html。直接使用例程对于快速开发实现功能十分有利,但当我们需要学习时就会变得复杂。为了更好的解析学习STM32,脱离例程,建立工程模板是十分有必要的。初次建立自然错误一堆,但通过查错的过程,可以清晰的了解项目的执行流程和各模块及定义的含义。如果你只是想快速的开发功能,那么上面网址内的资源会更加有效,不过如果你想深入学习嵌入式,那么从工程模板开始,一步步积累自己的STM32工程库是必要的。

1. 准备工作

  建立工程文件夹,在其下面添加/DRIVER,/MDK-ARM,/USER这三个文件夹(PS:所有文件夹名字要用英文,中文在某些情况下会出现未知编译错误):

  

  DRIVER:包含着与STM32F10x芯片相关的外设固件函数库,启动文件以及寄存器地址定义。

  MDK-ARM:包含工程文件,编译生成的中间文件以及最后输出hex文件。

  USER: 用户编译的代码,包含外设配置和main文件。

  移动标准库函数文件中的配置文件到DRIVER文件夹中,以我当前使用的STM32F10x_StdPeriph_Lib_V3.5.0为例(后续的库可能有其它改动,这可以按照这个思路去处理配置驱动文件),解压STM32F10x_StdPeriph_Lib,...\\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries文件夹下的

  

  并复制到...\\DRIVER文件夹下。

  CMSIS:Cortex的微控制器软件接口标准,它提供了stm32的启动文件,外设定义,以及器件的定义。

  STM32F10x_StdPeriph_Driver: ST公司提供的操作芯片的外设库函数。

2. 使用MDK建立工程

  1).新建工程

  打开MDK5.14,选项Porject->New uVision Project,将生成的project放在...\MDK-ARM文件夹,之后选择开发板对应芯片,例如我选择的是芯片是STM32F107VC,如此便建立了一个空的工程。

  2).添加GROUP,并添加项目文件

  

  添加三个GROUP,并改名字为User,Driver,StartUp

  User:用户代码,包含自己编写的外设配置函数和程序的功能主体实现,在...\\USER文件夹下

  Driver:系统固件函数库,在...\\DRIVER\STM32F10x_StdPeriph_Driver\src文件夹下

  StartUp:启动代码,在...\\DIVER\CMSIS\CM3\DeviceSupport\ST\STM32F10x文件夹下

  3).添加头文件查找,解决错误

  选中MDK中target文件夹,右键选择OPTION(或者快捷键ALT+F7),在弹出的对话框上方选中C/C++。

  

  在对话框下方的include Pathe处添加:......\SOURCE\STM32F10x_StdPeriph_Driver\inc提供头文件目录支持(后续还要添加新的头文件目录,如果了解windows环境变量Path,其实和这个的原理一样),也就是将用到的头文件的路径包含到软件中,在编译的时候软件就可以查询指定目录内的头文件。

  

  如此完成了整个工程的建立,下面就是解决错误了。上面的都完成后,再main.c文件里添加代码,头文件为#include"stm32f10x.h",编译。如果你用的是标准库文件,那么这时会出现

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

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

  

  取消掉#define USE_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找到如下的代码段,下方会有英文注释告诉你如何选择,取消掉你所用板子型号对应类型的注释即可(重要,板子型号对应的寄存器设置会不同,选择不符合的可能程序跑不起来),如stm32f107为互联型,则取消STM32F10X_CL的注释。

  解决以上问题,那么一个基础ARM项目模板就建立起来了,不过要实现一个完整的实现功能的嵌入式程序,还需要自己添加相关的代码。上述程序的实践可参考第二章:基于STM32F10x.3.5.0库的流水灯程序实现

  注意:如果使用系统自带的启动文件如startup_stm32f10x_cl.s等,则必须添加文件system_stm32f10x.c,否则程序会启动不成功。

  

  从这可以看出,复位后程序会先加载SystemInit,这个函数实现了系统时钟RCC的配置,它的定义正是在system_stm32f10x.c中。

STM32学习笔记(一) 如何新建一个STM32工程模板的更多相关文章

  1. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  2. stm32学习笔记——外部中断的使用

    stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...

  3. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  4. STM32学习笔记——OLED屏

    STM32学习笔记--OLED屏 OLED屏的特点: 1.  模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2.  显示尺寸为0.96寸 3.  分辨率为128*64 4.   ...

  5. STM32学习笔记——点亮LED

    STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...

  6. STM32学习笔记-NVIC中断知识点

    STM32学习笔记-NVIC中断知识点总结 中断优先级设置步骤 1. 系统运行后先设置中断优先级分组 函数:void NVIC_PriorityGroupConfig(uint32_tNVIC_Pri ...

  7. stm32开发笔记(三):stm32系列的GPIO基本功能之输出驱动LED灯、输入按键KEY以及Demo

    前言   stm32系列是最常用的单片机之一,不同的版本对应除了引脚.外设.频率.容量等'不同之外,其开发的方法是一样的.  本章讲解使用GPIO引脚功能驱动LED灯和接收Key按钮输入.   STM ...

  8. Android(java)学习笔记219:开发一个多界面的应用程序之两种意图

    1.两种意图: (1)显式意图: 在代码里面用intent设置要开启Activity的字节码.class文件: (2)隐式意图: Android(java)学习笔记218:开发一个多界面的应用程序之人 ...

  9. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

随机推荐

  1. C/C++获取数组的长度

    C.C++中没有提供 直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取长度,那么对于其他类型的数组如何获取他们的长度呢?其中一种方法是使 用sizeof(array) / ...

  2. HDU:Integer Inquiry

    #include"stdio.h" #include"stdlib.h" #include"string.h" #define N 105 ...

  3. 【转】SVN提示:由于目标机器积极拒绝,无法连接 的解决方法

    转载地址:http://wxiaolei.blog.163.com/blog/static/1038760120133108180596/ 安装完TSVN之后,checkout时报错,并且后来在cmd ...

  4. linux设备驱动编写_tasklet机制

    在编写设备驱动时, tasklet 机制是一种比较常见的机制,通常用于减少中断处理的时间,将本应该是在中断服务程序中完成的任务转化成软中断完成. 为了最大程度的避免中断处理时间过长而导致中断丢失,有时 ...

  5. Apache Common-pool2对象池分析和应用

    Apache Common-pool2包提供了一个通用的对象池技术的实现.可以很方便的基于它来实现自己的对象池,比如DBCP和Jedis他们的内部对象池的实现就是依赖于Common-pool2. 对象 ...

  6. EasyUI的DataGrid 打印导出

    EasyUI的DataGrid 打印导出   一直在Winform和WPF的项目,偶尔接触Web都是网上下个模板修修改改就成了,学习的不太深入. 今日遇到一个打印导出datagrid的问题,做桌面项目 ...

  7. linux下的文件系统

    转http://www.cnblogs.com/yyyyy5101/articles/1901842.html 谈谈个人对于文件系统的认识,其实这也体现了计算机操作系统的抽象:你不用管计算机中的文件如 ...

  8. 数据库SQL语句练习题10--18

    10.查询Score表中的最高分的学生学号和课程号.(子查询或者排序) select t.sno,t.cno from SCORE t where degree = (select max(degre ...

  9. Android 内部存储和外部存储

    应用程序的一些配置文件需要存储在手机上.一般分为内部存储和SD卡存储. 一. 内部存储 ,以 FileOutputStream File file = new File(getFilesDir(),& ...

  10. Cheatsheet: 2013 09.01 ~ 09.09

    .NET Multi Threaded WebScraping in CSharpDotNetTech .NET Asynchronous Patterns An Overview of Projec ...