STM32驱动RGB LED彩灯模块闪烁GPIO_Write()函数
本文基于标准库来实现驱动LED灯闪烁的状态,利用这个实验更加清楚明白的了解GPIO输出引脚的应用,以及对子函数——延时函数的调用
上一篇文章用的是GPIO_Resetbit()已经GPIO_Setbits()两个函数,文中我们使用多一个GPIO_Write()函数。
文章目录
一、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,在学习的同时以初学者的角度来理解说明,如果文章有错误的地方,请大家多多指正,谢谢!!!