GPIO 输出—使用固件库点亮LED

 编程要点 1. 使能 GPIO 端口时钟;

2. 初始化 GPIO 目标引脚为推挽输出模式;

3. 编写简单测试程序,控制 GPIO 引脚输出高、低电平。

LED 灯引脚宏定义

//引脚定义
2 /*******************************************************/
3 //R 红色灯
4 #define LED1_PIN GPIO_Pin_6
5 #define LED1_GPIO_PORT GPIOF
6 #define LED1_GPIO_CLK RCC_AHB1Periph_GPIOF
7
8 //G 绿色灯
9 #define LED2_PIN GPIO_Pin_7
10 #define LED2_GPIO_PORT GPIOF
11 #define LED2_GPIO_CLK RCC_AHB1Periph_GPIOF
12
13 //B 蓝色灯
14 #define LED3_PIN GPIO_Pin_8
15 #define LED3_GPIO_PORT GPIOF
16 #define LED3_GPIO_CLK RCC_AHB1Periph_GPIOF
17 /************************************************************/

以上代码分别把控制四盏 LED 灯的 GPIO 端口、GPIO 引脚号以及 GPIO 端口时钟封装起来了。在 实际控制的时候我们就直接用这些宏,以达到应用代码跟硬件无关的效

控制 LED 灯亮灭状态的宏定义

/** 控制 LED 灯亮灭的宏,
2 * LED 低电平亮,设置 ON=0,OFF=1
3 * 若 LED 高电平亮,把宏设置成 ON=1 ,OFF=0 即可
4 */
5 #define ON 0
6 #define OFF 1
7
8 /* 带参宏,可以像内联函数一样使用 */
9 #define LED1(a) if (a) \
10 GPIO_SetBits(LED1_GPIO_PORT,LED1_PIN);\
11 else \
12 GPIO_ResetBits(LED1_GPIO_PORT,LED1_PIN)
13
14 #define LED2(a) if (a) \
15 GPIO_SetBits(LED2_GPIO_PORT,LED2_PIN);\
16 else \
17 GPIO_ResetBits(LED2_GPIO_PORT,LED2_PIN)
18
19 #define LED3(a) if (a) \
20 GPIO_SetBits(LED3_GPIO_PORT,LED3_PIN);\
21 else \
22 GPIO_ResetBits(LED3_GPIO_PORT,LED3_PIN)
/* 直接操作寄存器的方法控制 IO */
26 #define digitalHi(p,i) {p->BSRRL=i;} //设置为高电平
27 #define digitalLo(p,i) {p->BSRRH=i;} //输出低电平
28 #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
29
30 /* 定义控制 IO 的宏 */
31 #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_PIN)
32 #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_PIN)
33 #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_PIN)
34
35 #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_PIN)
36 #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_PIN)
37 #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_PIN)
38
39 #define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_PIN)
40 #define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_PIN)
41 #define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_PIN)
42
43 /* 基本混色,后面高级用法使用 PWM 可混出全彩颜色, 且效果更好 */
44
45 //红
46 #define LED_RED \
47 LED1_ON;\
48 LED2_OFF;\
49 LED3_OFF
50
51 //绿
52 #define LED_GREEN \
53 LED1_OFF;\
54 LED2_ON;\
55 LED3_OFF
//蓝
58 #define LED_BLUE \
59 LED1_OFF;\
60 LED2_OFF;\
61 LED3_ON
62
63
64 //黄 (红 + 绿)
65 #define LED_YELLOW \
66 LED1_ON;\
67 LED2_ON;\
68 LED3_OFF
69 //紫 (红 + 蓝)
70 #define LED_PURPLE \
71 LED1_ON;\
72 LED2_OFF;\
73 LED3_ON
74
75 //青 (绿 + 蓝)
76 #define LED_CYAN \
77 LED1_OFF;\
78 LED2_ON;\
79 LED3_ON
80
81 //白 (红 + 绿 + 蓝)
82 #define LED_WHITE \
83 LED1_ON;\
84 LED2_ON;\
85 LED3_ON
86
87 //黑 (全部关闭)
88 #define LED_RGBOFF \
LED1_OFF;\
90 LED2_OFF;\
91 LED3_OFF

LED GPIO 初始化函数

void LED_GPIO_Config(void)
2 {
3 /* 定义一个 GPIO_InitTypeDef 类型的结构体 */
4 GPIO_InitTypeDef GPIO_InitStructure;
5
6 /* 开启 LED 相关的 GPIO 外设时钟 */
7 RCC_AHB1PeriphClockCmd ( LED1_GPIO_CLK|
8 LED2_GPIO_CLK|
9 LED3_GPIO_CLK, ENABLE);
10
11 /* 选择要控制的 GPIO 引脚 */
GPIO_InitStructure.GPIO_Pin = LED1_PIN;
13
14 /* 设置引脚模式为输出模式 */
15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
16
17 /* 设置引脚的输出类型为推挽输出 */
18 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
19
20 /* 设置引脚为上拉模式 */
21 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
22
23 /* 设置引脚速率为 2MHz */
24 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
25
26 /* 调用库函数,使用上面配置的 GPIO_InitStructure 初始化 GPIO*/
27 GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
28
29 /* 选择要控制的 GPIO 引脚 */
30 GPIO_InitStructure.GPIO_Pin = LED2_PIN;
31 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
32
33 /* 选择要控制的 GPIO 引脚 */
34 GPIO_InitStructure.GPIO_Pin = LED3_PIN;
35 GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
36
37 /* 关闭 RGB 灯 */
38 LED_RGBOFF;
39 }

主函数

#include "stm32f4xx.h"
2 #include "./led/bsp_led.h"
3
4 void Delay(__IO u32 nCount);
5
6 /**
7 * @brief 主函数
8 * @param 无
9 * @retval 无
10 */
11 int main(void)
12 {
13 /* LED 端口初始化 */
LED_GPIO_Config();
15
16 /* 控制 LED 灯 */
17 while (1) {
18 LED1( ON ); // 亮
19 Delay(0xFFFFFF);
20 LED1( OFF ); // 灭
21
22 LED2( ON ); // 亮
23 Delay(0xFFFFFF);
24 LED2( OFF ); // 灭
25
26 LED3( ON ); // 亮
27 Delay(0xFFFFFF);
28 LED3( OFF ); // 灭
29
30 /* 轮流显示 红绿蓝黄紫青白 颜色 */
31 LED_RED;
32 Delay(0xFFFFFF);
33
34 LED_GREEN;
35 Delay(0xFFFFFF);
36
37 LED_BLUE;
38 Delay(0xFFFFFF);
39
40 LED_YELLOW;
41 Delay(0xFFFFFF);
42
43 LED_PURPLE;
44 Delay(0xFFFFFF);
LED_CYAN;
47 Delay(0xFFFFFF);
48
49 LED_WHITE;
50 Delay(0xFFFFFF);
51
52 LED_RGBOFF;
53 Delay(0xFFFFFF);
54 }
55 }
56
57 void Delay(__IO uint32_t nCount) //简单的延时函数
58 {
59 for (; nCount != 0; nCount--);
60 }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想使用固件点亮LED灯,你可以按照以下步骤进行操作: 1. 首先,创建一个新的文件夹,用于存放LED灯的控制代码。例如,你可以创建一个名为"led"的文件夹。 2. 在"led"文件夹中创建两个文件,分别是"led.c"和"led.h"。这些文件将包含LED灯的控制函数。 3. 打开"led.h"文件,并在其中定义LED灯的引脚。根据引用中的说明,你可以将PF6、PF7和PF8引脚分别与RGB灯的R灯、G灯和B灯连接起来。 4. 在"led.h"文件中声明LED灯控制函数。根据你的需求,你可以创建函数来控制单个LED灯的亮灭,或者同时控制多个LED灯来混合成不同的颜色。 5. 打开"led.c"文件,并实现LED灯控制函数。根据引用中的示例代码,你可以使用GPIO来配置LED灯的引脚,并在main函数中测试LED灯的亮灭。 6. 在main函数中,你可以使用控制函数来点亮或熄灭LED灯。根据你的需求,你可以选择控制单个LED灯,或者轮流显示不同颜色的灯。 以下是使用固件点亮LED灯的示例代码: #include "./led/led.h" int main(void) { /* LED 端口初始化 */ LED_GPIO_Config(); /* 控制LED灯 */ while (1) { LED1( ON ); // 点亮LED1 Delay(0xFFFFFF); LED1( OFF ); // 熄灭LED1 Delay(0xFFFFFF); // 其他LED灯的控制... // 轮流显示不同颜色的LEDLED_RED; Delay(0xFFFFFF); LED_GREEN; Delay(0xFFFFFF); LED_BLUE; Delay(0xFFFFFF); // 其他颜色的控制... LED_RGBOFF; Delay(0xFFFFFF); } } void Delay(__IO uint32_t nCount) { for (; nCount != 0; nCount--); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值