stm32-手把手妈宝级-三种跑马灯写法
作者:互联网
第一阶段
首先我们在进行stm32学习和项目,先对对应的模板进行封装好。
开始先进行软件的安装keil 5,keil 5的安装教程可以上个公众号“软件管家”和对应的stm32f1/f4的环境配置可以直接上B战看看视频。接下来我直接从文件的配置开始,如果已经会配置的同学或者是想说我已经直接copy官方给的例程的同学可以直接跳掉下个阶段。
首先在自己的文件盘中创建个文件夹
文件夹里在创建如下文件夹
然后在第一个CORE文件夹中存放如下东西
这个东西在那里找呢,让我们前往在官网下的资源包,或者你可以直接从商家给的资源包里找
一般在A盘(当然直接拷贝例程里的CORE也是可以的效果一样)
而FWLIB中是这样的
需要在固件库中找中的文件要在
将其拷贝过来就行了。
而在HARDWARE中存的是你想要实现哪个模块的功能的地方,如在这篇文章里是用来存跑马灯
而OBJ文件夹,是我们为了更好更快的找到在串口烧录时找到.hex文件而存在,你也可以不用创建,因为在你开始用keil 5 创建好工程时就会自动帮你存在USER中的objects(如果你需要将.hex文件放在OBJ里就要改变下存放路径,在下阶段的操作里会进行讲解如何改变路径)
在SYSTTEM中里面存的是这个
这个可以直接在例程里直接下载
从里面的SYSTEM中copy下
在剩下USER文件就是我们自己使用的地方。
一般情况下你需要将这7个文件给装在USER文件夹中(在资料盘中点搜索可以找到
以上的步骤创建好了就可以进行下个阶段的创建操作
第二阶段
然后回到keil 5 开始环境配置
首先先点开project选第一个创建New uvision project
创造出一个工程,一般情况下,我们会创建一个和我们上个阶段初始文件夹里面一样名的文件
创建好后一般会出现如下图现象
这时候需要你鼠标右键点开它Template
选点第三个Manage就会下图
然后你在中间Groups中间点这个
手打将上个阶段的这排文件夹名字全部打进入(除了OBJ,点一下打一个)
就会有这样的效果了
这一个设完了后就可以开始进行文件添加c文件
就是直接将上个阶段里的东西加入在keil 5 中设置的文件
后面出现这个
然后点开魔法棒
点C/C++
跟刚才一样将上个阶段的.h文件添加进去。
之后就可以开始敲代码了
先点开
第三阶段
创建main.c,led.c,led.h
创建这3个是将使用和初始化设置分开。
开始进入正题环节。
第一种:采用库函数进行跑马灯的实现
就是在设置好了,led.c,main.c,led.h分配放在第一阶段里的USER 和HARDWARE中
记住你存放的地方是在文件夹里但是在keil 5上没有显示那样的话,你就要和上步添加
一样将你创建好的main.c,led.c,led.h也放进去
接下来写代码
第一种-使用库函数-写跑马灯
将led.h和led.c中放你想要实现得到的功能,像我们这里的话就是将跑马灯的功能进行实现
//led.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
在这里面的
#ifndef __LED_H
#define __LED_H
#endif
是加入系统工程他没有帮我们将led的定义给定义出来,那就定义,如果已经帮我们定义好了也不用但是他们在读到这条语句时不会再次定义。而在这个其中的void LED_Init(void);是用来函数声明用的,而具体的函数定义和实现是在led.c里面。
led.c
//led.c
#include "led.h"//就是是将之前定义的led.h给引用出来 。
#include "stm32f4xx.h"//就是属于stm32单片机所用到的头文件。
//在这里我会细致到每一步的讲解。
//开始就行函数定义初始化。
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*初始化你对应的GPIO口,这一个怎么选择我会在下面,截图中体现出来,它这个语句就是定义下*/
//F9
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);/*这里就是对于时钟的定义,时钟就是单片机的脉搏,他会推动单片机的额指令的进行*/
//下面的就是对于单片机对于所使用的引脚或GPIO口进行定义
//这个涉及到寄存器,单片机一般有10个寄存器,但在GPIO口中我们一般用五个寄存器就够了
//分别对应哪个具体的引脚,模式,频率等
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//将其初始化 存储好
GPIO_Init(GPIOF,&GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_9);//默认初始化为高电频
//下文与上文相同
//F10
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOF,&GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
}
对于main.c函数
#include "stm32f4xx.h"//这里的讲解参考上边代码
#include "led.h"
#include "delay.h"
int main(void)
{
delay_init(168);/*延迟函数的初始化,你要调用延迟函数就不单单是将头文件进行包含,还需要初始化它调用*/
LED_Init();//在led.h里有初始化定义,这里调用led初始化
while(1)//需要不断循环,不然单片机循环一遍就停了
{
GPIO_SetBits(GPIOF,GPIO_Pin_9);//将对应引脚的电平调高,灯灭
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay_ms(500);
GPIO_ResetBits(GPIOF,GPIO_Pin_9);//将对应引脚的电平调低,灯亮
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay_ms(500);
}
}
第二种-在库函数中用位操作-写跑马灯
led.c与led.h的写法和上边相同
就是在main.c不同
#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"
int main(void)
{
delay_init(168);
LED_Init();
while(1)
{
// GPIO_SetBits(GPIOF,GPIO_Pin_9);
//GPIO_SetBits(GPIOF,GPIO_Pin_10);
PFout(9)=1;//它这里直接使用PFout()函数来实现位操作使其直接赋值调节高低电平
PFout(10)=1;
delay_ms(500);
//GPIO_ResetBits(GPIOF,GPIO_Pin_9);
// GPIO_ResetBits(GPIOF,GPIO_Pin_10);
PFout(9)=0;
PFout(10)=0;
delay_ms(500);
}
}
第三种-使用寄存器-写跑马灯
在文件配置时它不需要像库函数那样那么多只需要几个就够了
并且它是直接进行其他的底层代码块实现功能赋值(库函数,本身就是以函数定义来用寄存器)
//main.c
#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"
int main(void)
{
delay_init(168);
LED_Init();
while(1)
{
GPIOF->ODR&=~(1<<9);
GPIOF->ODR&=~(1<<10);
delay_ms(50);
GPIOF->ODR|=1<<9;
GPIOF->ODR|=1<<10;
delay_ms(50);
}
}
文章转载至
标签:led,Pin,妈宝级,InitStructure,stm32,跑马灯,GPIOF,GPIO,include 来源: https://blog.csdn.net/weixin_51471186/article/details/118789267