您的位置 首页 产品

ARM7学习笔记—ClimberWin

开始学习ARM,从ARM7学习起,从LPC2103开始学。通过LPC2103的练习板子和H-JTAG并口调试器来进行实际练习。今天做了一个流水灯程序,编译环…

开端学习ARM,从ARM7学习起,从LPC2103开端学。经过LPC2103的操练板子和H-JTAG并口调试器来进行实践操练。

今日做了一个流水灯程序,编译环境是KEIL for ARM。

开端用ARM装了ADS调试软件,是专门调试ARM的编译环境,再加上H-JTAG软件,进行下载调试。可是今日运用了KEIL for ARM来进行编译,由于对KEIL环境仍是比较了解,所以用KEIL来进行调试。制作了第一个演示程序,LED流水灯程序。

今日还学习了,ARM调试能够挑选RAM空间进行调试还能够ROM调试。现在我用的是并口的H-JTAG,也能够用D-LINK等调试器。

下载了PLC2103的数据手册和运用手册,能够在www.NXP.com网站下载,还有运用笔记能够下载,比较有用。

今日学习了I/O口的运用和装备

IODIR是装备IO口输入和输出

IOSET设置IO口为高

IOCLR设置IO口为低

IOPIN 读IO口数据

H-JTAG装置和运用

能够检测到ARM7芯片(LPC2103)

怎么和KEIL和ADS衔接,HELP文档中都有介绍,详细不记录了。

以下介绍下keil for ARM编译环境的装置、软件的破解,和装备

装置MDK350PRC.EXE,再运转KEIL_Lic.exe进行破解先运转KEIL

第一个流水灯程序:需求新建一个工程文件,姓名为led,选取为芯片如下:

在KEIL里怎么调试简略阐明下:

点击,进入调试界面。首要需求对H-JTAG在KEIL中运用进行装备。

在H-JTAG软件中HELP中检查数据手册

挑选芯片类型

填写好晶振

挑选好下载格局Intel Hex format,挑选好文件途径

在KEIL中还需求进行装备:ROM和RAM的装备

装备好了今后点击调试

呈现H-Flasher界面,点击Program就能够进行调试了

LED流水灯源程序:

/**************ARM7(LPC2103)操练程序**************************/

/*************************************************************/

/*****File Function : LED Display *****/

/*****Program Author : ZhengWen(ClimberWin) *****/

/*****MCU : LPC2103F 外部12M晶振 *****/

/*****Compile Date : 2009/12/2 *****/

/*****Edition Info : V1.0 *****/

//编译环境 KEIL for ARM

//LED接口 P0.0-P0.7

//LED流水灯程序OK,第一个ARM操练程序

#include

#include

#define uint unsigned int

#define uchar unsigned char

void delayms(unsigned int count);//延时程序

void led_display(void);//流水灯显现程序

/*************延时程序***************/

void delayms(unsigned int count)

{

unsigned int i,j;

for(i=0;i

for(j=0;j<5000;j++);

}

/**********流水灯显现程序*********/

void led_display(void)

{

uchar i;

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

{

IO0SET=0xff;

IO0CLR=(1<

delayms(100);

}

}

/////////////主程序///////////////////

void main(void)

{

IO0DIR=0x000000ff; //装备P0.0-P0.7为输出

while(1)

{

led_display(); //流水灯显现程序

}

}

2009年12月3日周四 笔记

开端学习LPC2103的UART串口

UART0操练

U0LCR装备

波特率核算公式:

其间DivAddVal/MulVal 分频用,值如下表,这样能够削减波特率差错

当DivAddVal/MulVal=0时;

所以能够核算锁存器高位和低位的数值

U0DL = (PCLK/16)/baudrate;

U0DLM= U0DL/256;

U0DLL = U0DL%256;

在开端设置串口参数的时分需求把U0LCR 的DLAB置1

在结束设置串口参数的时分需求把U0LCR 的DLAB置0测验成果:

UART0测验源程序:

/**************ARM7(LPC2103)操练程序**************************/

/*************************************************************/

/*****File Function : UART test *****/

/*****Program Author : ZhengWen(ClimberWin) *****/

/*****MCU : LPC2103F 外部11.0592M晶振 *****/

/*****Compile Date : 2009/12/3 *****/

/*****Edition Info : V1.0 *****/

/*************************************************************/

//编译环境 KEIL for ARM

//功用描绘:串口操练,运用UART0向串口发送字符和字符串

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define PCLK 11059200 //晶振频率

#define baudrate 9600 //设置波特率

#define PE (U0LSR&0x40) //界说串口数据发送繁忙与否,PE=1繁忙;PE=0;不忙绿

void delayms(unsigned int count); //延时程序

void UART0_INT(void); //串口初始化

void UART0_SendByte(unsigned char data); //串口发送字节

void UART0_SendStr(unsigned char const *str);//串口发送字符串

/*************延时程序***************/

void delayms(unsigned int count)

{

unsigned int i,j;

for(i=0;i

for(j=0;j<5000;j++);

}

/***********串口0初始化**********************/

void UART0_INT(void)

{ unsigned short int U0DL;

U0LCR = 0x83; // DLAB = 1,可设置波特率 ;无奇偶校验 1位中止位 8位数据长度。

U0DL = (PCLK/16)/baudrate;

U0DLM= U0DL/256; //高8位

U0DLL = U0DL%256; //低8位

U0LCR = 0x03; // DLAB = 0,设置好波特率;无奇偶校验 1位中止位 8位数据长度。

}

/***********串口发送字节**********************/

void UART0_SendByte(unsigned char data)

{

U0THR = data; //发送数据

while( PE==0 ); //等候数据发送结束 PE=1繁忙;PE=0;不忙绿

}

/***********串口发送字符串**********************/

void UART0_SendStr(unsigned char const *str)

{ while(1)

{ if( *str == \0 ) break;

UART0_SendByte(*str++); //发送数据

}

}

/////////////主程序///////////////////

int main(void)

{

PINSEL0 = 0x00000005; //设置I/O衔接到UART0

PINSEL1 = 0x00000000;

UART0_INT(); //串口初始化

while(1)

{

UART0_SendStr(“LPC2103 UART0 Test OK!”); //向串口发送字符串

delayms(1000);

}

return(0);}

2009年12月4日星期五

学习LCD12864操控,从AVR程序上移植过来

调试成功,可是中心遇到了一些问题,一向没找出原因,原来是一个时序问题,在AVR上是正常的,在LPC2103上就有问题,是时序原因。

IO0SET=LCD_SCLK;

DELAY(100); //这个延时程序本来没加,所以出错了,加上去就正常了

IO0CLR=LCD_SCLK;LCD12864移植成功。2009年12.4.16:00

LCD12864液晶显现源程序:

/**************ARM7(LPC2103)操练程序**************************/

/*************************************************************/

/*****File Function : LCD12864显现 *****/

/*****Program Author : ZhengWen(ClimberWin) *****/

/*****MCU : LPC2103F 外部11.0592M晶振 *****/

/*****Compile Date : 2009/12/4 *****/

/*****Edition Info : V1.0 *****/

/*************************************************************/

//编译环境 KEIL for ARM

//功用描绘:LCD12864显现程序

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define LCD_CS (1<<0) //片选 高电平有用 单片LCD运用时可固定高电平 rs

#define LCD_SID (1<<1) //数据 r/w

#define LCD_SCLK (1<<2) //时钟 e

uchar const HEX_[]={“0123456789ABCDEF”};

uchar BUFFER[6] = {0};

uchar K_NUM;

void DELAY(uchar t);

void LCD_SEND(uchar date);

void LCD_SCOM(uchar st,uchar date);

void LCD_DELAY(void);

void LCD_INIT(void);

void LCD_write(uchar *p);

void LCD_LOCAL(uchar x,uchar y,uchar *p);

void LCD_cblank(uchar x,uchar y);

void LCD_count(long s,uchar x1,uchar y1,uchar x,uchar y,uchar *p);

void LCD_bai();

void Delay1ms(unsigned int count);

/*************延时程序***************/

void delayms(unsigned int count)

{

unsigned int i,j;

for(i=0;i

for(j=0;j<5000;j++);

}

void Delay1ms(unsigned int count)

{

unsigned int i,j;

for(i=0;i

for(j=0;j<120;j++);

}

void DELAY(uchar t)

{

while(–t);

}

void LCD_SEND(uchar date)

{

uchar i;

//LCD_SCLK=0;

IO0CLR=LCD_SCLK;

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

{

//LCD_SID=date&0x80;

if((date&0x80)==0)

{IO0CLR=LCD_SID;}

else

{ IO0SET=LCD_SID;}

//LCD_SCLK=1;

//LCD_SCLK=0;

IO0SET=LCD_SCLK;

DELAY(100);

IO0CLR=LCD_SCLK;

date<<=1;

}

}

void LCD_SCOM(uchar st,uchar date)

{

uchar st_temp,hdate,ldate;

if(st)

st_temp=0xfa;

else st_temp=0xf8;

hdate=date&0xf0;

ldate=date&0x0f;

ldate <<= 4;

// LCD_CS = 1;

IO0SET=LCD_CS;

LCD_SEND(st_temp);

LCD_SEND(hdate);

LCD_SEND(ldate);

//LCD_CS = 0;

IO0CLR=LCD_CS;

DELAY(38);

}

void LCD_DELAY(void)

{ uchar s;

s=10;

while(–s)

DELAY(250);

}

void LCD_INIT(void)

{

LCD_SCOM(0,0×30);

LCD_DELAY();

LCD_SCOM(0,0x0c);

LCD_DELAY();

LCD_SCOM(0,0×01); //清屏,将DDRAM的地址计数器归零

LCD_DELAY();

}

void LCD_write(uchar *p)

{

while(*p)

{

LCD_SCOM(1,*p);

p++;

}

}

void LCD_LOCAL(uchar x,uchar y,uchar *p) //lcd string (x,y) write!

{

switch (x)

{

case 1:LCD_SCOM(0,0x7f+y); LCD_write(p);break;

case 2:LCD_SCOM(0,0x8f+y); LCD_write(p);break;

case 3:LCD_SCOM(0,0×87+y); LCD_write(p);break;

case 4:LCD_SCOM(0,0×97+y); LCD_write(p);break;

default :LCD_SCOM(0,0x7f+y); LCD_write(p);

}

}

void LCD_cblank(uchar x,uchar y)

{

switch (x)

{

case 1:LCD_SCOM(0,0x7f+y); LCD_SCOM(0,0x0d);break;

case 2:LCD_SCOM(0,0x8f+y); LCD_SCOM(0,0x0d);break;

case 3:LCD_SCOM(0,0×87+y); LCD_SCOM(0,0x0d);break;

case 4:LCD_SCOM(0,0×97+y); LCD_SCOM(0,0x0d);break;

default :LCD_SCOM(0,0x7f+y); LCD_SCOM(0,0x0d);

}

}

/*******************************************/

main()

{ //main start

Delay1ms(1000);

IO0DIR=0x000000ff; //装备P0.0-P0.7为输出

Delay1ms(1000);

LCD_INIT();

Delay1ms(1000);

LCD_LOCAL(1,1,”LPC2103 操练程序”);

LCD_LOCAL(2,1,”LCD12864显现程序”);

LCD_LOCAL(3,1,”欢迎光临火芯电子”);

LCD_LOCAL(4,1,”www.huo-xin.com “);

while(1); }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/267260.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部