【STM32F103】使用库函数点亮LED(GPIO输出)

使用库建立好工程模板,就可以方便的使用STM32标准库来编写应用程序了,LED的控制使用到GPIO外设的基本输出功能。

本部分实验使用的是野火STM32F103开发板,硬件资源如上。

这是一个RGB灯,由红蓝绿三色组成,可以通过PWM控制混色。

这些LED的阴极接在GPIO引脚1、0、5,只要我们控制GPIO引脚电平输出状态,就可以控制灯的亮灭。

首先要写LED控制引脚及亮灭相关的宏定义:

// bsp_led.h
#ifndef __BSP_LED_H
#define __BSP_LED_H

#include "stm32f10x.h"

#define LED_G_GPIO_PIN              GPIO_Pin_0
#define LED_G_GPIO_PORT             GPIOB
#define LED_G_GPIO_CLK              RCC_APB2Periph_GPIOB

#define LED_R_GPIO_PIN              GPIO_Pin_5
#define LED_R_GPIO_PORT             GPIOB
#define LED_R_GPIO_CLK              RCC_APB2Periph_GPIOB

#define LED_B_GPIO_PIN              GPIO_Pin_1
#define LED_B_GPIO_PORT             GPIOB
#define LED_B_GPIO_CLK              RCC_APB2Periph_GPIOB



#define    ON        1
#define    OFF       0

//

#define   LED_G(a)   if(a) \
                          GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); \
                     else  GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);

#define   LED_R(a)   if(a) \
	                       GPIO_ResetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN); \
                     else  GPIO_SetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN);

#define   LED_B(a)   if(a) \
	                       GPIO_ResetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN); \
                     else  GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);

void LED_GPIO_Config(void);

#endif /* __BSP_LED_H */

如果想要做到基本混色,可添加以下宏定义(PWM将在后面测试,此处只有简单的普通混色方法,即叠加颜色):

以黄色为例(红+绿):

#define LED_YELLOW(a) if(a) \
{GPIO_ResetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN); \
GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); \
GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN); } \
else {GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); \
GPIO_SetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN);\
GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);}

再写LED GPIO初始化函数 led_bsp.c

//bsp_led.c 
#include "bsp_led.h"

void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK|
	                       LED_R_GPIO_CLK|
	                       LED_B_GPIO_CLK, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);	
	
		GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN;
	GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStruct);
	
			GPIO_InitStruct.GPIO_Pin = LED_B_GPIO_PIN;
	GPIO_Init(LED_B_GPIO_PORT, &GPIO_InitStruct);
	
	GPIO_SetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN);
	GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
	GPIO_SetBits(LED_B_GPIO_PORT,LED_B_GPIO_PIN);
}

测试黄色灯-延时-红-延时-绿-延时-蓝:

// main.c
#include "stm32f10x.h"   //such as #include <reg51.h>
#include "bsp_led.h"

void Delay( uint32_t count )
{
	for(; count!=0; count--);
}

int main(void)
{
	// 72Mhz
	LED_GPIO_Config();
	
	while(1)
	{
		LED_YELLOW(ON);
		Delay(0xFFFFFF);
				Delay(0xFFFFFF);
				Delay(0xFFFFFF);
				Delay(0xFFFFFF);
    LED_YELLOW(OFF);
		
		
		LED_R(ON);
		Delay(0xFFFFFF);
		LED_R(OFF);
		
		LED_G(ON);
		Delay(0xFFFFFF);
		LED_G(OFF);
		
		LED_B(ON);
		Delay(0xFFFFFF);
		LED_B(OFF);
		Delay(0xFFFFFF);
	}
}

测试效果:(黄色灯为例)

 

函数执行流程如下:

1、使用GPIO_InitTypeDef定义GPIO初始化结构体变量,以便后续配置。

2、调用库函数来使能LED的GPIO端口时钟。(RCC寄存器)

3、向GPIO初始化结构体赋值,把引脚初始化为推挽输出模式。

4、调用GPIO_Init函数向寄存器写入参数,完成GPIO初始化。

5、初始化其他LED使用的GPIO引脚。

6、使用宏定义控制LED的亮灭。

通过宏定义方便函数的实现用于移植!

本章测试到此为止,程序已上传,请在以下链接下载测试(软件KEIL5+硬件STM32F103开发板(原理图如上))

https://download.csdn.net/download/qq_37286676/10917261

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值