流水燈也叫跑馬燈,就是一排燈光交替點亮,從視覺上來說就像燈光在運動,下面我們將使用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交替點亮和熄滅,實現了流水燈的效果。