首页 > 其他分享 >stm32------点亮LED

stm32------点亮LED

时间:2023-04-09 14:13:03浏览次数:43  
标签:LED1 LED3 LED2 LED stm32 ------ GPIO define

从点灯开始,开始stm32的学习之旅!

直奔主题:

  keil软件版本:V5.35.00

  单片机型号:STM32F103VET6(因手上的是野火的指南者开发板,姑且以此为例)

  点灯步骤大致为:硬件图确认引脚和驱动电路——>软件配置相应引脚功能(时钟、输出模式)——>简单延时方法——>控制引脚输出高、低电平——>系统联调

step1:确认硬件连接、确认对应的GPIO引脚和驱动电路(软件需要根据具体硬件进行相关配置)

  

这里的小灯是一个RGB灯(红、绿、蓝),可以由三个IO口控制,输出不同颜色;同时,IO口输出低电平时灯亮,输出高电平时,灯灭

step2:知道了如何控制灯的亮灭,这里就开始配置对应的IO引脚,首先使用宏定义引脚,方便后续程序移植;

 1 /**
 2   ******************************************************************************
 3   * @file    template/User/GPIO_LED.h
 4   * @author  ChuanWang
 5   * @version V5.35
 6   * @date    09-April-2023
 7   * @brief   led program body
 8   ******************************************************************************
 9   * @attention
10   *
11   ******************************************************************************
12   */  
13 
14 #ifndef __GPIO_LED_H
15 #define __GPIO_LED_H
16 
17 /* Includes ------------------------------------------------------------------*/
18 #include "stm32_userconfig.h"
19 
20 
21 
22 
23 //Red
24 #define LED1_GPIO_PORT  GPIOB
25 #define LED1_GPIO_CLK   RCC_APB2Periph_GPIOB
26 #define LED1_GPIO_PIN   GPIO_Pin_5
27 
28 //Green
29 #define LED2_GPIO_PORT  GPIOB
30 #define LED2_GPIO_CLK   RCC_APB2Periph_GPIOB
31 #define LED2_GPIO_PIN   GPIO_Pin_0
32 
33 //Blue
34 #define LED3_GPIO_PORT  GPIOB
35 #define LED3_GPIO_CLK   RCC_APB2Periph_GPIOB
36 #define LED3_GPIO_PIN   GPIO_Pin_1
37 
38 
39 
40 
41 /*LED使用的GPIO引脚初始化*/
42 extern void LED_GPIO_Config(void);
43 
44 
45 
46 #endif /*__GPIO_LED_H*/
GPIO_LED.h

 step3:配置引脚时钟、引脚模式、引脚速率以及初始状态

 1 /**
 2   ******************************************************************************
 3   * @file    template/User/GPIO_LED.c
 4   * @author  ChuanWang
 5   * @version V5.35
 6   * @date    09-April-2023
 7   * @brief   led gpio program body
 8   ******************************************************************************
 9   * @attention
10   *
11   ******************************************************************************
12   */  
13 
14 /* Includes ------------------------------------------------------------------*/
15 #include "GPIO_LED.h"
16 
17 
18 
19 /* Private functions ---------------------------------------------------------*/
20 /**
21   * @brief  LED_GPIO_Config program.
22   * @param  None
23   * @retval None
24   */
25 void LED_GPIO_Config(void)
26 {
27     /*定义一个GPIO_InitTypeDef类型的结构体*/
28     GPIO_InitTypeDef  GPIO_InitStructure;
29 
30     /*开启LED相关的GPIO外设时钟*/
31     RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);    //使用宏来赋值,方便移植
32     
33     /*选择需要控制点GPIO引脚*/
34     GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
35     
36     /*设置引脚模式为通用推挽输出*/
37     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
38     
39     /*设置引脚速率为50MHz*/
40     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
41     
42     /*调用库函数,初始化GPIO*/
43     GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStructure);
44     
45     
46     /*选择需要控制点GPIO引脚*/
47     GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
48     
49     /*调用库函数,初始化GPIO*/
50     GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStructure);
51     
52     /*选择需要控制点GPIO引脚*/
53     GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
54     
55     /*调用库函数,初始化GPIO*/
56     GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStructure);
57     
58     
59     /*关闭所有LED灯*/
60     GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);            //使用宏控制RGB灯默认为关闭状态
61     GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
62     GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
63 }
GPIO_LED.c

 step4:在led_operation中对led控制,由于使用宏定义,没有自定义方法,故没有贴出来led_operation.c代码(空)

  1 /**
  2   ******************************************************************************
  3   * @file    template/User/led_operation.h
  4   * @author  ChuanWang
  5   * @version V5.35
  6   * @date    02-April-2023
  7   * @brief   led program body
  8   ******************************************************************************
  9   * @attention
 10   *
 11   ******************************************************************************
 12   */  
 13 
 14 #ifndef __LED_OPERATION_H
 15 #define __LED_OPERATION_H
 16 
 17 /* Includes ------------------------------------------------------------------*/
 18 #include "stm32_userconfig.h"
 19 
 20 
 21 ////Red
 22 //#define LED1_GPIO_PORT  GPIO_B
 23 //#define LED1_GPIO_CLK   RCC_APB2Periph_GPIOB
 24 //#define LED1_GPIO_PIN   GPIO_Pin_5
 25 
 26 ////Green
 27 //#define LED2_GPIO_PORT  GPIO_B
 28 //#define LED2_GPIO_CLK   RCC_APB2Periph_GPIOB
 29 //#define LED2_GPIO_PIN   GPIO_Pin_0
 30 
 31 ////Blue
 32 //#define LED3_GPIO_PORT  GPIO_B
 33 //#define LED3_GPIO_CLK   RCC_APB2Periph_GPIOB
 34 //#define LED3_GPIO_PIN   GPIO_Pin_1
 35 
 36 
 37 
 38 
 39 
 40 /*直接操作寄存器的方法控制 IO*/
 41 #define digitalHi(p,i)  {p->BSRR=i;}    //输出为高电平
 42 #define digitalLo(p,i)  {p->BRR=i;}     //输出低电平
 43 #define digitalToggle(p,i)  {p->ODR ^=i;}   //输出反转状态
 44 
 45 
 46 
 47 /*定义控制 IO 的宏*/
 48 #define LED1_TOGGLE     digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
 49 #define LED1_OFF        digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
 50 #define LED1_ON         digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)
 51 
 52 #define LED2_TOGGLE     digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
 53 #define LED2_OFF        digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
 54 #define LED2_ON         digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)
 55 
 56 #define LED3_TOGGLE     digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
 57 #define LED3_OFF        digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
 58 #define LED3_ON         digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)
 59 
 60 
 61 
 62 /*基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好*/
 63 /*#define 只会对当前行有效,所以使用续航符连接起来*/
 64 //红色
 65 #define LED_RED   \
 66                   LED1_ON;\
 67                   LED2_OFF;\
 68                   LED3_OFF
 69 
 70 //绿色
 71 #define LED_GREEN \
 72                   LED1_OFF;\
 73                   LED2_ON;\
 74                   LED3_OFF
 75 
 76 
 77 //蓝色
 78 #define LED_BLUE  \
 79                  LED1_OFF;\
 80                  LED2_OFF;\
 81                  LED3_ON
 82 
 83 //黄色(红色+绿色)
 84 #define LED_YELLOW  \
 85                     LED1_ON;\
 86                     LED2_ON;\
 87                     LED3_OFF
 88 
 89 //紫色(红色+蓝色)
 90 #define LED_PURPLE  \
 91                     LED1_ON;\
 92                     LED2_OFF;\
 93                     LED3_ON
 94 
 95 
 96 //青色(绿色+蓝色)
 97 #define LED_CYAN  \
 98                  LED1_OFF;\
 99                  LED2_ON;\
100                  LED3_ON
101 
102 
103 //白色(红色+绿色+蓝色)
104 #define LED_WHITE  \
105                    LED1_ON;\
106                    LED2_ON;\
107                    LED3_ON
108 
109 
110 //黑色(团灭)
111 #define LED_RGBOFF  \
112                    LED1_OFF;\
113                    LED2_OFF;\
114                    LED3_OFF
115 
116 
117 
118 
119 
120 #endif /*__LED_OPERATION_H*/
led_operation.h

 step5:在main中调用方法实现点灯

 1 /**
 2   ******************************************************************************
 3   * @file    template/User/main.c 
 4   * @author  ChuanWang
 5   * @version V5.35
 6   * @date    09-April-2023
 7   * @brief   Main program body
 8   ******************************************************************************
 9   * @attention
10   *
11   ******************************************************************************
12   */  
13 
14 /* Includes ------------------------------------------------------------------*/
15 #include "stm32_userconfig.h"
16 
17 
18 
19 
20 /* Private functions ---------------------------------------------------------*/
21 
22 
23 
24 
25 
26 /**
27   * @brief  Main program.
28   * @param  None
29   * @retval None
30   */
31 int main(void)
32 {
33     LED_GPIO_Config();
34     
35     for(;;)
36   {
37       LED1_ON;        //亮
38       Delay(3000000);
39       LED1_OFF;     //灭
40       
41       LED2_ON;        //亮
42       Delay(3000000);
43       LED2_OFF;     //灭
44       
45       LED3_ON;        //亮
46       Delay(3000000);
47       LED3_OFF;     //灭
48       
49       
50       /*红绿蓝黄紫青白*/
51       LED_RED;
52       Delay(3000000);
53       
54       LED_GREEN;
55       Delay(3000000);
56       
57       LED_BLUE;
58       Delay(3000000);
59             
60       LED_YELLOW;
61       Delay(3000000);
62       
63       LED_PURPLE;
64       Delay(3000000);
65       
66       LED_CYAN;
67       Delay(3000000);
68         
69       LED_WHITE;
70       Delay(3000000);
71       
72       LED_RGBOFF;
73       Delay(3000000);
74         
75   }
76 }
77 
78 
79 
80 
81 
82 /**
83   * @brief  SimpleDelay program.
84   * @param  None
85   * @retval None
86   */
87 void Delay(__IO uint32_t nCount)
88 {
89     /*简单的延时函数*/
90     for(; nCount != 0; nCount--);
91 }
92 
93 
94 /************************END OF FILE*****************************/
main.c

 

效果演示:

 

至此,led点灯完成

 

  

 

标签:LED1,LED3,LED2,LED,stm32,------,GPIO,define
From: https://www.cnblogs.com/xugdawn666/p/17291275.html

相关文章

  • CSS中所有选择器
    测试CSS中所有选择器<htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style><!--属性选择器-->h1{color:black;}<!--class选择器-->.......
  • win平台共享网络给linux板卡
    对于一些没有带无线网卡的linux板卡,进入系统后想要设置网络会比较麻烦,需要用网线连到路由器上让路由器去分配ip,这样我们才能通过ssh去访问设备,但是如果路由器离我们比较远或者根本没有路由器的时候这个方案是不行的,因此可以用电脑本身的网口来连接,之后共享电脑本身的网络来实现这......
  • VUE-Antd开发,validate规则校验第一次为空,后面无论怎么输入都显示不可为空
    问题描述场景是修改弹窗,给数据赋值,其中数据有String和Array第一次操作多选框(数据类型是Array)输入为空并在输入框外点击,显示不可为空。之后无论怎么输入都显示不可为空。(当你控制台输出校验value时,会发现里面的值永远是第一次操作的数据,而非为空)可能原因1️⃣rules定义出错......
  • Codeforces Round 860 (Div. 2)
    CodeforcesRound860(Div.2)Date:04/08/2023Link:CodeforcesRound860(Div.2)A|ShowstopperBrief:两组数\(\{a_i\}\)和\(\{b_i\}\),长度都为\(n\).\(\foralli\),可以交换\(a_i\)和\(b_i\),问是否可以使得\(a_n=\max(a_i)\),\(b_n=\max(b_i......
  • ELK企业级日志分析系统
    1.1ELK各组件介绍ElasticSearch:是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。Elasticsearch是用Java开发的,可通过RESTfulWeb接口,让用户可以通过浏览器与Elasticsearch通信。Elasticsearch是一个实时的、分布式的可扩展的搜索引擎,......
  • P2824 [HEOI2016/TJOI2016]排序 题解
    题目传送门前言线段树好题!!!!咕咕了挺久的一道题目,很早之前就想写了,今天终于找了个时间A掉了。题意给定一个\(1\)到\(n\)的排列,有\(m\)次操作,分两种类型。1.0lr表示将下标在\([l,r]\)区间中的数升序排序。2.1lr表示将下标在\([l,r]\)区间中的数降序排序。给......
  • flask---day04()
    上节回顾#1蓝图 -第一步:导入-第二步:实例化得到对象,可以指定static和templates-第三步:app中注册蓝图,注册蓝图时,可以指定前缀-第四步:使用蓝图,注册路由,注册请求扩展#2g对象 -当次请求的全局对象,在当次请求中可以放值和取值-跟session的区......
  • Koodo Reader 是一个跨平台的电子书阅读器
    KoodoReader是一个跨平台的电子书阅读器。平台支持Windows,macOS,Linux和网页版,格式支持epub,pdf,mobi,azw3,txt,djvu,markdown,fb2,cbz,cbt,cbr,rtf和docx。支持阅读epub,pdf,mobi,azw3,txt,md,djvu,docx,rtf,cbz,cbr,cbt,fb2,html和xml格式的......
  • Spring Cloud Admin添加微信通知
    SpringCloud发送微信消息推送参考https://blog.csdn.net/qq_44697754/article/details/128035736。  SpringCloudAdmin要增加微信通知,需要继承AbstractStatusChangeNotifier类,在doNotify方法按照模板发送消息。 AdminServe添加依赖:<dependency><groupId>common......
  • kotlin minOf 发出NoSuchElementException异常,该如何解决
    kotlinminOf发出NoSuchElementException异常,该如何解决minOf函数在处理空集合时会抛出NoSuchElementException异常。解决该问题的方法取决于你的具体需求和代码实现方式。如果你期望集合可能为空,你可以使用minOrNull函数代替minOf函数。minOrNull函数返回集合中的最小......