stm32——点亮LED

本文介绍了如何使用STM32的GPIO寄存器和固件库来控制LED灯的亮灭。首先,讲解了GPIO的工作原理和所需配置的寄存器,包括模式寄存器、时钟寄存器和置位复位寄存器。然后,通过示例代码展示了如何直接操作寄存器点亮LED。接着,对比之下,固件库的使用更为简便,通过库函数可以快速实现LED的初始化和控制。最后,提供了固件库点亮LED的完整代码流程,包括端口使能、初始化和置位复位操作。
摘要由CSDN通过智能技术生成

1.点亮LED灯的准备工作

需要了解GPIO的基本工作原理,话不多说,先上图

 关于详细的功能介绍,请参考普中科技F407详细资料,今天主要到的是GPIO的推挽输出模式

如图

通过软件向寄存器中写入数据,然后通过图中所示线路控制IO口输入高低电平,从而控制LED灯。

其次,需要了解GPIO配置所需的寄存器,比如模式寄存器,时钟寄存器,置位复位寄存器等。

了解了这些,我们就可以开始点灯了

点灯大法一——使用寄存器点亮LED

1.查看开发板原理图,看看自己的板子上LED是与哪一个管脚连接。(我用的普中f407,LED与gpiof9连接)

根据原理图,要使LED1亮,就必须让PF9输出为低电平。

下面就开始使用寄存器来操作 STM32 使 PF9 输出一个低电平。要操作 STM32
寄存器,我们就需要使用 C 语言对其封装,这部分程序我们都放在 stm32f4xx.h
中。具体代码如下:

#define PERIPH_BASE ((unsigned int)0x40000000)
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400)
#define GPIOF_MODER *(unsigned int*)(GPIOF_BASE+0x00)
#define GPIOF_BSRR *(unsigned int*)(GPIOF_BASE+0x18)
#define RCC_BASE (AHB1PERIPH_BASE + 0x3800)
#define RCC_AHB1ENR *(unsigned int*)(RCC_BASE+0x30)

这里需要GPIOF的总线的地址,也就是说,GPIOF是挂接到AHB1总线上的,然后就是配置GPIO的各种模式需要的寄存器地址(详细参考普中科技)

将寄存器封装好就可以编写程序了

#include "stm32f4xx.h" (1)
int main()
{
RCC_AHB1ENR |= 1<<5; (2)
GPIOF_MODER = (1<<(2*9)); (3)
GPIOF_BSRR=(1<<(16+9)); (4)
while(1)
{
}
}

首先让GPIOF起作用,就必须让对应的管脚使能,即给他置1.

 该寄存器第5位是GPIOF设置位,通过将第五位置1,将PF9使能。通过查看手册,将模式寄存器配置为推挽输出,然后通过置位寄存器将PF9置0,就完成了基本的点亮LED的操作。编译,下载后就可以看到效果。

当然也可以配置速度寄存器等,也可以写延时函数实现闪烁的效果。

不过,使用寄存器点灯太过麻烦,需要修改的话很不方便

然后就有了点灯大法——固件库函数

stm公司封装了大量的库函数,我们只需要将库以及一些内核文件加载进工程,就可以轻松实现点灯,看操作:

首先需要建立几个文件夹

 然后就需要在开发板提供的资料中去复制需要的文件,user中需要的基本文件如下

Libraries中需要的文件

 CMSIS中包含一些内核文件以及启动文件

 STM32F4xx_Stdperiph_driver包含的是各种外设,把资料中的全部复制过来就行

复制完以上内容,就可以建工程,

 添加文件

 将所需要的文件添加到工程。然后开始配置选项卡。

基本步骤和寄存器模板类似值得注意的地方就是

一定要注意,第二步中间是逗号,不然会报很多错。添加文件时注意路径是否添加正确。

在写程序之前,先创建一个文件夹,将LED的代码保存在这个文件夹中,方便修改和维护。

 里面新建上图中的.c和.h文件。

编写.h文件

 

 用固件库点亮LED步骤;

首先端口使能,初始化(各种寄存器配置),对管脚置低电平;

GPIOF端口使能函数

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

后面的参数都可以在相应的头文件中找到。

初始化函数

首先定义结构体变量

 GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure结构体中的成员都已经在头文件封装好,只需要将需要的成员找到并赋值即可。

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//模式为输出模式;
    GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//管脚配置为9;
    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;上拉模式
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;速度为100M
    GPIO_Init(GPIOF,&GPIO_InitStructure);初始化;

然后就需要一个重要的函数,为管脚置位。

GPIO_ResetBits(GPIOF,GPIO_Pin_9);GPIO管脚输出低电平;

 GPIO_SetBits(GPIOF,GPIO_Pin_9);GPIO复位,输出高电平;

然后将代码整合一下,在led.c文件编写LED初始化函数

#include "led.h"

void led_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_Init(GPIOF,&GPIO_InitStructure); 
}

 将写好的函数在头文件声明;

然后在主函数中引用

#include "stm32f4xx.h"
#include"led.h"

int main()
{
  led_Init();
while(1)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9);
	
  }
}

这样就完成了LED灯的点亮。添加一个延时和复位函数就可以实现闪烁效果;

部分资源来源于普中科技,如有侵权,联系删除(2361823003@qq.com)

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值