STM32入门教程-2023版【2-2】通过配置库函数点灯

关注 + 点赞   不错过精彩内容

图片

大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 

六、配置库函数的方式完成点灯操作

1.打开工程文件夹,再创立一个文件夹Library,

用来存放库函数

图片

在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组里,把刚才那三个文件添加进来

图片

2.此时Keil还需要一个宏定义,main文件才可以包含stm32f10x.h的头文件

点击头文件右键,打开文件

图片

划到最下面 看到这条语句

这是一个条件编译,意思是只有你定义了USE_STDPERIPH_DRIVER这个字串,下面#include这个stm32f10x_conf.h的语句才会有效,所以需要复制下来USE_STDPERIPH_DRIVER

图片

点击魔术棒按钮再到C/C++,粘贴到define这栏, 这样才能包含标准外设库,也就是库函数

图片

把刚才添加的库文件都添加到Keil工程中,包含这些头文件路径,点击Include Paths, 加入user和Library

图片

这样基于库函数的工程已经建立好了

Library组的文件也全都带了钥匙,不需要我们修改,唯一需要我们修改的是user组里的文件

3.小tip:可以点三个箱子的图标,把Library往上挪,让页面看起来整齐一些

图片

图片

4.接使用库函数来实现点灯操作

库函数其实也是间接地配置寄存器,所以他们的步骤也是一样的

4.1使能时钟,库函数有这样一个函数来开启时钟

RCC_APB2PeriphClockCmd,接下来提示两个参数,第一个是选择外设,第二个是选择新的状态

图片

可以点击右键跳转到函数定义(这里一开始无法跳转,因为没有编译一直显示no browse)

图片

这上面有函数的简介和参数说明

图片

这个函数是用来使能或者失能APB2外设时钟。

  • 第一个参数可以是下面的这些值,可以找到APB2外设GPIOC这一项,然后复制作为第一个参数即可

  • 第二个参数,NewState的值可以是ENABLE或者DISABLE,那我们复制ENABLE放在第二个参数的位置

可以看到这个函数,它的内部其实还是配置RCC_APB2ENR这个寄存器,但是经过函数的包装,不需要再去查手册,去确认哪一位是干什么 ,而且这里应用了&=和|=来操作,所以这个库函数配置是不会影响到寄存器的其他位的

图片

代码写为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);这样GPIOC的外设时钟就配置好了

图片

这个代码虽然比寄存器长,但是语义更加明确其,也不需要查表计算值,只需要调用库函数,按照它的提示,把参数填好就行了

4.2 接下来是配置端口模式,我们需要用到GPIO_Init这个函数

这两个参数,选择哪个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作为第二个参数

图片

4.3 最后来设置端口的高低电平来进行点灯

第一个函数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”查看更多内容

  • 39
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬核王同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值