草庐IT

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

皮卡丘吉尔 2023-09-03 原文

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

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文件

添加完效果

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.3VVCC
GNDGND
A3DO
STM32继电器
5VVCC
GNDGND
A4IN
GND公共端
STM32LED灯
3.3V正极
继电器LED灯
常开端负极

项目效果

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

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

继续加油!

有关基于STM32F103入门1——点亮LED灯的更多相关文章

  1. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  2. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  3. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  4. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  5. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  6. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  7. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  8. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  9. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  10. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

随机推荐