STM32(二)——利用快速新建工程点灯

我们是用基于库函数的方式来构建我们的工程——首先我们需要先建立我们的工程模板

1.新建模板工程

1.新建一个存放东西的文件

 2.在里面新建一个模板文件

 

3.打开Keil5 新建一个工程 

4.为我们新建的工程选择板子的型号(此处使用STM32103C8) 

扫描二维码关注公众号,回复: 14456767 查看本文章

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)

接下来我们正常烧录就可以亮了

猜你喜欢

转载自blog.csdn.net/ArtoriaLili/article/details/122052816