我们是用基于库函数的方式来构建我们的工程——首先我们需要先建立我们的工程模板
1.新建模板工程
1.新建一个存放东西的文件
2.在里面新建一个模板文件
3.打开Keil5 新建一个工程
4.为我们新建的工程选择板子的型号(此处使用STM32103C8)
5.勾选如上文件快速建立工程
6.新建一个使用者文件,来存放我们的主函数
2.点灯工程
点亮一个灯,我们需要三个步骤
第一步:使用RCC开启GPIO时钟
第二步:使用GPIO_Init函数初始化
第三步:使用输出或输入的函数控制GPIO口(一个涉及RCC和GPIO两个外设)
1.将模板复制过来,重命名为点灯
但是点灯需要我的GPIO,而我们要运行它,就需要外部驱动,所以我们新建一个文件,DRIVER(驱动文件)
打开DRIVER文件,在里面再新建两个文件 inc 和 src 分别存放 头文件 与 源文件
(我们可以直接更改文件拓展名字,变成c文件,然后放到我们DRIVER里面)
输入里面的内容(之后我会补充)
但是这时我们编译会发现,他其实是无法找到led.h的,因为我们没有给他地址
我们放上我们的函数地址,但是这样还不行,因为我们要运行这个代码,我们就需要把他导出
将第二个勾选,这样就会导出hex了
打开我们的
找到我们的串口,选择这个复位,这样我们编译后就可以自己运行了。
补充:led.c
#include "stm32f10x.h" // Device header
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//首先是使能时钟,库函数就有上面这个函数进行外设时钟控制
//第一个是选择外设,第二个是选择状态
GPIO_InitTypeDef GPIO_InitStructure;
//我们定义一个结构体,后面的这个就是我们的名称
//复制结构体的名称,加个.引出GPIO的三个参数
//GPIO模式,GPIO端口,GPIO速度
//我们把这三个参数罗列出来,转到定义,ctrl+F搜索定义
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//通用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//这是我们的引脚,这里用PIN0
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//这是我们的速率
GPIO_Init(GPIOC, &GPIO_InitStructure);
//第二步是配置端口模式 我们就需要用到GPIO_Init(),就有两个参数,第一个是选择哪个GPIO的,第二个是参数结构体
//这个函数是根据GPIO_Init结构体来配置GPIO的
//以上就是GPIO的操作配置,是比较固定的,也就是led.h的配置
// GPIO_SetBits(GPIOC, GPIO_Pin_0); 高电平
GPIO_ResetBits(GPIOC, GPIO_Pin_0);//低电平
//设置高低电平来控制开关
while (1)
{
}
}
以上的部分,是可以直接放到main函数里,这样就不用再添加led.c文件了
#include "stm32f10x.h"
#include "led.h"
void LED_Init(void){
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Pin=LED1|LED2;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(LED_PORT,&GPIO_InitStruct);
GPIO_ResetBits(LED_PORT,LED1);
GPIO_ResetBits(LED_PORT,LED2);
}
这是led.c的文件,就是一直初始的过程,当然这边用了一下宏定义,所以就跟上面有所不同
#ifndef _LED_H
#define _LED_H
#include "stm32f10x.h"
#define LED_PORT GPIOB
#define LED1 GPIO_Pin_0
#define LED2 GPIO_Pin_1
void LED_Init(void);
#endif
这是led.h文件,主要就是定义与声明
接下来再补充一点,有关于建立文件夹的说明
1.Start :这是驱动文件所存放的地方。也就是我们的Drive,如果我们使用的是快速建立工程,那我们就不需要在里面添加Startup了,快速建立文件里面就有,所以我们就可以在里面加上我们的linc 和 src,如果我们是用包含全部库函数所建的工程,我们可以新建一个
2.system:来存放我们的 inc src 文件(我们自己所写的)
3.User:用户文件,我们来存放我们的main函数,以及核心驱动(ARM公司的core文件)
4.library:存放全部的库函数,快速建立工程是没有的
5.这是用来删除中间文件的工具,可以很好的消除我们的中间文件,减少容量
不利用快速新建工程,而是我们从我们的工程模板入手
注意:一般在.h文件的最下面,一般都是库函数所有函数的声明
一.RCC的库函数
上面我们最常用的 就是
RCC_AHB外设时钟控制, RCC_APB2外设时钟控制,RCC_APB1外设时钟控制(下面三个)
我们编译后,就可以跳转到定义
二.GPIO函数
第一个就是 GPIO_DeLnit 参数可以写 GPIOA GPIOB等等,调用这个函数后,所指定的GPIO外设就会被复位,这就是这个函数的用途
第二个AFIODelnit也是一样,可以复位AFIO外设
第三个 GPIO_Init (很重要) 作用是,用结构体的参数初始化GPIO口,我们需先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数,这个函数内部就会自动读取结构体的值,然后自动把外设的各个参数配置好
第四个 GPIO_Struclnit函数,这个可以把结构体变量赋一个默认值
接下来4个 uints 就是GPIO读取函数,然后下面跟着的四个就是GPIO的写入函数,这些函数就可以实现读写GPIO口的功能
剩下的暂时不会用到
1. 首先调用的是,RCC里面的APB2外设时钟函数
2.查看定义,点亮PAO口的led,所以选择RCC_APB2外设_GPIOA这一项,放到第一个参数
ENABLE放到第二个参数
3.接着调用GPIO_Init函数 ,第一个选择GPIOA,第二个是结构体,先搞出结构体类型,复制在GPIOINIT上面,然后起个名字
4.接下来复制结构体名字,把成员都引出来
最后把GPIO初始化的地址放到GPIO——IINT 的第二个参数
这样子初始化就完成了
接下来我们就使用GPIO这些输入输出函数了
第一个GPIO_SetBits ,第一个参数是GPIOx,第二个是GPIO—Pin,这个函数可以把指定的端口设置为高电平
第二个GPIO_RESETBITS,和上面一样,不过设定指定端口为低电平
第三个GPIO_WriteBit ,这个函数有三个参数,前两个指定端口,第三个是bitvalue
第四个是GPIO_Write 第一个参数选择外设,第二个同时对16个端口写入参数
接下来我们要点亮LED,就要在主函数里写上,延时一段时间,熄灭led ,再延时
注:这边需要延时函数,延时函数我们写好了放到SYSTEM文件夹(或者是DEIVE文件里,看你选择哪一种)
(我所使用的开发板是GPIOB)
接下来我们正常烧录就可以亮了