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

一、编程要点

  1. 使能 GPIO 端口时钟;
  2. 初始化 GPIO 目标引脚为推挽输出模式;
  3. 编写简单测试程序,控制 GPIO 引脚输出高、低电平。

二、代码分析

1. LED 灯引脚宏定义

1 // R-红色
2 #define LED1_GPIO_PORT GPIOB
3 #define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
4 #define LED1_GPIO_PIN GPIO_Pin_5
5 // G-绿色
6 #define LED2_GPIO_PORT GPIOB
7 #define LED2_GPIO_CLK RCC_APB2Periph_GPIOB
8 #define LED2_GPIO_PIN GPIO_Pin_0
9 // B-蓝色
10 #define LED3_GPIO_PORT GPIOB
11 #define LED3_GPIO_CLK RCC_APB2Periph_GPIOB
12 #define LED3_GPIO_PIN GPIO_Pin_1

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

1 /* 直接操作寄存器的方法控制 IO */
2 #define digitalHi(p,i) {p->BSRR=i;} //输出为高电平 
3 #define digitalLo(p,i) {p->BRR=i;} //输出低电平
4 #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
5 
6 
7 /* 定义控制 IO 的宏 */
8 #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
9 #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
10 #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)

12 #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
13 #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
14 #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)
15 
16 #define LED3_TOGGLE digitalToggle(LED2_GPIO_PORT,LED3_GPIO_PIN)
17 #define LED3_OFF digitalHi(LED2_GPIO_PORT,LED3_GPIO_PIN)
18 #define LED3_ON digitalLo(LED2_GPIO_PORT,LED3_GPIO_PIN)
19 
20 /* 基本混色,后面高级用法使用 PWM 可混出全彩颜色,且效果更好 */
21 
22 //红
23 #define LED_RED \
24 LED1_ON;\
25 LED2_OFF\
26 LED3_OFF
27 
28 //绿
29 #define LED_GREEN \
30 LED1_OFF;\
31 LED2_ON\
32 LED3_OFF
33 
34 //蓝
35 #define LED_BLUE \
36 LED1_OFF;\
37 LED2_OFF\
38 LED3_ON
39 
40 
41 //黄(红+绿)
42 #define LED_YELLOW \
43 LED1_ON;\
44 LED2_ON\
45 LED3_OFF
46 //紫(红+蓝)
47 #define LED_PURPLE \
48 LED1_ON;\
49 LED2_OFF\
50 LED3_ON
51 
52 //青(绿+蓝)
53 #define LED_CYAN \
54 LED1_OFF;\
55 LED2_ON\
56 LED3_ON
57 
58 //白(红+绿+蓝)
59 #define LED_WHITE \
60 LED1_ON;\
61 LED2_ON\
62 LED3_ON
63 
64 //黑(全部关闭)
65 #define LED_RGBOFF \
66 LED1_OFF;\
67 LED2_OFF\
68 LED3_OFF

代码中的“\”是 C 语言中的续行符语法,表示续行符的下一行与续行符所在的代码是同一行。
代码中因为宏定义关键字“#define”只是对当前行有效,所以我们使用续行符来连接起来,以下的代码是等效的:

#define LED_YELLOW LED1_ON; LED2_ON; LED3_OFF

应用续行符的时候要注意,在“\”后面不能有任何字符(包括注释、空格),只能直接回车。

3. LED GPIO 初始化函数

 1 void LED_GPIO_Config(void)
2 {
3 /*定义一个 GPIO_InitTypeDef 类型的结构体*/
4 GPIO_InitTypeDef GPIO_InitStructure;
5 
6 /*开启 LED 相关的 GPIO 外设时钟*/
7 RCC_APB2PeriphClockCmd( LED1_GPIO_CLK|
8 LED2_GPIO_CLK|
9 LED3_GPIO_CLK, ENABLE);
10 /*选择要控制的 GPIO 引脚*/
11 GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
12 
13 /*设置引脚模式为通用推挽输出*/
14 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
15 
16 /*设置引脚速率为 50MHz */
17 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
18 
19 /*调用库函数,初始化 GPIO*/
20 GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
21 
22 /*选择要控制的 GPIO 引脚*/
23 GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
24 
25 /*调用库函数,初始化 GPIO*/
26 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
27 
28 /*选择要控制的 GPIO 引脚*/
29 GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
30 
31 /*调用库函数,初始化 GPIOF*/
32 GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
33 
34 /* 关闭所有 led 灯 */
35 GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
36 
37 /* 关闭所有 led 灯 */
38 GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
39 
40 /* 关闭所有 led 灯 */
41 GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
42 }

4. 主函数

1 #include "stm32f10x.h"
2 #include "./led/bsp_led.h"
3 
4 #define SOFT_DELAY Delay(0x0FFFFF);
5 
6 void Delay(__IO u32 nCount);
7 
8 /**
9 * @brief 主函数
10 * @param 无
11 * @retval 无
12 */
13 int main(void)
14 {
15 /* LED 端口初始化 */
16 LED_GPIO_Config();
17 
18 while (1)
19 {
20 LED1_ON; // 亮
21 SOFT_DELAY;
22 LED1_OFF; // 灭
23 
24 LED2_ON; // 亮
25 SOFT_DELAY;
26 LED2_OFF; // 灭
27 
28 LED3_ON; // 亮
29 SOFT_DELAY;
30 LED3_OFF; // 灭
31 
32 /*轮流显示 红绿蓝黄紫青白 颜色*/
33 LED_RED;
34 SOFT_DELAY;
35 
36 LED_GREEN;
37 SOFT_DELAY;
38 
39 LED_BLUE;
40 SOFT_DELAY;
41 
42 LED_YELLOW;
43 SOFT_DELAY;
44 
45 LED_PURPLE;
46 SOFT_DELAY;
47 
48 LED_CYAN;
49 SOFT_DELAY;
50 
51 LED_WHITE;
52 SOFT_DELAY;
53 
54 LED_RGBOFF;
55 SOFT_DELAY;
56 }
57 }
58 
59 void Delay(__IO uint32_t nCount) //简单的延时函数
60 {
61 for (; nCount != 0; nCount--);
62 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值