关注 + 点赞 不错过精彩内容
大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作!
在STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src这个路径下复制所有库函数源文件,粘贴到新建的Library文件夹里
这个misc是内核的库函数,其他的是内核外的外设库函数
在STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc这个路径下复制所有库函数头文件,粘贴到新建的Library文件夹里
回到keil软件,在Target1右键添加组改个名字叫Library
再右键加入已存在的Library文件,全选加入进去,这样便添加了所有库函数文件
但对于这个库函数来说,还不能直接使用,还需在STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template这个路径下复制stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h文件,粘贴到新建的Keil工程的User文件夹里
这个conf(configuration)文件是用来配置库函数头文件包含关系的,还有所有函数都需要的用来参数检查的函数定义
两个it(interupt)文件是用来存放中断函数的
回到Keil软件,在User组里,把刚才那三个文件添加进来
点击头文件右键,打开文件
划到最下面 看到这条语句
这是一个条件编译,意思是只有你定义了USE_STDPERIPH_DRIVER这个字串,下面#include这个stm32f10x_conf.h的语句才会有效,所以需要复制下来USE_STDPERIPH_DRIVER
点击魔术棒按钮再到C/C++,粘贴到define这栏, 这样才能包含标准外设库,也就是库函数
把刚才添加的库文件都添加到Keil工程中,包含这些头文件路径,点击Include Paths, 加入user和Library
这样基于库函数的工程已经建立好了
Library组的文件也全都带了钥匙,不需要我们修改,唯一需要我们修改的是user组里的文件
库函数其实也是间接地配置寄存器,所以他们的步骤也是一样的
RCC_APB2PeriphClockCmd,接下来提示两个参数,第一个是选择外设,第二个是选择新的状态
可以点击右键跳转到函数定义(这里一开始无法跳转,因为没有编译一直显示no browse)
这上面有函数的简介和参数说明
这个函数是用来使能或者失能APB2外设时钟。
第一个参数可以是下面的这些值,可以找到APB2外设GPIOC这一项,然后复制作为第一个参数即可
第二个参数,NewState的值可以是ENABLE或者DISABLE,那我们复制ENABLE放在第二个参数的位置
可以看到这个函数,它的内部其实还是配置RCC_APB2ENR这个寄存器,但是经过函数的包装,不需要再去查手册,去确认哪一位是干什么 ,而且这里应用了&=和|=来操作,所以这个库函数配置是不会影响到寄存器的其他位的
代码写为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);这样GPIOC的外设时钟就配置好了
这个代码虽然比寄存器长,但是语义更加明确其,也不需要查表计算值,只需要调用库函数,按照它的提示,把参数填好就行了
这两个参数,选择哪个GPIO和参数的结构体(这里用到了结构体配置参数)
可以点击右键跳转到函数定义
第一个参数GPIOx,其中x可以是A到G,来选择你要配置哪个GPIO,因为是PC13口的LED,所以第一个参数就写GPIOC
而第二个参数是一个GPIO_InitTypeDef的结构体,则需要定义一个结构体。
需要在代码里先把结构体的类型写上GPIO_InitTypeDef,结构体的名字可以随便起,但根据官方推荐最好叫作GPIO_InitStructure。
其次把结构体的每个参数写上,用点 . 来引出结构体的参数,可以看到结构体有三个参数,分别是GPIO模式、GPIO端口、GPIO速度
右键转到GPIO_Mode的定义,根据注释可以得知Mode可以是GPIOMode_TypeDef里面的一个值
注释里的内容无法右键跳转了,所以可以选中GPIOMode_TypeDef这个字符,按下Ctrl+F,搜索这个定义的位置
点击Find Next,可以看到这是个枚举,选择GPIO_Mode_Out_PP这一项复制粘贴到GPIO_Mode的赋值上,这一项就是通用推挽输出
回到main函数,右键转到GPIO_Pin的定义,出现的这个框代表,可以跳转的定义有很多
选择member这一项双击跳转,还是刚刚那个位置,选中Ctrl+F、Find Next然后跳转,这里是个宏定义的列表
因为我们是PC13端口,则选择GPIO_Pin_13这一项复制,粘贴到GPIO_Pin的赋值上
第三个参数也是一样,跳转定义,选中,Ctrl+F、Find Next,选中GPIO_Speed_50MHz复制,填在第三个参数上
这样结构体变量就有了,就可以填写GPIO_Init的第二个参数了
可以回到之前的定义里说明,第二个参数是指向结构体的指针,所以这里需要传输结构体的地址
复制结构体的名字,加上&取地址,&GPIO_InitStructure作为第二个参数
第一个函数GPIO_SetBits就可以把指定端口设置为高电平
第二个函数GPIO_ResetBits将端口配置为低电平,参数与SetBits一样
示例:GPIO_ResetBits(GPIOC, GPIO_Pin_13);这句便可将PC13号端口设置为低电平
想要灯亮的整个代码是:
#include "stm32f10x.h" // Device header
int main(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//GPIO_SetBits(GPIOC, GPIO_Pin_13);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
while(1){
}
}
想要灯灭的整个代码是:
#include "stm32f10x.h" // Device header
int main(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
//GPIO_ResetBits(GPIOC, GPIO_Pin_13);
while(1){
}
}
以上整个就是学习库函数的基本操作
作 者 :硬核王同学
------- END ------
关注公众号回复“加群”按规则加入技术交流群 回复“1024”查看更多内容