STM32快速入门指南
STM32快速入门指南
一、IAR新工程的建立
1.1打开IAR,界面如图所示:
图1-1 IAR的启动界面
1.2 建立相应的工程文件夹
首先应该为新项目创建一个目录,如STM32_EXAMPLE,用来存放与项目有关的各种文件。项目开发过程中生成的一系列文件,如工作区文件,项目配置文件,调试配置文件,各种列表文件和输出文件等都将被存放在这个目录下。
然后把STM32的固件库也放在这个目录下。以IAR5.40版本为例,将D:\Program Files\IAR Systems\Embedded Workbench 5.4\arm\examples\ST\STM32F10x\STM32F10xFWLib\FWLib的library和startup文件夹放在新建立的工程文件夹内。
1.3 生成新的工作区
EWARM 是按照项目进行管理,且项目(Project)必须放在工作区(Workspace)内。创建新工作区的方法是:选择主菜单File > New > Workspace 命令。如果当前正在开发或调试另一个项目,EWARM 将提示用户保存和关闭当前活跃工作区,然后开启一个空白工作区窗口,如图所示:
图1-2 IAR新的工作区界面
1.4.生成新项目
①选择主菜单Project > Create New Project,弹出生成新项目的窗口,如下图。
图1-3 新建工程界面
EWARM 提供几种应用程序和库程序的项目模版。在本例中我们选择最常用的Empty project 模版,即所有代码都由用户添加。在“另存为”的界面中找到1.2中建立的目录,输入新项目的文件名,如SWS3000_HEATER,如下图所示:然后保存。
图1-4 IAR工程保存界面
保存以后,在屏幕左边的Workspace窗口中将显示新建的项目名称和配置模式,如下图:
图1-5 IAR新建工程以的界面
项目名称后面的Debug 表示当前激活的配置模式。EWARM 为每个新项目提供两种缺省的配置模式:Debug 和Release。Debug 模式生成包含调试信息的可执行文件,且编译器优化级别较低;Release 模式生成不含调试信息的发行版本文件,且编译器优化级别较高。用户可以从Workspace窗口顶部的下拉菜单中选择合适的配置模式,当然也可以创建自己的配置模式(主菜单Project > Edit configurations)。本例中我们选择Debug。
现在STM32_EXAMPLE目录下已经生成一个SWS3000_HEATER.ewp 文件,该文件中包含与SWS3000_HEATER 项目有关的配置信息,如编译、链接等选项。
注:SWS3000_HEATER - Debug 后面的﹡号表示当前的工作区和项目经修改后还没有被保存。
○2保存工作区
新生成的工作区需保存才有效。可选择主菜单File > Save Workspace,选择STM32_EXAMPLE目录,输入工作区名称SWS3000_HEATER,然后保存退出。这时在STM32_EXAMPLE目录下又生成一个SWS3000_HEATER.eww 文件,以及一个settings 子目录,该目录下主要存放与诸如窗口设置和断点设置等当前操作信息有关的文件。
注:保存操作完成后,项目名称后面的﹡号已经消失。
1.5 工程相应文件的添加
在界面右侧的Workspace界面中,点击右键->Add->Add Group…,分别建立library, startup,user,linker四个组,library组用来存放所需的库文件,startup组用来存放STM32的启动代码。User组用来存放用户代码。
在startup组上点击右键,将STM32_EXAMPLE\startup中的文件添加到startup组,将所需要的STM32固件库的C文件添加到library组,将stm32f10x_it.c, stm32f10x_it.h,
stm32f10x_conf.h三个文件添加到user组,将stm32f10x_flash.icf, stm32f10x_flash_nor.icf, stm32f10x_flash_extsram.icf,stm32f10x_flash_ram.icf四个文件放在linker组。完成后,如下图所示:
图1-6 IAR添加相关工程文件以后的界面
注:往项目中添加文件时只需要添加汇编语言源程序和C/C++源程序,不需要添加头文件;但必须在配置编译器、汇编器选项时指明包含头文件的其它路径。
1.6 IAR的相关设置
详见《STM32新建工程以后的相关设置》
二、STM32固件库部分文件的简介
STM32中每一个外设都有一个对应的源文件:
stm32f10x_ppp.c 和一个对应的头文件:stm32f10x_ppp.h。
文件stm32f10x_ppp.c 包含了使用外设PPP 所需的所有固件函数。提供所有外设一个存储器映像文件
stm32f10x_map.h。它包含了所有寄存器的声明,既可以用于Debug 模式也可以用于release 模式。
头文件stm32f10x_lib.h包含了所有外设头文件的头文件。它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。
文件stm32f10x_conf.h 是唯一一个需要由用户修改的文件。它作为应用和库之间的界面,指定了一系列参数。
固件函数库文件描述
文件名描述
stm32f10x_conf.h 参数设置文件,起到应用和库之间界面的作用。用
户必须在运行自己的程序前修改该文件。用户可以
利用模板使能或者失能外设。也可以修改外部晶振
的参数。也可以是用该文件在编译前使能Debug
或者release 模式。
main.c 主函数体示例。
stm32f10x_it.h 头文件,包含所有中断处理函数原形。
stm32f10x_it.c 外设中断函数文件。用户可以加入自己的中断程序
代码。对于指向同一个中断向量的多个不同中断请
求,可以利用函数通过判断外设的中断标志位来确
定准确的中断源。固件函数库提供了这些函数的名
称。
stm32f10x_lib.h 它是唯一一个用户需要包括在自己应用中的文件,
起到应用和库之间界面的作用。
stm32f10x_lib.c Debug 模式初始化文件。它包括多个指针的定义,
每个指针指向特定外设的首地址,以及在Debug模
式被使能时,被调用的函数的定义。
stm32f10x_map.h 该文件包含了存储器映像和所有寄存器物理地址的
声明,既可以用于Debug 模式也可以用于release
模式。所有外设都使用该文件。
stm32f10x_type.h 通用声明文件。包含所有外设驱动使用的通用类型
和常数。
stm32f10x_ppp.c 由C 语言编写的外设PPP的驱动源程序文件。stm32f10x_ppp.h 外设PPP的头文件。包含外设PPP函数的定义,
和这些函数使用的变量。
cortexm3_macro.h 文件cortexm3_macro.s 的头文件
cortexm3_macro.s Cortex-M3 内核特殊指令的指令包装
三、外设的初始化和设置
3.1 在主应用文件中,声明一个结构PPP_InitTypeDef,例如:
PPP_InitTypeDef PPP_InitStructure;
这里PPP_InitStructure 是一个位于内存中的工作变量,用来初始化一个或者多个外设PPP。
3.2 为变量PPP_InitStructure的各个结构成员填入允许的值。可以采用以下2 种方式:
a)按照如下程序设置整个结构体
PPP_InitStructure.member1 = val1;
PPP_InitStructure.member2 = val2;
PPP_InitStructure.memberN = valN;
/* where N is the number of the structure members */
以上步骤可以合并在同一行里,用以优化代码大小:
PPP_InitTypeDef PPP_InitStructure = { val1, val2,.., valN}
b)仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数PPP_SturcInit(..)来初始化变量
PPP_InitStructure,然后再修改其中需要修改的成员。这样可以保证其他成员的值(多为缺省值)被正确填
入。
PPP_StructInit(&PPP_InitStructure);
PP_InitStructure.memberX = valX;
PPP_InitStructure.memberY = valY;
/*where X and Y are the members the user wants to configure*/
3.3 调用函数PPP_Init(..)来初始化外设PPP。
3.4 在这一步,外设PPP已被初始化。可以调用函数PPP_Cmd(..)来使能之。
PPP_Cmd(PPP, ENABLE); 可以通过调用一系列函数来使用外设。每个外设都拥有各自的功能函数。更多细节参阅Section3 外设固件概述。
注:1. 在设置一个外设前,必须调用以下一个函数来使能它的时钟:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx, ENABLE);
2. 可以调用函数PPP_Deinit(..)来把外设PPP的所有寄存器复位为缺省值:
PPP_DeInit(PPP)
3. 在外设设置完成以后,继续修改它的一些参数,可以参照如下步骤:
PPP_InitStucture.memberX = valX;
PPP_InitStructure.memberY = valY; /* where X and Y are the only
members that user wants to modify*/
PPP_Init(PPP, &PPP_InitStructure);