用固件库点灯的原理和用寄存器点灯原理一样,都是通过配置寄存器,只不过固件库是把寄存器封装在一个结构体里直接调用即可。 1.在固件库的文件夹中的USER里新建LED文件夹,在LED文件夹中新建led.c和led.h文件。 把led.c新添加进USER里(双击USER然后添加) led.h添加方式:在led.c里包含进去即可 #include “led.h” 然后编译led.c 编译完成后就可以看到led.h在led.c的目录下
2.定义声明 在led.c中加入库函数#include “stm32f10x.h”,并且写一个函数LED_Init(void) 既然写了一个函数,那就要在相对应的.h文件里进行声明,这里我们open #include “led.h” ,在这里声明。 声明方法:在#include "led.h"里 void LED_Init(void);(记住声明要加分号)并且led.h里不要忘了包含#include "stm32f10x.h"的库 3.调用 在main.c里调用函数,值得注意的是,main.c文件中不能直接包含#include “led.h” 。需要在魔术棒-c/c++中添加led.h的路径 4.在led.c里写函数
- 使能APB2的时钟GPIO
①怎么找时钟呢 去外设FWLIB目录中rcc文件 .c文件是包含一些宏定义的文件的,所以我们打开rcc.c直接找到里面的rcc.h文件,我们目标是找到外设配置的使能函数,我们直接复制过来到led.c这里 第一个参数是外设。我们直接到rcc.h文件里找到APB2的GPIOC接口,复制过来,代替括号里的第一个参数。 第二个参数是功能状态。如果不知道其类型可以到rcc.h里找到这个函数名然后Go To Definition,查看其定义类型。我们这里类型是枚举类型,定义了失能和使能。 我们要使其打开,所以填入ENABLE 至此,第一步的使能APB2的时钟GPIC配置完成,如图所示 - 结构体配置
和第一步类似,我们到goio.c中找到gpio.h,在其中找到结构体的定义。我们看到第一个是引脚,第二个是速度,第三个是模式。 新定义一个结构体 led_init后,想要访问可以直接加个小数点. 会自动弹出,如图 结构体的参数在gpio.h中找,如图,GPIOMode的枚举类型如图所示: 依次是模拟输入、浮空输入、下拉、上拉、开漏输出、推挽输出 复用推挽输出(GPIO_Mode_AF_PP):用作串口的输出。 复用开漏输出(GPIO_Mode_AF_OD):用在IIC。 所有的开漏输出都需要接上拉电阻。
我们本次用到的是推挽输出,所以我们复制GPIO_Mode_Out_PP到输出模式,用以作为参数
同样的我们找到Pin的引脚,因为我们用到的是p13,所以我们找到GPIO_Pin_13,复制到led.c, 第三个是speed,同样也是枚举类型,我们找到后又因为点亮LED灯,其速度没有区别,所以选用10MHz。 至此,结构体已经定义完,如图 在定义完结构体之后,需要对结构体函数进行初始化,我们在gpio.h中找到另一个函数GPIO_Init 将其复制到led.c中,其口号内的第一个参数我们改为GPIOC,第二个因为要用指针类型,因此我们要对其取址。 保存编译后,我们发现一个错误:结构体定义要在时钟之前,因此将定义挪到时钟之前,再编译后发现0错误0警告。至此,我们时钟及结构体配置部分已完成。
|