stm32------点亮LED

发布时间 2023-04-09 14:05:20作者: 王川贝壳子

从点灯开始,开始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点灯完成