STM32—点灯

目录

条件

1—打开GPIO对应的时钟

 3—配置输出速度

 4—选择要控制的GPIO引脚

 5—调用库函数,初始化GPIO

6—封装

 封装目的

编程升级

 注意:


条件

        LED所在的引脚输出电平,从而控制灯的亮灭。

        对于STM32来说,原理也是一样的,就是更加的复杂一点,这也是保证了STM32的稳定性。

1—打开GPIO对应的时钟

RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);

开启LED的引脚时钟,我这里的是使用了宏定义

#define    LED_GPIO_CLK             RCC_APB2Periph_GPIOB

 2—配置GPIO模式

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP ;

模式有好多种,各种用法有自己的特色,所以这个模式一定要选对,否则无法工作或程序出现错误。

浮空输入                   GPIO_Mode_IN_FLOATING

上拉                          GPIO_Mode_IPU

下拉                          GPIO_Mode_IPD

模拟输入                   GPIO_Mode_AIN

开漏输出                   GPIO_Mode_AF_OD

开漏复用                   GPIO_Mode_AF_OD

推挽式输出               GPIO_Mode_Out_PP

推挽式复用功能        GPIO_Mode_AF_PP

 3—配置输出速度

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;

速度可以根据自己需要来配置,不过一般都按最快来配置。

 4—选择要控制的GPIO引脚

#define LED_GREEN_PIN              GPIO_Pin_0

#define LED_RED_PIN                   GPIO_Pin_5
#define LED_YELLOW_PIN            GPIO_Pin_1

GPIO_InitStruct.GPIO_Pin=LED_RED_PIN|LED_GREEN_PIN|LED_YELLOW_PIN;

根据自己想要的颜色选择,也可以多种颜色组合成炫酷的灯光效果。

 5—调用库函数,初始化GPIO

#define LED_PORT                GPIOB

GPIO_Init(LED_PORT,&GPIO_InitStruct);

 使用方法:把上述代码放在main()函数即可,当然为了使代码以后更加简便,我们对代码进行了封装。

6—封装

头文件:

#define LED_GPIO_CLK			RCC_APB2Periph_GPIOB

#define LED_GREEN_PIN			GPIO_Pin_0
#define LED_PORT				GPIOB

#define LED_RED_PIN				GPIO_Pin_5
#define LED_YELLOW_PIN			GPIO_Pin_1

 函数

void LED_GPIO_Config(void)
{		
	GPIO_InitTypeDef	GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);
	
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP ;
	GPIO_InitStruct.GPIO_Pin=LED_RED_PIN|LED_GREEN_PIN|LED_YELLOW_PIN;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;

	
	GPIO_Init(LED_PORT,&GPIO_InitStruct);
	

}

 封装目的

        提高代码的可读性,以及使得主函数main()更加的简便;

编程升级

                之前的代码也不是很好的实现我们想要的颜色,那么为了更好的操作,我们再次多源代码进行封装。

#define		ON					1
#define 	OFF					0

#define	LED_GREEN(a)			if(a)\
									{GPIO_ResetBits(LED_PORT,LED_GREEN_PIN);}\
								else\
									{GPIO_SetBits(LED_PORT,LED_GREEN_PIN);}

#define	LED_RED(a)				if(a)\
									{GPIO_ResetBits(LED_PORT,LED_RED_PIN);}\
								else\
									{GPIO_SetBits(LED_PORT,LED_RED_PIN);}


#define	LED_YELLOW(a)			if(a)\
									{GPIO_ResetBits(LED_PORT,LED_YELLOW_PIN);}\
								else\
									{GPIO_SetBits(LED_PORT,LED_YELLOW_PIN);}

 注意:

        在宏定义里面是不能直接使用回车换行的,这样会出现问题。那是不是只能一行写到底呢?

        肯定不是的,为了美观,大家可以在最后加上一个符号\,这样就可以再使用回车换行了,但是在符号\的后面不能有任何的东西,这是一个值得注意的问题。

//打开灯									
#define	LED_G					{LED_GREEN(ON);LED_RED(OFF);LED_YELLOW(OFF);}					
#define	LED_R					{LED_GREEN(OFF);LED_RED(ON);LED_YELLOW(OFF);}
#define	LED_Y					{LED_GREEN(OFF);LED_RED(OFF);LED_YELLOW(ON);}

在头文件里面是有宏定义的方法来使得函数更加简便,这样我们只需要调用LED_GREEN(ON)可以点亮一个属于自己颜色。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值