流水燈也叫跑馬燈,就是一排燈光交替點亮,從視覺上來說就像燈光在運動,下面我們將使用Rainbow板載的LED資源來實現(xiàn)一個簡單的LED流水燈。
目的:
1、熟悉Rainbow中如何設(shè)置GPIO模式、通過GPIO輸出高低電平
2、了解Rainbow的延時函數(shù)
所需硬件:
1、Rainbow開發(fā)板
2、USB-TTL模塊
3、杜邦線 若干
4、J-LINK或者ST-LINK
所需軟件:
1、MDK5.0(Keil5)
2、串口及網(wǎng)絡(luò)調(diào)試工具
3、Rainbow開發(fā)包
ST提供的固件庫對STM32系列MCU的標準外設(shè)已經(jīng)做了封裝,相對于直接操作寄存器來說已經(jīng)方便很多了,使用GPIO的一般步驟是:初始化系統(tǒng)時鐘、初始化GPIO時鐘、設(shè)置GPIO模式、設(shè)置GPIO的輸出電平,整個初始化設(shè)置好幾十行代碼,實際上達到的目的卻非常簡單。Rainbow借鑒了Arduino開源硬件的思想,對GPIO進行了進一步的封裝,簡化了GPIO的表示方式,對于GPIOA-GPIOC管腳,直接使用PA0-PA15、PB0-PB15、PC0-PC15來表示。要使用一個GPIO,僅僅兩個步驟即可:
1、設(shè)置GPIO管腳模式:調(diào)用pinMode函數(shù)
函數(shù)原型:void pinMode(GPIOPinName pinName, GPIOMode_TypeDef pinMode)
功能:設(shè)置指定GPIO的管腳模式
參數(shù):pinName 管腳的名稱,如PA0、PB15等
pinMode 管腳的輸入輸出模式,參見ST固件庫GPIOMode_TypeDef類型。GPIO_Mode_Out_PP表示
推挽輸出模式
2、使用digitalWrite()在指定管腳輸出高低電平
函數(shù)原型:void digitalWrite(GPIOPinName pinName, uint8_t val)
功能:向指定的管腳寫入HIGH或LOW
參數(shù):pinName 管腳的名稱,如PA0、PB15等
val 管腳輸出的值:HIGH或者LOW
軟件延時在嵌入式開發(fā)中必不可少,Rainbow通過利用STM32單片機中的SysTick進行了相對精確的延時,可以支持毫秒級延時和微秒級延時,其中毫秒級比較準確,微秒級有一定誤差,但是比起使用指令延時來說已經(jīng)精確很多了。毫秒級延時使用delay()函數(shù),其參數(shù)指定延時的毫秒數(shù);delayMicroseconds()進行微秒級延時,其參數(shù)指定延時的微妙數(shù)。
我們建立一個工程Led,并將Rainbow開發(fā)包導入到工程中,為了快速上手,在軟件包的“QuickStart”文件夾中的Led工程是一個我們預先建立好的工程,可以直接進行編譯、燒寫和調(diào)試。
創(chuàng)建main.cpp,并輸入下列代碼:
#include "WProgram.h"
int main(void)
{
//流水燈對應(yīng)的管腳
GPIOPinName ledPins[] = {LED1_PIN, LED2_PIN, LED3_PIN, LED4_PIN};
uint8_t i;
//初始化開發(fā)板
boardInit();
//設(shè)置led輸出口的模式為推挽輸出模式,并關(guān)閉所有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交替點亮和熄滅,實現(xiàn)了流水燈的效果。