基于STM32F103入门1——点亮LED灯

今天学习了STM32固件库点灯程序 点灯也可以玩过很多好玩的东西,在这里做一下总结。

1:新建固件库工程文件

1.1找到一个固件库模板

在这里插入图片描述

1.2:打开KEIL5新建工程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
最终效果:
在这里插入图片描述

1.3:添加相关文件

然后我们针对不同文件夹 我们添加不同的文件进来。
双击STARTUP 添加我们固件库的启动文件

STARTUP:添加Libraries——>CMSIS——>startup中的启动文件
在这里插入图片描述

USER:添加固件库的User文件夹中的.c文件

CMSIS 添加Libraries——>CMSIS文件夹中的.c文件
DOC:添加固件库中Doc文件夹的readme.txt
FWLIB:添加Libraries——>STM32F10x_StdPeriph_Driver文件夹中的.c文件

添加完效果
在这里插入图片描述

扫描二维码关注公众号,回复: 14335034 查看本文章

1.4:手动添加其他文件路径进来

打开stm32f0x.h文件
在这里插入图片描述

按 Ctrl + F 查找 stm32f10x_conf

会调到一下的代码 我们得宏定义加载一下
在这里插入图片描述
在这里插入图片描述
添加其他文件夹.h路径
在这里插入图片描述
这样就是新建固件库工程文件完成了。。。。。
下面就开始点灯 点灯 点灯
下面就开始点灯 点灯 点灯
下面就开始点灯 点灯 点灯

2:STM32固件库点灯

首先你得有个固件库手册来参考 我这里直接上代码。
在这里插入图片描述
我这个用的STM32C8T6板子 PC13是LED灯 根据原理图 给个低电平则点亮

LED配置代码
led.c

#include "stm32f10x.h"
#include "led.h"

void LED_Init(void)
{
    
    	
	//1.打开控制GPIOC的时钟(APB2)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	//2.配置结构体	
	GPIO_InitTypeDef led_init;
	led_init.GPIO_Pin   = GPIO_Pin_13;      //GPIOC13引脚
	led_init.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出	
	led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz
	
	//3.对成员进行初始化
	GPIO_Init(GPIOC, &led_init);
}

led.h

#ifndef _LED_H_
#define _LED_H_

#include "stm32f10x.h"

void LED_Init(void); //LED初始化函数声明

#endif

2.1: 方式1点灯

main.c

#include "stm32f10x.h"
#include "led.h"

int  main()
{
    
    
	LED_Init(); //LED初始化
	
	while(1)
	{
    
    
		//方式1
		//GPIO_SetBits(GPIOC,GPIO_Pin_13);		//P13引脚输出高电平
		GPIO_ResetBits(GPIOC, GPIO_Pin_13); 	//P13引脚输出低电平	
	}   
}

2.2 :方式2点灯

main.c

#include "stm32f10x.h"
#include "led.h"

int  main()
{
    
    
	LED_Init(); //LED初始化
	
	while(1)
	{
    
    
		//方式2
		//GPIO_WriteBit(GPIOC,GPIO_Pin_13, Bit_SET);   //P13引脚输出高电平
		GPIO_WriteBit(GPIOC,GPIO_Pin_13, Bit_RESET); //P13引脚输出低电平
	}   
}

2.3 :方式3点灯

main.c

#include "stm32f10x.h"
#include "led.h"

int  main()
{
    
    
	LED_Init(); //LED初始化
	
	while(1)
	{
    
    
		//方式3
		//GPIO_Write(GPIOC, 0X2000); 	 	//P13引脚输出高电平
		GPIO_Write(GPIOC, 0X0000); 		//整组端口输出低电平
	}   
}

点灯效果

在这里插入图片描述

3:STM32闪烁灯

加一个延时函数 我们就可以做一个 LED闪烁效果了
这里的延时我们没有用到定时器 ,只是简单的通过循环来延时。

delay.c

#include "stm32f10x.h"
#include "delay.h"

void delay_ms(uint16_t time)
{
    
    
	uint16_t i = 0;
	while(time--)
	{
    
    
		i = 10000;
		while(i--);
	}
}


main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"

int  main()
{
    
    
	LED_Init(); //LED初始化
	
	while(1)
	{
    
    
		GPIO_ResetBits(GPIOC, GPIO_Pin_13); 	//LED点亮
		delay_ms(1000); //亮灯大约1秒
		GPIO_SetBits(GPIOC,GPIO_Pin_13);		//LED熄灭
		delay_ms(1000); //熄灭灯大约1秒
	}   
}

闪烁灯效果

在这里插入图片描述

4:STM32呼吸灯

呼吸灯就像我们人呼吸那样,我们可以让灯慢慢的亮 慢慢的暗,这个就是通过占空比来调节。(可以理解为LED高电平时间和LED低电平时间)
比如 LED 亮延时100us 然后 暗 100us 这时候他们占空比是百分之50.
那如果我们 LED 亮10us 然后暗 还是100us 这个时候 你会发现 LED灯变暗了很多。 这个其实是我们的视觉暂停 原因导致的。
所以我们可以通过调节 LED点亮的时间 和 LED 熄灭的时间的比例来调节,让LED 慢慢的亮 然后 慢慢的 暗。

慢慢的亮 意思就是 LED的低电平时间慢慢的增加。
比如从1us 慢慢 到500us 然后LED高电平时间则是 从500us 慢慢到1us。
如果是想着LED灯 亮慢慢 暗 则相反。

main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"

int  main()
{
    
    
	LED_Init(); //LED初始化
	unsigned char i = 0;
	unsigned int t = 1;
	unsigned char flag = 1;
	while(1)
	{
    
    
		if(flag == 1) //LED由暗到亮
		{
    
    
			for(i=0;i<10;i++)
			{
    
    
				GPIO_ResetBits(GPIOC, GPIO_Pin_13); 	//LED点亮
				delay_us(t);
				GPIO_SetBits(GPIOC,GPIO_Pin_13);		//LED熄灭
				delay_us(501-t);
			}
			t++;	
			if(t == 500)
			{
    
    
				flag = 0;
			}
		}
		if(flag == 0) //LED由亮到暗
		{
    
    
			for(i=0;i<10;i++)
			{
    
    	
				GPIO_ResetBits(GPIOC, GPIO_Pin_13); 	//LED点亮
				delay_us(t);
				GPIO_SetBits(GPIOC,GPIO_Pin_13);		//LED熄灭
				delay_us(501-t);
			}
			t--;
			if(t == 1)
			{
    
    
				flag = 1;
			}
		}
	} 
}

呼吸灯效果

在这里插入图片描述

5:STM32按键点灯

我们玩了呼吸灯 也可以玩玩按键点灯,按键其实也是挺简单的,我用的按键是只有两个引脚的,我们任意的一脚接单片机的GND ,另一个接单片机的GPIO 当按下按键 这个GPIO则会是低电平。 那我们就检测这个GPIO是否是低电平 如果是 我们则点亮LED灯。

key.c

#include "stm32f10x.h"
#include "key.h"

/*按键初始化函数*/
void KEY_Init(void)
{
    
    
	//1.打开控制GPIOA的时钟(APB2)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//2.配置结构体	
	GPIO_InitTypeDef key_init;
	key_init.GPIO_Pin   = GPIO_Pin_5;      	//GPIOC13引脚
	key_init.GPIO_Mode  = GPIO_Mode_IPU; 	//上拉输入	
	//led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz
	
	//3.对成员进行初始化
	GPIO_Init(GPIOA, &key_init);
}

main.c

#include "stm32f10x.h"
#include "led.h"
#include "key.h"
#include "delay.h"

int  main()
{
    
    
	LED_Init(); //LED初始化
	KEY_Init(); //按键初始化
	GPIO_SetBits(GPIOC,GPIO_Pin_13);	//LED设置高电平
	GPIO_SetBits(GPIOA,GPIO_Pin_5);		//按键设置高电平
	
	while(1)
	{
    
    
		//如果按键被按下
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0) 	
		{
    
    
				delay_ms(20); //消抖再次判断是否按下
				if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0)
				{
    
    
					GPIO_ResetBits(GPIOC, GPIO_Pin_13); 	//LED点亮
					delay_ms(1000); //延时大约1秒				
				}
		}
		else
		{
    
    
				GPIO_SetBits(GPIOC,GPIO_Pin_13);		//LED熄灭
		}
	} 
}

按键点灯效果

在这里插入图片描述

6:STM32震动感应灯

需要材料:

6.1:震动传感器

在这里插入图片描述

2.继电器

(我用的这个是高电平导通)
在这里插入图片描述

这种是震动传感器,我们可以也通过震动来点灯,我用的这个模块是当发生震动时,会变成低电平。那其实就是相当于我们的按键,我们去检测一下这个模块到底是不是低电平如果是低电平,那么我们让LED灯点亮1秒啥的都有可以。
直接上代码:
配置震动传感器模块代码

代码

shake.c

#include "stm32f10x.h"
#include "shake.h"

/*震动传感器初始化函数*/
void SHAKE_Init(void)
{
    
    
	//打开GPIOC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//配置结构体
	GPIO_InitTypeDef shake_init;
	shake_init.GPIO_Mode  = GPIO_Mode_IPU; 	//上拉输入
	shake_init.GPIO_Pin   = GPIO_Pin_3;		//A3引脚
	//shake_init.GPIO_Speed = GPIO_Speed_50MHz;
	
	//成员初始化
	GPIO_Init(GPIOA, &shake_init);		
}

继电器模块配置代码:

relay.c

#include "relay.h"

/*继电器模块初始化函数*/
void RELAY_Init(void)
{
    
    
	//打开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//配置结构体
	GPIO_InitTypeDef relay_init;
	relay_init.GPIO_Mode  = GPIO_Mode_Out_PP; 	//推挽输出
	relay_init.GPIO_Pin   = GPIO_Pin_4;			//3引脚
	relay_init.GPIO_Speed = GPIO_Speed_50MHz;
	
	//成员初始化
	GPIO_Init(GPIOA, &relay_init);
}

main.c

#include "stm32f10x.h"
#include "led.h"
#include "relay.h"
#include "delay.h"
#include "shake.h"

/*主程序入口*/
int  main()
{
    
    
	LED_Init();  //LED模块初始化
	RELAY_Init();//继电器模块初始化
	SHAKE_Init();//震动传感器初始化
	
	GPIO_SetBits(GPIOC, GPIO_Pin_13); 	//LED高电平
   	GPIO_SetBits(GPIOA, GPIO_Pin_3); 	//震动传感器高电平
	GPIO_ResetBits(GPIOA, GPIO_Pin_4); 	//继电器低电平(关闭)
	while(1)
	{
    
    
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) == 0)
		{
    
    
			GPIO_ResetBits(GPIOC, GPIO_Pin_13); //LED点亮
			GPIO_SetBits(GPIOA, GPIO_Pin_4); 	//继电器导通 (高电平)
			delay_ms(1000);
		}
		else
		{
    
    
			GPIO_SetBits(GPIOC, GPIO_Pin_13); 	//LED不亮
			GPIO_ResetBits(GPIOA, GPIO_Pin_4); 	//继电器不导通 (低电平)
		}
			
	} 
}

如何接线

STM32 震动传感器
3.3V VCC
GND GND
A3 DO
STM32 继电器
5V VCC
GND GND
A4 IN
GND 公共端
STM32 LED灯
3.3V 正极
继电器 LED灯
常开端 负极

项目效果

在这里插入图片描述

如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈

需要整个工程代码和 模块的相关资料,私信我 或者 +我扣扣:844797079 。或者评论区留下的你的联系方式。

继续加油!

猜你喜欢

转载自blog.csdn.net/weixin_47457689/article/details/119395069