基于标准外设库的LED流水灯

目录

一、题目要求

二、过程呈现

1、stm32工程文件夹的创建

1.1.st标准库的下载

1.2.创建文件夹

2、STM32工程创建

3、工程代码

4、LED流水灯实验

5、LED流水灯仿真实验

三、总结


一、题目要求

在实验1的基础上,改用标准外设库方式使用某个端口GPIOx端口管脚控制几个LED灯,轮流闪烁,间隔时长1秒。

1)写出工程项目创建文件夹、添加STM32标准外设库文件(*.c,*.h)的详细过程;

2)LED灯的亮/灭周期是通过软件循环延时完成的,其准确周期大致是多少呢? 

  在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察GPIO端口的输出波形,并分析时序状态正确与否、高低电平转换周期(LED闪烁周期)实际为多少。

二、过程呈现

1、stm32工程文件夹的创建

1.1.st标准库的下载

参考博文

下载完成后如图所示

1.2.创建文件夹

1)创建好如下文件夹

2)CMSIS文件夹

将下载好的ST标准库中的相应文件复制粘贴到该文件夹中,如下图所示

同时,startup文件放置如下文件

3)Doc文件夹

其用于存放项目说明文件,同样从下载的ST标准库中复制粘贴如下图所示的相应文件

4)Libraries文件夹

我们这里直接将ST标准库的中的两个文件夹复制到此处,如下图

复制到创建的Librarles文件夹

5)project文件夹

这里我们先不要动

6)Usr文件夹

将下载的ST标准库的如下文件复制粘贴到文件夹中,如下图所示

同时新建一个txt文件,并修改后缀为.c,上图已经显示

2、STM32工程创建

打开keil,新建项目,其文件目录选择创建的文件夹,如图

然后选择自己使用的芯片即可

点击Target1,选择第二项,

按所创建的文件夹添加,如下

然后点击ok即可

双击上诉文件夹,添加c文件,

最终添加的文件如下所示

点击魔法棒进行配置

添加宏定义

添加头文件路径

3、工程代码

我们可以在keil打开之前创建文件夹时所新建的main.c文件,然后我们编译,输入以下代码

#include	"stm32f10x.h"
#include 	"bsp_led.h"
 
//软件延时函数1ms
void delay_ms(uint32_t	time)
{
	uint32_t	i;
	while(time--)
	{
		i=12000;
		while(i--);
	}
}
 
int main(void)
{
	while(1)
	{
    //直接调用复位置位函数
		LED_GPIO_Config();
		while(1)
		{
			//来到这里的时候,系统的时钟已经被配置成72M了	
			GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);  //点亮
	//		LED_G(ON);		
			delay_ms(100);			
			GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN); //熄灭
	//		LED_G(OFF);
			delay_ms(100);
			GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
			delay_ms(100);
			GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
			
			delay_ms(100);
			GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
			delay_ms(100);
			GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
			delay_ms(100);
	    }
	}
}

在keil中如下所示

新建一个文件以对每一个灯进行宏定义,并编译如下代码

#ifndef _BSP_LED_H
#define	_BSP_LED_H
 
#include	"stm32f10x.h"
 
#define		LED1_GPIO_PIN		GPIO_Pin_0  //绿灯
#define		LED1_GPIO_PORT		GPIOB
#define		LED_GPIO_CLK		RCC_APB2Periph_GPIOB
 
#define		LED2_GPIO_PIN		GPIO_Pin_1	//蓝灯
#define		LED2_GPIO_PORT		GPIOB
#define		LED_GPIO_CLK		RCC_APB2Periph_GPIOB
 
#define		LED3_GPIO_PIN		GPIO_Pin_5	//红灯
#define		LED3_GPIO_PORT		GPIOB
#define		LED_GPIO_CLK		RCC_APB2Periph_GPIOB
 
#define		ON		1
#define		OFF		0	
 
#define		LED1_G(a)		if(a)	\
														GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
											else	GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
 
#define		LED2_B(a)		if(a)	\
														GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
											else	GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
 
#define		LED3_R(a)		if(a)	\
														GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\
											else	GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
 
void LED_GPIO_Config(void);
#endif

在软件中如下图所示

新建一个bsp_led.c文件些GPIO配置函数

然后再打开的窗口中输入如下代码

#include "bsp_led.h"
 
void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef		GPIO_InitStructure;		//	定义初始化结构体
	
	
	RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);  //开时钟
	
	GPIO_InitStructure.GPIO_Pin=LED1_GPIO_PIN;		//选择GPIO要控制的引脚0
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	
	GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStructure);	
	
	GPIO_InitStructure.GPIO_Pin=LED2_GPIO_PIN;		//选择GPIO要控制的引脚1
	GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=LED3_GPIO_PIN;		//选择GPIO要控制的引脚5
	GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStructure);
	
	//熄灭所有灯
	GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN); 
	GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN); 
	GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN); 
}

再keil软件中如下

同时,创建上述文件时,要将其放在User文件夹下,并且后缀一定要选择.c与.h文件,此外,也要将其加入到User文件夹下

4、LED流水灯实验

板子的连接

PA0-绿,PA1-黄,PA2红

实物连接

配置keil

点击魔法棒,选择debug,勾选如图所示选项

点击setting后勾选第三项

然后点击add,选择如图所示的选项

同时不要忘了勾选创建hex文件的选项

点击编译即可生成hex文件,然后我们通过ST-link进行烧录即可

最终结果如下图所示

5、LED流水灯仿真实验

下面进入keil仿真

点击放大镜

进入页面后选择逻辑分析仪

点击view菜单,symbols windows选项,找到查看波形的引脚

添加引脚信息,,然后我们选择好对应的颜色,完成配置后即可点击左上角进行仿真

仿真效果演示

三、总结

这次实验对自身的能力要求还是有些高,我自己在完成实验时遇到了很多的问题,自己要解决,还是必须要参考相关资料文章才可以勉强完成,特别是后面的keil仿真,希望下次实验可以做的更好。

四、参考网址

https://blog.csdn.net/qq_43279579/article/details/110320013

https://www.st.com/zh/embedded-software/stm32-standard-peripheral-libraries.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值