STM32驱动RGB LED彩灯模块闪烁GPIO_Write()函数

本文基于标准库来实现驱动LED灯闪烁的状态,利用这个实验更加清楚明白的了解GPIO输出引脚的应用,以及对子函数——延时函数的调用

上一篇文章用的是GPIO_Resetbit()已经GPIO_Setbits()两个函数,文中我们使用多一个GPIO_Write()函数。

文章目录

一、LED彩灯模块介绍及实验现象

1、模块介绍

2、实验现象

二、程序编写前的准备

1、延时函数的调用

2、GPIO _write()函数

3、硬件电路接线

三、程序编写

1、端口配置

2、主函数的编写


一、LED彩灯模块介绍及实验现象

1、模块介绍

LED彩灯模块,具有三个LED灯,高电平驱动,三个LED灯为红(R)、绿(G)、蓝(B),三个灯单独亮时则对应其颜色,其中两个亮或三个同时亮时,可以组合成多种颜色。

如 当三个灯同时亮时,灯光    分为三块,但整体亮度较强,无明显变色现象。                                                     

当蓝灯与红灯同时亮起时,灯光颜色有点像紫色。

2、实验现象

本实验为两个状态,一个是初始化状态,一个是正常工。初始化状态会进行三次红——绿——蓝灯交替切换,然后进入正常工作状态,即彩灯模块三个灯同时闪烁(同时亮同时灭),在彩灯模块灭的时候stm32板上的灯会亮,当彩灯模块亮时stm32板上的灯灭,二者交替闪烁。

STM32驱动RGB LED彩灯模块闪烁

二、程序编写前的准备

1、延时函数的调用

简单的延时函数,可以利用for循环,或者while循环,让程序运行一段时间(定义变量i,赋予一个值,让这个值从某数值减小到0),这样就可以实现粗略的一个延时。下面提供的是一个比较精准的延时函数。即Delay.c文件。

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

主函数调用这个delay函数前需要声明,这里用delay.h文件。

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

使用步骤如下,先将Delay.c跟Delay.h两个文件下载后添加至工程文件夹user中,然后在keil软件中的组user中添加两个文件,然后在main文件中添加头文件声明即可调用。#include "Delay.h"

2、GPIO _write()函数

这个函数可以同时对所有的IO口进行操作,跟GPIO_Resetbit()已经GPIO_Setbits()一样括号内都是2个参数,我们看一下手册上的定义

这里两个参数,第一个对应的是输出的GPIO口,第二个参数第一个参数对应输出口16个引脚的值,当全部输出低电平时为 0000  0000  0000  0000,在keil5中没有二进制,因此我们将其转化为16进制,为0x0000;当全部输出为高电平时为 1111 1111 1111 1111,即为0xFFFF。

这里我们稍微提一下16进制的转换,如下图所示,这里每四个引脚对应为一个十六进制数。

例如我们要引脚1、3、5、7、9、11、13、15输出高电平,而剩余的脚输出低电平,引脚电平为1010  1010  1010 1010(注意,这里从左到右按照从高位引脚向低位引脚排列),即对应为PA15、PA14……PA2、PA1、PA0,将其转化为十六进制,即为0XAAAA,其中0X表示为十六进制。

3、硬件电路接线

LED彩灯模块有4个引脚,即R,G,B,GND,接线时RGB三个引脚可以接任意GPIO引脚作为输出口,由高电平驱动,GND接到芯片上的G,即接地。

三、程序编写

1、端口配置

在keil端口调用时,可使用或将多端口进行配置,比如    GPIO_INT.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3这段函数,我们同时打开了4个引脚,使用(|)表示或,也可以使用十六进制0X000F表示。右键可以查看GPIO_Pin在固件库中的定义,可知道使用GPIO-Pin_All已定义为0XFFFF,即全部引脚调用

void GPIO_Config(void)
{
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC ,ENABLE );
	GPIO_InitTypeDef  GPIO_INT;  //自定义一个结构体
	GPIO_INT .GPIO_Mode=GPIO_Mode_Out_PP; //使用推完输出
	GPIO_INT .GPIO_Pin=GPIO_Pin_All;  //使用GPIO_Write()函数时,端口引脚必须全部打开
	GPIO_INT .GPIO_Speed =GPIO_Speed_50MHz; //晶振速度
	GPIO_Init (GPIOB,&GPIO_INT );  //对GPIOB端口进行初始化
	GPIO_INT .GPIO_Mode=GPIO_Mode_Out_PP; //GPIOB使用推完输出
	GPIO_INT .GPIO_Pin=GPIO_Pin_13;  
	GPIO_INT .GPIO_Speed =GPIO_Speed_50MHz; //晶振速度
	GPIO_Init (GPIOC,&GPIO_INT );  //对GPIOC端口进行初始化
	GPIO_SetBits (GPIOC,GPIO_Pin_13 );
}

2、主函数的编写

使用for循环对初始化的状态进行三次循环,初始化状态:在红灯亮后延时500ms,然后熄灭红灯的同时点亮绿灯,延时500ms熄灭绿灯点亮蓝灯,再等500熄灭蓝灯点亮红灯,如此往复操作。

 对于正常工作的步骤也如上 ,在熄灭彩灯模块的同时点亮芯片上的LED灯。


#include "stm32f10x.h"
#include "Delay.h"    //调用延时函数

void GPIO_Config(void)
{
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC ,ENABLE );
	GPIO_InitTypeDef  GPIO_INT;  //自定义一个结构体
	GPIO_INT .GPIO_Mode=GPIO_Mode_Out_PP; //使用推完输出
	GPIO_INT .GPIO_Pin=0xffff;  //使用GPIO_Write()函数时,端口引脚必须全部打开
	GPIO_INT .GPIO_Speed =GPIO_Speed_50MHz; //晶振速度
	GPIO_Init (GPIOB,&GPIO_INT );  //对GPIOB端口进行初始化
	GPIO_INT .GPIO_Mode=GPIO_Mode_Out_PP; //GPIOB使用推完输出
	GPIO_INT .GPIO_Pin=GPIO_Pin_13;  
	GPIO_INT .GPIO_Speed =GPIO_Speed_50MHz; //晶振速度
	GPIO_Init (GPIOC,&GPIO_INT );  //对GPIOC端口进行初始化
	GPIO_SetBits (GPIOC,GPIO_Pin_13 );
}

int main(void)
{	
	int i;                                   
	GPIO_Config ();
	for(i=0;i<3;i++)  //初始化
	{	
		GPIO_SetBits (GPIOB,GPIO_Pin_7);    //让GPIOB的7引脚输出高电平  点亮红灯
		Delay_ms (500);  //调用延时函数,延时200ms
		GPIO_ResetBits (GPIOB,GPIO_Pin_7);  //让GPIOB的7引脚输出低电平  熄灭红灯
		GPIO_SetBits (GPIOB,GPIO_Pin_8);    //让GPIOB的8引脚输出高电平  点亮灯
		Delay_ms (500);  //调用延时函数,延时200ms
		GPIO_ResetBits (GPIOB,GPIO_Pin_8);  //让GPIOB的8引脚输出低电平  熄灭绿色
		GPIO_SetBits  (GPIOB,GPIO_Pin_9);   //让GPIOB的9引脚输出高电平  点亮蓝色
		Delay_ms (500);  //调用延时函数,延时200ms
		GPIO_ResetBits (GPIOB,GPIO_Pin_9);  //让GPIOB的9引脚输出低电平  熄灭蓝色
		Delay_ms (500);
	}
	
	while(1)      //正常工作
	{
		GPIO_SetBits  (GPIOC,GPIO_Pin_13);  //让GPIOC的13引脚输出高电平  熄灭LED
		GPIO_Write (GPIOB ,0X0700);     //0000 0111 0000 0000    0X1C00
		Delay_ms (1000);  //调用延时函数,延时200ms
		GPIO_Write (GPIOB,0X0000);
		GPIO_ResetBits (GPIOC,GPIO_Pin_13);  //让GPIC的13引脚输出低电平  点亮LED
		Delay_ms (1000);
	}

}

程序以及延时模块的两个文件在链接中:链接:https://pan.baidu.com/s/1XmiP687Zi9eUhOxcfb2qKA?pwd=dhob 
提取码:dhob

本人也是初学STM32,在学习的同时以初学者的角度来理解说明,如果文章有错误的地方,请大家多多指正,谢谢!!!