第一步:去ST的官网下载最新的库文件,目前最新是3.5版本。准备好编译器,这里我用的是MDK-ARM V4.22a
第二步:安装部署库。
由于官方库考虑了多种情况,所以文件夹很深很复杂,我们来做些简化。(当然也可以沿用官方形式)
如图建立文件夹列表。
解压下载的库文件,并将文件分别放入建立好的文件夹Libraries内。
具体是:
1、将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport中的core_cm3.c,core_cm3.h和
TM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x中的system_stm32f10x.c,system_stm32f10x.h,stm32f10x.h一共5个文件拷贝到新建立的Libraries\CMSIS中,这里放的是Cotex的核心文件和系统核心设置。
2、拷贝STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下面的所有文件到\Libraries\Starup文件夹,这是启动文件,因为我们用的MDK其它的编译器版本这里不需要。
3、拷贝\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver下文件和目录到\Libraries\StdPeriph_Driver文件夹,这里是stm32的外部模块文件。
第三步:建立工程。
我们初步只打算用库实现IO口操作,点亮一只LED。所以项目文件夹命名为GPIO好了。(你可以随便)
1、我们在GPIO文件夹里建立MDK-Prj文件夹来放置项目文件;建立User文件夹来放置自己的程序文件。MDK-Prj文件夹里再建立Debug>>Listing和Debug>>output放置编译和调试时产生的文件,(只是为了更有序,也可以不建立)。
2、打开MDK,Project-->new uVision project新建一个项目.设备自己选择,我的是103VE,所以我如下图选择。
target选项卡选择外部晶振频率,根据实际填写,一般是8M,这个和软件仿真有关。
在output和Listing选项卡选择我们建立的output和listing文件夹,设置编译文件输出路径。
C/C++选项卡需要设置预定义字和链接文件路径,如下图所示。
USE_STDPERIPH_DRIVER表示我们使用外部模块库,STM32F10X_HD是我们使用芯片的分类,ST将其分为大中小三个类别,其定义划分可参考芯片数据手册。
链接文件路径请把所有文件夹都加进去以防止找不到文件错误。
再后面就是debug选项卡,我们先选择Use Simulator软件模拟仿真.如果你有目标板和仿真器如jlink之类的请在右边选择对应项。
弹出是否加入启动文件对话框,我们选择否,我们等下会把库里面的最新的启动文件加进去。
设置完后,按下图建立文件组并分别加入我们之前放好的库文件。
第四步:编写程序。
我们把官方库\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template里面的stm32f10x_it.c,stm32f10x_it.h两个文件拷贝到user目录,这两个是中断程序文件,V3的库至保留了一些异常中断函数定义,我们如果需要使用中断如定时器,串口啥的要自己在里面写,中断函数名依据使用的startup_stm32f10x_xx.s启动文件来写。
官方原文及格式
/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/******************************************************************************/
/**
* @brief This function handles PPP interrupt request.
* @param None
* @retval None
*/
/*void PPP_IRQHandler(void)
{
}*/
主程序文件main.c也可拷贝过来,我们只需保留两处,其余都可删除
1、#include "stm32f10x.h"
2、int main(void)
{
}
这里有一段话很重要,我们要注意:
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f10x.c file
*/
意思是库已经帮我们做了系统初始化的过程,是通过system_stm32f10x.c里的SystemInit()这个函数设置的,而这个函数是在.s启动文件中调用的。如果我们上面定义STM32F10X_HD它将默认设置为PLL=9*8MHz=72MHz的时钟。如果你的晶振不是8MHz,可以在system_stm32f10x.c文件的SetSysClockTo72(void)函数中修改,具体是这两行
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
就是RCC_CFGR_PLLMULL9这个参数决定的9倍频,如果是12MHz晶体,改为RCC_CFGR_PLLMULL6就行了;
第五步,操作GPIO.
我们来操作IO口来实现简单的功能验证一下库是不是好用。这里操作PB5口
先在board文件夹下建立led文件夹,里面建立led.h和led.c文件
led.c写入
#include "stm32f10x.h"
//LED IO初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
/*初始化GPIOD的Pin_2为推挽输出*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
led.h写入
#ifndef __LED_H
#define __LED_H
#include "gpio.h"
//LED端口定义
void LED_Init(void);//初始化
#endif
这时可在main()函数中加入下面语句
LED_Init();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
Delay(720000);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
Delay(720000);
}
在main.c中还要包含头文件
#include "led.h"
加入延时函数
void Delay(uint32_t xfps)
{
while(xfps--);
}
保存,编译项目。无错误警告就成功。
第六步:调试。
编译完成后,确保在Target1-->>Option for target-->>Debug里选择Use Simulator选项
确保Target选项卡里晶振和system_stm32f10x.c文件的SetSysClockTo72(void)函数里参数一致。
按下Ctrl+F5快捷键或点下图按钮开始仿真
Debug状态很多按钮可以进行单步,断点,查看寄存器,产看串口或者波形的选项,请自己尝试
我们这里选择这个按钮来打开虚拟波形产看设置窗口,由于我们要看PB5,在这里加入PORTB.5即可
按F5开始运行。你会看到波形显示出来了,如下图所示,定时翻转。
可以点zoom菜单进行缩放,可以勾选这几个选项显示更多信息。
到这里基本完成。例程一并上传,经验不足,难免有错,请指正。
这篇文章很好,强烈推荐看看
[ 本帖最后由 shower.xu 于 2012-2-9 15:41 编辑 ]模版参照正点原子用了地址操作IO口,更快捷