原创 基于ARM单片机的流水灯

2010-6-2 22:25 5162 11 11 分类: MCU/ 嵌入式

基于ARM单片机的流水灯<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


在很多人的心中以及出版的中文图书中,都给ARM冠以微处理器(或微控制器)。“单片机”在很多人的心目中是指“51单片机”,这是错误的。因为单片机是很宽泛的概念,有51单片机、PIC单片机、AVR单片机、华邦单片机、Motorola单片机等等。所以在具体说到某个芯片时,应该在单片机这三个字前面加上定语,给予明确。本人使用的周立功公司出产的Easy ARM1138开发板,板上含有基于Cortex-M3内核的LM3S1138,我把它称为:ARM单片机。它使用、调试都非常方便,不愧为高性能、低价格的开发板,是广大单片机爱好者、研发工程师的首选。


 


    硬件设计


基于ARM单片机的流水灯的硬件电路非常简单,其电原理图如下所示。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


896a52fd-3569-4792-9fa0-fcf60a90bf7b.jpg 


在实验板上焊接八只发光二极管、一只排阻和一个九针单排插针,然后将其用九根杜邦线与1138开发板相连即可。


 


    软件设计


Easy ARM1138开发板上内嵌有USB仿真器,故程序一开始要防止其失效。同时要进行系统初始化,另外为了节能,所有的端口在使用前要先使能,并确定其方向(输入或输出)。


流水灯的详细流程图如下所示。



7e7ce789-2499-41a8-ab08-04e242280a36.jpg


 


由于具有驱动库软件包,因此我们完全可以拚弃晦涩难懂的汇编语言,也不需要掌握底层寄存器的操作细节。只要懂C语言就能轻松玩转LM3S系列ARM


流水灯的详细C程序如下所示。


 


//  基于《Stellaris外设驱动库》的流水灯


//  包含必要的头文件


#include  <hw_types.h>


#include  <hw_memmap.h>


#include  <hw_sysctl.h>


#include  <hw_gpio.h>


#include  <sysctl.h>


#include  <gpio.h>


 


//  将较长的标识符定义成较短的形式


#define  SysCtlPeriEnable       SysCtlPeripheralEnable


#define  SysCtlPeriDisable      SysCtlPeripheralDisable


#define  GPIOPinTypeIn          GPIOPinTypeGPIOInput


#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput


#define  GPIOPinTypeOD          GPIOPinTypeGPIOOutputOD


 


//  定义KEY


#define  KEY_PERIPH             SYSCTL_PERIPH_GPIOG


#define  KEY_PORT               GPIO_PORTG_BASE


#define  KEY_PIN                GPIO_PIN_5


 


//  防止JTAG失效


void  JTAG_Wait(void)


{


    SysCtlPeriEnable(KEY_PERIPH);            //使能KEY所在的GPIO端口


    GPIOPinTypeIn(KEY_PORT , KEY_PIN);       //设置KEY所在管脚为输入


if ( GPIOPinRead(KEY_PORT , KEY_PIN)  ==  0x00 )  


//如果复位时按下KEY,则进入


    {


        for (;;);                        //死循环,以等待JTAG连接


    }


    SysCtlPeriDisable(KEY_PERIPH);      //禁止KEY所在的GPIO端口


}


 


//  定义全局的系统时钟变量


unsigned long  TheSysClock  =  12000000UL;


 


//  延时


void  Delay(unsigned long  ulVal)


{


    while ( --ulVal  !=  0 );


}


 


//  系统初始化


void  SystemInit(void)


{


    SysCtlLDOSet(SYSCTL_LDO_2_50V);      //设置LDO输出电压


    SysCtlClockSet(SYSCTL_USE_OSC |      //系统时钟设置,采用主振荡器


                   SYSCTL_OSC_MAIN |


                   SYSCTL_XTAL_6MHZ |


                   SYSCTL_SYSDIV_1);


    TheSysClock  =  SysCtlClockGet();    //获取系统时钟,单位:Hz


}


 


//  主函数(程序入口)


int  main(void)


{


    unsigned char i;


    JTAG_Wait();                       //防止JTAG失效,重要!


    SystemInit();                      //  系统初始化


    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOF);    //使能LED所在的PF


    GPIOPinTypeOut(GPIO_PORTF_BASE, 0Xff);    //PF全为输出


    GPIOPinWrite(GPIO_PORTF_BASE,0xff,0xff);  //PF全出1


    for (;;)


    {


       for(i=0;i<8;i++)


       {


          GPIOPinWrite(GPIO_PORTF_BASE,0x01<<i,0);    //点亮第iLED


          Delay(300 * (TheSysClock / 4000));          //延时约300ms


          GPIOPinWrite(GPIO_PORTF_BASE,0xff,0xff);    //熄灭


       }


    }


}


 


本人使用的是IAR EWARMIAR Embedded Workbench for ARM)集成开发环境,利用周立功公司提供的工程模板,输入以上的源程序,点击菜单Project”→“Mark进行编译,或按F7键,根据提示修改错误,再进行编译直至无错误为止


 


3  软件调试


编译无误后即可点击菜单Project”→“Dbuge”下载源程序的机器码至开发板(或按Ctrl+D),同时在桌面上出现了几个调试用的快捷按钮——运行(go)、运行到光标处(Run to Cursor)、步出(Step Out)、步入(Step Into)、步越(Step Over)、停止(Break)、复位(Reset)等。通过选择上述不同的快捷按钮,以及观察变量的值(点击菜单“View”→“Watch”在Expression中输入变量名,即可在Value中看到该变量的值;或将光标悬停在某变量上,即可看到该变量的值),来调试程序,直至一切无误后即可全速运行了(点击快捷按钮go)。


    我的邮箱:txxyc104.163.com,欢迎来信讨论。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /3 下一条