MDK4.0(KEIL4)
STM32F10x_StdPeriph_Lib_V3.5.0
下载地址: http://www.openedv.com/posts/list/6054.htm
三.新建工程
1.MDK主界面,可以看到工程中有一个默认的工程,点击这个工程名字,然后选择
菜单 Project->Close Project,就关闭掉这个工程了!这样整个MDK就是一个空的了,
接下来我们将建立我们的工程模版。
2. 在建立工程之前,我们建议用户在电脑的某个目录下面建立一个文件夹,后面所建立
的工程都可以放在这个文件夹下面,这里我们建立一个文件夹为: Template.
3. 点击Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件
夹STM32-Projecst 之下,在这个目录下面建立子文件夹 Tempalte, 然后定位到 Template
目录下面,我们的工程文件就都保存到Template 文件夹下面。工程命名为Template, 点
击保存
4. 接下来会出现一个选择 Device 的界面,就是选择我们的芯片型号,这里我们定位到
STMicroelectronics 下面的STM32F103C8。
5. 弹出对话框“Copy STM32 Startup Code to project ….”,询问是否添加启动代码到我们
的工程中,这里我们选择“否”,因为我们使用的ST固件库文件已经包含了启动文件。
6. 可以看到工程建立了,我们回到 Template 目录下面,可以看到只有三个文件:
7. 接下来,我们在 Template 工程目录下面,新建3 个文件夹 CORE, USER,
STM32F10x_FWLib 。USER 用来放我们主函数文件 main.c, 以及其他包括
system_stm32f10x.c 等等,CORE 用来存放启动文件等,STM32F10x_FWLib 文件夹顾
名思义用来存放ST官方提供的库函数源码文件。
www.openedv.com ALIENTEK MiniSTM32 开发板资料
8. 下面我们要将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。
打开官方固件库包,定位到我们之前准备好的固件库包的目录
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 下面,
将目录下面的src,inc 文件夹 copy 到我们刚才建立的STM32F10x_FWLib 文件夹下面。
src 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件,您不妨打开这两个文件目录
过目一下里面的文件,每个外设对应一个.c 文件和一个.h 头文件。
9. 下面我们要将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下。
打开官方固件库包,定位到目录
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 下面,将文件
core_cm3.c 和文件 core_cm3.h 复制到 CORE 下面去。然后定位到目录
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\
startup\arm 下面,将里面所有的文件同样复制到 CORE 下面。这里我们解释一下,其实
我们只用到arm 目录下面的startup_stm32f10x_md.s 文件,这个文件是针对中等容量芯
片的启动文件。其他两个主要的为 startup_stm32f10x_ld.s 为小容量,
startup_stm32f10x_hs.c 为大容量芯片的启动文件。这里 copy 进来是方便其他开发者使
用小容量或者大容量芯片的用户。
现在看看我们的CORE 文件夹下面的文件:
10.定位到目录:
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
将里面的三个文件stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,复制到我们
的USER 目录之下。然后将
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 下面的4 个
文件main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h复制到 USER 目录下面。
11.前面10个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面
我们将这些文件加入我们的工程中去。右键点击Target1,选择 Manage Components
12.Project Targets 一栏,我们将 Target 名字修改为Template, 然后在 Groups 一栏删掉一
个,建立三个Groups :USER,CORE,FWLIB.点击OK.可以看到我们的Target 名字以及
Groups 情况。
13.下面我们往 Group 里面添加我们需要的文件。我们按照步骤 12 的方法, 右键点击
点击Tempate,选择选择Manage Components.然后选择需要添加文件的 Group,这里第
一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录
STM32F10x_FWLib/src 下面,将里面所有的文件选中(Ctrl+A) ,然后点击Add ,然后
Close.可以看到 Files 列表下面包含我们添加的文件。
这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以
不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加
stm32f10x_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不
用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。
14.用同样的方法,将 Groups 定位到CORE 和USER 下面,添加需要的文件。这里
我们的CORE 下面需要添加的文件为core_cm3.c ,startup_stm32f10x_md.s ,USER 目录
下面需要添加的文件为main.c,stm32f10x_it.c,system_stm32f10x.c.
这样我们需要添加的文件已经添加到我们的工程中去了,最后点击 OK,回到工程主界
面。
15.下面我们点击编译按钮 编译工程,可以看到很多报错,因为找不到库文件。
16.下面我们要告诉 MDK,在哪些路径之下搜索相应的文件。回到工程主菜单,点击魔
术棒 ,出来一个菜单,然后点击 c/c++ 选项. 然后点击 Include Paths 右边的按钮。
弹出一个添加path 的对话框,然后我们将图上面的 3 个目录添加进去。记住,keil 只会
在一级目录查找,所以如果你的目录下面还有子目录,记得path 一定要定位到最后一
级子目录。然后点击OK.
17.接下来,我们再来编译工程,可以看到又报了很多同样的错误。为什么呢??
我们可以双击错误,然后会自动定位到文件stm32f10x.h中出错的地方,可以看到代码:
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined
(STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD)
&& !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined
(STM32F10X_CL)
#error "Please select first the target STM32F10x device used in your application (in stm32f10x.h
file)"
#endif
这是因为3.5版本的库函数在配置和选择外设的时候通过宏定义来选择的,所以我们需要配
置一个全局的宏定义变量。按照步骤16,定位到 c/c++ 界面,然后copy
“STM32F10X_MD,USE_STDPERIPH_DRIVER” 到 Define里面。
这里解释一下,如果你用的是大容量那么STM32F10X_MD 修改为STM32F10X_HD,小容
量修改为STM32F10X_LD. 然后点击OK。
18.这次在编译之前,我们记得打开工程 USUR 下面的main.c,复制下面代码到 main.c 覆盖
已有代码,然后进行编译。(记得在代码的最后面加上一个回车,否则会有警告)
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;
int main(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
www.openedv.com ALIENTEK MiniSTM32 开发板资料
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
while (1)
{
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif
19. 这次编译可以看出,已经成功了。这样一个工程模版建立完毕。下面还需要配置,让编
译之后能够生成hex 文件。同样点击魔术棒,进入配置菜单,选择Output 。然后勾上下三个
选项。 其中Create HEX file 是编译生成 hex 文件,Browser Information 是可以查看变量和
函数定义,这里我们不做过多解释,在我们的不完全手册里面有讲解。
20.重新编译代码,可以看到生成了 hex 文件,这个文件我们用 mcuisp 下载到 mcu 即可。