专注电子技术学习与研究
当前位置:单片机教程网 >> STM32 >> 浏览文章

第二个应用:LED流水灯

作者:huqin   来源:本站原创   点击数:  更新时间:2014年04月19日   【字体:

  流水灯也叫跑马灯,就是一排灯光交替点亮,从视觉上来说就像灯光在运动,下面我们将使用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交替点亮和熄灭,实现了流水灯的效果。

关闭窗口

相关文章