引言
嵌入式技术是当前发展速度最快、应用最广、前景最好的信息技术领域之一。目前,社会上嵌入式系统人才短缺的现状给各大高校带来了契机,很多高校的电子信息工程专业都开设了相关的嵌入式课程。嵌入式系统主要由两部分组成:一是硬件,二是软件。本设计是基于32位ARM7TDMIS核的LPC2131微控制器,内部带有独立电源和时钟源的实时时钟,在节电模式下极大地降低了功耗。通过硬件和软件的结合操作,实现了对内部各个时间寄存器的秒、分、小时、日、月、年和星期的控制,能够将采集到各个时间数据通过串口发送到上位机上,达到实时系统的显示功能。此设计便于形成专用的时钟控制的嵌入式装置,也能够嵌入到各种智能化应用系统中。
1系统工作原理
该系统主要基于LPC2131为核心的主控电路,由JTAG下载模块、外部时钟源模块、ARM7微控制器模块、串口通信模块(RS232)等电路组成。LPC2131微控制器内部带有实时时钟模块,可以由外部独立的时钟振荡器来提供时钟源或由基于内部VPB时钟的可编程预分频器来提供时钟源,达到对时钟寄存器秒、分、小时、日、月、年和星期的控制。同时将控制的数据通过串口与PC机通信,来实现结果,将数据显示在PC机上。
1.1实时时钟内部结构介绍
图1
LPC2131内部实时时钟结构框图如图1所示。实时时钟包含混合寄存器、时间寄存器、时间计数器、报警寄存器和预分频器等。其中,混合寄存器包括:中断位置寄存器(ILR)、时钟节拍计数器(CTC)、时钟控制寄存器(CCR)、计数器递增中断寄存器(CIIR)、报警屏蔽寄存器(AMR);时间计数器包括:秒寄存器(SEC)、分寄存器(MIN)、小时寄存器(HOUR)、日期寄存器(DOM)、星期寄存器(DOW)、年寄存器(DOY)、月寄存器(MONTH)、年寄存器(YEAR);时间寄存器组包括:完整时间寄存器0(CTIME0)、完整时间寄存器1(CTIME1)、完整时间寄存器2(CTIME2);报警寄存器包括:秒报警值(ALSEC)、分报警值(ALMIN)、小时报警值(ALHOUR)、日期报警值(ALDOM)、星期报警值(ALDOW)、月报警值(ALMON)、年报警值(ALYEAR);预分频器包括:预分频值整数部分(PREINT)、预分频值小数部分(PREFRAC)。
1.2实时时钟的基本操作
首先,设置时钟控制寄存器(CCR)可以选择RTC的计数时钟,可以由外部振荡器32.768 kHz提供或内部Fpclk分频得到。当使用Fpclk作为时钟源时,它的基准时钟分频器允许调节任何频率高于65.536 kHz的外设时钟源产生一个32.768 kHz的基准时钟,实现准确计时操作。
其次,如果CCR选择内部时钟源,则设置RTC基准时钟分频器(PREINT、PREFRAC),如果选择外部32.768 kHz就不必设置预分频寄存器的值,预分频寄存器值的计数如下:
接着初始化实时时钟(RTC)的各个时钟值,如YEAR、MONTH、DOM等,报警中断设置,如CIIR、AMR等,然后启动RTC,即CCR的CLKEN位置位,读取完整的时间寄存器值。在此过程中时钟节拍计数器(CTC)是一个15位计数器,每秒计数32768个时钟,当有CTC秒进位时,完整时间CTIME0~CTIME2、RTC时间寄存器(如SEC、MIN)将会更新。实时时钟中断有两种:一种增量中断,由CIIR控制;另一种为报警中断。本设计使用的是增量中断。
最后将串口初始化,设置串口的波特率、数据位、停止位、校验位等,将串口与上位机连接,将串口采集到的时间寄存器变化的时间值发送到上位机上显示,得到对实时时钟的控制结果。
1.3寄存器的功能介绍
时钟控制寄存器(CCR)是一个5位寄存器,控制时钟电路的分频操作。计数器增量中断寄存器(CIIR):可以使计数器每次增加时产生一次中断,在中断位置寄
存器的位0(ILR[0])写入1之前,该中断一直保持有效。完整时间寄存器0(CTIME0)和完整时间寄存器1(CTIME1):CTIME0包括秒、分、小时、和星期,CTIME1包括日期、月和年。具体寄存器描述略——编者注。
预分频整数寄存器(PREINT):预分频的整数部分。预分频整数部分计算如下:
预分频小数寄存器(PREFRAC):预分频的小数部分。预分频小数部分计算如下:
PREFRAC=PCLK-((PREINT+1)×32768)
2系统硬件设计
2.1系统的硬件结构
该系统对ARM7微控制器LPC2131的实时时钟模块的各个寄存器控制,来达到对时钟的精确控制。该系统的硬件结构图,如图2所示。包括复位电路模块、JTAG下载模块、通信模块(RS232)、ARM7微控制器模块及外部振荡电路模块。
图2
2.2系统的硬件原理图
复位电路如图3所示,采用复位芯片SP708S,可以大大提高MCU的复位性能。通过确定的电压值(阈值)启动复位操作,同时排除瞬间干扰的影响,又防止MCU在电源启动和关闭期间的误操作,保证数据安全。用阻容复位稳定性差,常常有按了复位键没反应,要按一段时间才能复位的经历,容易复位不成功。
图3
JTAG下载电路如图4所示,采用20引脚的JTAG口,使用下载工具JLINK,由软件MDK将从PC机通过JLINK,下载到LPC2131里。
图4
串口通信电路如图5所示,采用串口芯片MAX3232,将MAX3232与LPC2131连接起来,实现上位机与下位机数据通信。
图5
ARM7微控制器模块及外部振荡电路的系统时钟源晶振为11.0592 MHz,实时时钟的晶振为32.768 kHz。电路图略——编者注。
3系统软件设计
3.1程序流程
本系统采用了高级语言C编写LPC2131程序,本程序主要完成对实时时钟RTC的各个时间寄存器的设定、显示以及对串口0的初始化设定。然后通过CPU采集实时时钟的各个时间寄存器变化的数据,经串口连接到上位机,在上位机上显示出时间来。程序流程如图6所示。
图6
3.2控制程序
根据程序流程,可将程序分为三大部分:第一部分,对串口的初始化及串口发送数据的函数初始化。第二部分,对实时时钟的初始化,来设置基准时钟、时、分、秒等各个寄存器,将采集到的数据通过终端显示出来。第三部分,主函数部分,将秒增量中断标志置位、清楚RTC中断,而后循环地将时间在串口调试助手上显示。
第一部分,串口程序如下:
① 初始化串口。
int initialize_uart0 (unsigned int br){
unsigned short Fp;
PINSEL0|=(
(0x01<<0)//UART0的TXD
|(0x01<<2));//UART0的RXD
U0LCR=0x83;//设置串口工作模式,发送8位数据
Fp=(Fpclk/16)/br;//设置串口波特率
U0DLM=Fp/256;
U0DLL=Fp%256;
U0LCR=0x03;
U0FCR=0x01;//使能FIFO,并设置触发点为1字节
return 0;
}
② 串口发送字节函数。
int send_string_to_uart0(char *str){
while(*str!='\\0') {//字符串结束标志
U0THR=(*str++);
while(!(U0LSR&0x40));//等待数据发送完毕
}
return 0;
}
第二部分,实时时钟初始化:
int initialize_rtc(void){
CCR=0x00;//禁止时间计数器
PREINT=Fpclk/32768-1;
//预分频寄存器的设置,此在设定使用内部时钟源时使用
PREFRAC=Fpclk-(Fpclk/32768)*32768;
YEAR=2010;//对年、月、日、时、分、秒的初始化设定
MONTH=10;
DOM=29;
DOW=5;
HOUR=19;
MIN=28;
SEC=60;
CIIR=0x01;//设置秒值的增量产生一次中断
CCR=0x11;//使用独立振荡器,启动RTC
return 0;
}
int get_time(void){//设置实时时钟的年、月、日、时、分、秒
year=((CTIME1>>16)&0xfff);
month=((CTIME1>>8)&0x0f);
dom=(CTIME1&0x1f);
dow=((CTIME0>>24)&0x07);
hour=((CTIME0>>16)&0x1f);
min=((CTIME0>>8)&0x3f);
sec=(CTIME0&0x3f);
return 0;
}
第三部分,主函数部分:
main(){
char str[100];
initialize_uart0(9600);//串口初始化,设置波特率9600 bps
initialize_rtc();//实时时钟初始化
get_time();
sprintf(str,"\\r\\nyear%02d-%02d-%02d\\r\\n",YEAR,MONTH,DOM,);
send_string_to_uart0(str);//显示初始化设定的年、月、日
sprintf(str,"\\r\\nyear%02d:%02d:%02d\\r\\n",HOUR,MIN,SEC);
send_string_to_uart0(str); //显示初始化的小时、分钟、秒
while(1){
while((ILR&0x01)==0); //等待RTC增量中断
ILR=0x01;//清除中断标志
get_time();
sprintf(str,"\\r\\nyear%02d-%02d-%02d\\r\\n",YEAR,MONTH,DOM,);
send_string_to_uart0(str);//显示初始化设定的年、月、日
sprintf(str,"\\r\\nyear%02d:%02d:%02d\\r\\n",HOUR,MIN,SEC);
send_string_to_uart0(str);//显示初始化的小时、分钟、秒
}
return (0);
}
4实验结果
将以上程序在MDK中运行,下载到LPC2131中,将串口与PC机连接,设置好串口调试助手,波特率9600 bps,数据位8位,1个停止位,无校验位。得到时间结果。
结语
本文介绍了基于ARM7TDMIS核的芯片LPC2131和内部的实时时钟(RTC)的工作原理,设计了基于实时时钟与LPC2131的串行通信的采样系统,将时间显示在上位机上。这种时钟控制系统在现代生产、生活中应用广泛。在实际应用中,只需根据本文的基本思想进行适当的移植,即可设计成专用的时钟控制的嵌入式装置,并嵌入到各种智能化应用系统中。