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)