ARM7学习笔记---ClimberWin
今天做了一个流水灯程序,编译环境是KEIL for ARM。
本文引用地址:https://www.eepw.com.cn/article/201611/316015.htm开始用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 da 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 da { U0THR = da while( PE==0 ); //等待数据发送完毕 PE=1忙碌;PE=0;不忙绿 } /***********串口发送字符串**********************/ void UART0_SendStr(unsigned char const *str) { while(1) { if( *str == ) 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,0x30); LCD_DELAY(); LCD_SCOM(0,0x0c); LCD_DELAY(); LCD_SCOM(0,0x01); //清屏,将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,0x87+y); LCD_write(p);break; case 4:LCD_SCOM(0,0x97+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,0x87+y); LCD_SCOM(0,0x0d);break; case 4:LCD_SCOM(0,0x97+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); }
评论