一、新建固件库工程并添加文件
1、将下载的固件库整理成所需要的文件
将在官网下载的固件库文件,解压到自己设置的文件夹中,然后再在这个文件夹中建立四个文件夹,命名为CMSIS、Lib、Startup、User
然后需要将固件库中的文件添加到这些文件夹中。
首先是CMSIS文件夹添加,找到解压的CMSIS文件,然后将CM3中两个文件夹的支持文件添加进来。
将文件复制粘贴添加到CMSIS文件夹中,
然后将这个文件夹中的文件也添加到CMSIS文件夹中,这样CMSIS文件便整理好了。
之后是启动文件Startup文件夹文件的添加,找到CMSIS文件夹下的STARTUP文件夹,将文件夹中的文件全部添加到Startup文件夹中,便完成Startup文件夹文件的添加。
接下来是User文件夹文件的添加。
找到文件夹Project,然后在里面打开第二个文件夹,
然后将该文件夹中以下文件添加到User文件夹中,即完成User文件的添加。
最后是Lib文件夹文件的添加。
按下列路径,将两个文件夹inc和src添加到Lib文件夹中,此时所有的文件便添加好了。
2、在Keil中建立工程并添加相应的文件
(1)打开Keil,建立工程
点击Project新建工程。
输入工程名,选择工程存放的位置和固件库的位置最好保持一样,然后选择工程用到的芯片,选用STM32F103C8。
之后点击确定完成工程的建立。
(2)将固件库文件添加到工程中
在页面左侧Project的地方,在Target 1下添加四个文件,并将其更改名字为User、Startup、FWLIB、CMSIS,然后将之前建立的固件库的文件夹中的文件添加到相应的文件下面。
将Lib文件夹中src文件中的所有文件添加到FWLIB文件下。
然后点击魔术棒,点击C/C++,
然后设置宏定义USE_STDPERIPH_DRIVER.STM32F10X_MD,并添加文件路径。
需要将固件库的文件路径添加进去,注意Lib文件夹中的两个文件要单独都添加进去。
然后在Keil中打开User文件下的main.c文件,将里面的内容全部删除,然后换成最基本的程序框架,运行不出错,则说明设置成功。
以上固件库工程便建立完成,可以开始写代码了。
二、代码编写及运行
在此次实验中,采用三个GPIO口分别控制三个LED灯,来实现流水灯。
以下是代码main.c:
#include "stm32f10x.h"
//采用三个GPIO口分别控制一个灯实现流水灯
//定义GPIO初始化函数
void GPIO_LED_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;//定义一个GPIO_InitTypeDef类型的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA口的外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB口的外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启GPIOC口的外设时钟
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;//设置输出速率为10MHz
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//设置推挽输出模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;//用该结构体来控制GPIO口的pin角 PA0 黄灯
GPIO_Init(GPIOA,&GPIO_InitStruct);//使用GPIOA口
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;//控制PB10 绿灯
GPIO_Init(GPIOB,&GPIO_InitStruct);//使用GPIOB口
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;//控制PC14 红灯
GPIO_Init(GPIOC,&GPIO_InitStruct);//使用GPIOC口
//先将灯全部熄灭
GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_SetBits(GPIOB,GPIO_Pin_10);
GPIO_SetBits(GPIOC,GPIO_Pin_14);
}
void delayms(unsigned int ms)//定义延时函数
{
unsigned int i;
while(ms--)
{
i=10000;
while(i--);
};
}//延时1s为delayms(1000)
int main(void)
{
GPIO_LED_Init();
while(1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0);//点亮GPIOA口的灯
delayms(1000);
GPIO_SetBits(GPIOA,GPIO_Pin_0);//熄灭GPIOA口的灯
GPIO_ResetBits(GPIOB,GPIO_Pin_10);//点亮GPIOB口的灯
delayms(1000);
GPIO_SetBits(GPIOB,GPIO_Pin_10);//熄灭GPIOB口的灯
GPIO_ResetBits(GPIOC,GPIO_Pin_14);//点亮GPIOC口的灯
delayms(1000);
GPIO_SetBits(GPIOC,GPIO_Pin_14);//熄灭GPIOC口的灯
}
}
代码编写完成后,点击魔法棒,找到Output,勾选选项,然后重新运行,输出.hex文件。
三、电路连接及烧录
将实验电路连接好。
然后.hex文件烧录到芯片中。
点击开始编程,出现以下页面说明烧录成功。
此时可以观察到灯亮起来,并实现流水灯。
四、总结
这次实验基于标准外设库来点亮LED灯,来实现流水灯,对比实验一中采用寄存器的方式点亮LED灯,可以很明显的发现,采用固件库的方式来完成更加的简单方便,在代码编写的过程中,大部分都有固定的模板,只需要区其他函数中调用即可,在工程建立前只需要将所需要的文件整理好,在工程建立好之后就可以很快的将文件添加进去不需要对照着一个一个确定GPIO口的状态,节省了很多时间,也减少了出错率。