你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU小助手 发布时间:2022-8-22 17:54
1:新建固件库工程文件
1.1找到一个固件库模板

dc1aecf892534b12af631f21c45bc551.png

1.2:打开KEIL5新建工程

fbca021ad7014fbf8c7664d39f1ae028.png
b021b297a09943dfad08166e1a15dc10.png

5d830c380d4343639813ddab575205aa.png

3977bcfefa4b46578fb343221cd79c3f.png

6ab637baa1fe4c38b200292c687fafdd.png

ca92a18ae3794627bb9e56ed829aa6ad.png

最终效果:

dbea0d75e9414049b1778c128bcd4176.png

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

STARTUP:添加Libraries——>CMSIS——>startup中的启动文件

dc2b5023a973463ba8e4a9766c4f3ece.png

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

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

添加完效果

82e52525e8774bb997afe3dd424a944d.png

1.4:手动添加其他文件路径进来
打开stm32f0x.h文件

a3aa59ff095846df9b539ae9c9b44411.png

按 Ctrl + F 查找 stm32f10x_conf
会调到一下的代码 我们得宏定义加载一下

4a32be7399314231892c27901d5a5f52.png

306a1304ef4a4a47b21c3a67edb492f0.png

添加其他文件夹.h路径

40ceb887340241db9e0324e08c262c84.png

这样就是新建固件库工程文件完成了。。。。。
下面就开始点灯 点灯 点灯
下面就开始点灯 点灯 点灯
下面就开始点灯 点灯 点灯

2:STM32固件库点灯
首先你得有个固件库手册来参考 我这里直接上代码。

9850adf62a004c968dfbb31f5f2e1cb2.png

我这个用的STM32C8T6板子 PC13是LED灯 根据原理图 给个低电平则点亮

LED配置代码

led.c
  1. #include "stm32f10x.h"
  2. #include "led.h"

  3. void LED_Init(void)
  4. {        
  5.         //1.打开控制GPIOC的时钟(APB2)
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  7.         
  8.         //2.配置结构体        
  9.         GPIO_InitTypeDef led_init;
  10.         led_init.GPIO_Pin   = GPIO_Pin_13;      //GPIOC13引脚
  11.         led_init.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出        
  12.         led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz
  13.         
  14.         //3.对成员进行初始化
  15.         GPIO_Init(GPIOC, &led_init);
  16. }
复制代码

led.h
  1. #ifndef _LED_H_
  2. #define _LED_H_

  3. #include "stm32f10x.h"

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

  5. #endif
复制代码

2.1: 方式1点灯
main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"

  3. int  main()
  4. {
  5.         LED_Init(); //LED初始化
  6.         
  7.         while(1)
  8.         {
  9.                 //方式1
  10.                 //GPIO_SetBits(GPIOC,GPIO_Pin_13);                //P13引脚输出高电平
  11.                 GPIO_ResetBits(GPIOC, GPIO_Pin_13);         //P13引脚输出低电平        
  12.         }   
  13. }
复制代码

2.2 :方式2点灯
main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"

  3. int  main()
  4. {
  5.         LED_Init(); //LED初始化
  6.         
  7.         while(1)
  8.         {
  9.                 //方式2
  10.                 //GPIO_WriteBit(GPIOC,GPIO_Pin_13, Bit_SET);   //P13引脚输出高电平
  11.                 GPIO_WriteBit(GPIOC,GPIO_Pin_13, Bit_RESET); //P13引脚输出低电平
  12.         }   
  13. }
复制代码

2.3 :方式3点灯
main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"

  3. int  main()
  4. {
  5.         LED_Init(); //LED初始化
  6.         
  7.         while(1)
  8.         {
  9.                 //方式3
  10.                 //GPIO_Write(GPIOC, 0X2000);                  //P13引脚输出高电平
  11.                 GPIO_Write(GPIOC, 0X0000);                 //整组端口输出低电平
  12.         }   
  13. }
复制代码

点灯效果

10c2586eaca64bcf9e6022d7b2086b1e.jpg

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

delay.c

  1. #include "stm32f10x.h"
  2. #include "delay.h"

  3. void delay_ms(uint16_t time)
  4. {
  5.         uint16_t i = 0;
  6.         while(time--)
  7.         {
  8.                 i = 10000;
  9.                 while(i--);
  10.         }
  11. }
复制代码

main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "delay.h"

  4. int  main()
  5. {
  6.         LED_Init(); //LED初始化
  7.         
  8.         while(1)
  9.         {
  10.                 GPIO_ResetBits(GPIOC, GPIO_Pin_13);         //LED点亮
  11.                 delay_ms(1000); //亮灯大约1秒
  12.                 GPIO_SetBits(GPIOC,GPIO_Pin_13);                //LED熄灭
  13.                 delay_ms(1000); //熄灭灯大约1秒
  14.         }   
  15. }
复制代码
闪烁灯效果

54c83c8225654865a2510d09a59350a5.gif

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

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

main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "delay.h"

  4. int  main()
  5. {
  6.         LED_Init(); //LED初始化
  7.         unsigned char i = 0;
  8.         unsigned int t = 1;
  9.         unsigned char flag = 1;
  10.         while(1)
  11.         {
  12.                 if(flag == 1) //LED由暗到亮
  13.                 {
  14.                         for(i=0;i<10;i++)
  15.                         {
  16.                                 GPIO_ResetBits(GPIOC, GPIO_Pin_13);         //LED点亮
  17.                                 delay_us(t);
  18.                                 GPIO_SetBits(GPIOC,GPIO_Pin_13);                //LED熄灭
  19.                                 delay_us(501-t);
  20.                         }
  21.                         t++;        
  22.                         if(t == 500)
  23.                         {
  24.                                 flag = 0;
  25.                         }
  26.                 }
  27.                 if(flag == 0) //LED由亮到暗
  28.                 {
  29.                         for(i=0;i<10;i++)
  30.                         {        
  31.                                 GPIO_ResetBits(GPIOC, GPIO_Pin_13);         //LED点亮
  32.                                 delay_us(t);
  33.                                 GPIO_SetBits(GPIOC,GPIO_Pin_13);                //LED熄灭
  34.                                 delay_us(501-t);
  35.                         }
  36.                         t--;
  37.                         if(t == 1)
  38.                         {
  39.                                 flag = 1;
  40.                         }
  41.                 }
  42.         }
  43. }
复制代码

95844b67845f487f92b0f43adfbda629.gif


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

key.c
  1. #include "stm32f10x.h"
  2. #include "key.h"

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

main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "key.h"
  4. #include "delay.h"

  5. int  main()
  6. {
  7.         LED_Init(); //LED初始化
  8.         KEY_Init(); //按键初始化
  9.         GPIO_SetBits(GPIOC,GPIO_Pin_13);        //LED设置高电平
  10.         GPIO_SetBits(GPIOA,GPIO_Pin_5);                //按键设置高电平
  11.         
  12.         while(1)
  13.         {
  14.                 //如果按键被按下
  15.                 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0)         
  16.                 {
  17.                                 delay_ms(20); //消抖再次判断是否按下
  18.                                 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0)
  19.                                 {
  20.                                         GPIO_ResetBits(GPIOC, GPIO_Pin_13);         //LED点亮
  21.                                         delay_ms(1000); //延时大约1秒                                
  22.                                 }
  23.                 }
  24.                 else
  25.                 {
  26.                                 GPIO_SetBits(GPIOC,GPIO_Pin_13);                //LED熄灭
  27.                 }
  28.         }
  29. }
复制代码

按键点灯效果

2a2e78b109844b41830483e8babcecac.gif

6:STM32震动感应灯
需要材料:
6.1:震动传感器

0b28e51b4d35468aa50a2d6fafc6bce9.png

2.继电器
(我用的这个是高电平导通)

{TC(FUIKDJI]`1F)Q556~1P.png


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

代码
  1. shake.c
  2. #include "stm32f10x.h"
  3. #include "shake.h"

  4. /*震动传感器初始化函数*/
  5. void SHAKE_Init(void)
  6. {
  7.         //打开GPIOC时钟
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  9.         
  10.         //配置结构体
  11.         GPIO_InitTypeDef shake_init;
  12.         shake_init.GPIO_Mode  = GPIO_Mode_IPU;         //上拉输入
  13.         shake_init.GPIO_Pin   = GPIO_Pin_3;                //A3引脚
  14.         //shake_init.GPIO_Speed = GPIO_Speed_50MHz;
  15.         
  16.         //成员初始化
  17.         GPIO_Init(GPIOA, &shake_init);               
  18. }
复制代码

继电器模块配置代码:

relay.c
  1. #include "relay.h"

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

  7.         //配置结构体
  8.         GPIO_InitTypeDef relay_init;
  9.         relay_init.GPIO_Mode  = GPIO_Mode_Out_PP;         //推挽输出
  10.         relay_init.GPIO_Pin   = GPIO_Pin_4;                        //3引脚
  11.         relay_init.GPIO_Speed = GPIO_Speed_50MHz;
  12.         
  13.         //成员初始化
  14.         GPIO_Init(GPIOA, &relay_init);
  15. }
复制代码
main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "relay.h"
  4. #include "delay.h"
  5. #include "shake.h"

  6. /*主程序入口*/
  7. int  main()
  8. {
  9.         LED_Init();  //LED模块初始化
  10.         RELAY_Init();//继电器模块初始化
  11.         SHAKE_Init();//震动传感器初始化
  12.         
  13.         GPIO_SetBits(GPIOC, GPIO_Pin_13);         //LED高电平
  14.            GPIO_SetBits(GPIOA, GPIO_Pin_3);         //震动传感器高电平
  15.         GPIO_ResetBits(GPIOA, GPIO_Pin_4);         //继电器低电平(关闭)
  16.         while(1)
  17.         {
  18.                 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) == 0)
  19.                 {
  20.                         GPIO_ResetBits(GPIOC, GPIO_Pin_13); //LED点亮
  21.                         GPIO_SetBits(GPIOA, GPIO_Pin_4);         //继电器导通 (高电平)
  22.                         delay_ms(1000);
  23.                 }
  24.                 else
  25.                 {
  26.                         GPIO_SetBits(GPIOC, GPIO_Pin_13);         //LED不亮
  27.                         GPIO_ResetBits(GPIOA, GPIO_Pin_4);         //继电器不导通 (低电平)
  28.                 }
  29.                         
  30.         }
  31. }
复制代码

如何接线

WZ{SVLRN5LOFBY}_3TFWL.png

O7M9QDYEJ(%}O((1LTD0JZL.png

项目效果


635f14b1dc7c41a19f922821ce0c3e00.gif

————————————————
转载:皮卡丘吉尔
收藏 评论0 发布时间:2022-8-22 17:54

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版