流水灯也叫跑马灯,就是一排灯光交替点亮,从视觉上来说就像灯光在运动,下面我们将使用Rainbow板载的LED资源来实现一个简单的LED流水灯。
目的:
1、熟悉Rainbow中如何设置GPIO模式、通过GPIO输出高低电平
2、了解Rainbow的延时函数
所需硬件:
1、Rainbow开发板
2、USB-TTL模块
3、杜邦线 若干
4、J-LINK或者ST-LINK
所需软件:
1、MDK5.0(Keil5)
2、串口及网络调试工具
3、Rainbow开发包
ST提供的固件库对STM32系列MCU的标准外设已经做了封装,相对于直接操作寄存器来说已经方便很多了,使用GPIO的一般步骤是:初始化系统时钟、初始化GPIO时钟、设置GPIO模式、设置GPIO的输出电平,整个初始化设置好几十行代码,实际上达到的目的却非常简单。Rainbow借鉴了Arduino开源硬件的思想,对GPIO进行了进一步的封装,简化了GPIO的表示方式,对于GPIOA-GPIOC管脚,直接使用PA0-PA15、PB0-PB15、PC0-PC15来表示。要使用一个GPIO,仅仅两个步骤即可:
1、设置GPIO管脚模式:调用pinMode函数
函数原型:void pinMode(GPIOPinName pinName, GPIOMode_TypeDef pinMode)
功能:设置指定GPIO的管脚模式
参数:pinName 管脚的名称,如PA0、PB15等
pinMode 管脚的输入输出模式,参见ST固件库GPIOMode_TypeDef类型。GPIO_Mode_Out_PP表示
推挽输出模式
2、使用digitalWrite()在指定管脚输出高低电平
函数原型:void digitalWrite(GPIOPinName pinName, uint8_t val)
功能:向指定的管脚写入HIGH或LOW
参数:pinName 管脚的名称,如PA0、PB15等
val 管脚输出的值:HIGH或者LOW
软件延时在嵌入式开发中必不可少,Rainbow通过利用STM32单片机中的SysTick进行了相对精确的延时,可以支持毫秒级延时和微秒级延时,其中毫秒级比较准确,微秒级有一定误差,但是比起使用指令延时来说已经精确很多了。毫秒级延时使用delay()函数,其参数指定延时的毫秒数;delayMicroseconds()进行微秒级延时,其参数指定延时的微妙数。
我们建立一个工程Led,并将Rainbow开发包导入到工程中,为了快速上手,在软件包的“QuickStart”文件夹中的Led工程是一个我们预先建立好的工程,可以直接进行编译、烧写和调试。
创建main.cpp,并输入下列代码:
#include "WProgram.h"
int main(void)
{
//流水灯对应的管脚
GPIOPinName ledPins[] = {LED1_PIN, LED2_PIN, LED3_PIN, LED4_PIN};
uint8_t i;
//初始化开发板
boardInit();
//设置led输出口的模式为推挽输出模式,并关闭所有LED
for(i=0; i<4; i++)
{
pinMode(ledPins[i], GPIO_Mode_Out_PP);
digitalWrite(ledPins[i], HIGH);
}
while(1)
{
for(i=0; i<4; i++)
{
//点亮LED
digitalWrite(ledPins[i], LOW);
//延时500ms
delay(500);
//灭掉LED
digitalWrite(ledPins[i], HIGH);
}
}
}
在编译器中编译无误,通过ST-LINK烧写到Rainbow后,就会看到LED交替点亮和熄灭,实现了流水灯的效果。