基于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" />
在实验板上焊接八只发光二极管、一只排阻和一个九针单排插针,然后将其用九根杜邦线与1138开发板相连即可。
⒉ 软件设计
在Easy ARM1138开发板上内嵌有USB仿真器,故程序一开始要防止其失效。同时要进行系统初始化,另外为了节能,所有的端口在使用前要先使能,并确定其方向(输入或输出)。
流水灯的详细流程图如下所示。
由于具有驱动库软件包,因此我们完全可以拚弃晦涩难懂的汇编语言,也不需要掌握底层寄存器的操作细节。只要懂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); //点亮第i个LED
Delay(300 * (TheSysClock / 4000)); //延时约300ms
GPIOPinWrite(GPIO_PORTF_BASE,0xff,0xff); //熄灭
}
}
}
本人使用的是IAR EWARM(IAR 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,欢迎来信讨论。
文章评论(0条评论)
登录后参与讨论