/****************************************Copyright (c)**************************************************
**
** 北天星国际有限公司
** http://www.po-star.com
**
*******************************************************************************************************
**文件名称:LPC_RTC.C
**功能:运行RTC进行计时,并将所时间值不断的通过串口向上位机发送。
每2秒LED1和LED2闪烁一次
**说明:把JP2连接上。
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "..\inc\config.h"
#define UART_BPS 9600
U8 Send_BUF[16]; // UART0数据接收缓冲区
/*************************串口0初始化******************************************/
void UART0_Init ()
{
U16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv =(Fpclk/16)/UART_BPS;
U0DLL = Fdiv%256;
U0DLM = Fdiv/256;
U0LCR = 0x03;
}
/*************************向串口0发送数据******************************************/
void UART0_PutChar ( U8 data)
{
U0THR = data; // 发送数据
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
}
/***********************将缓冲区的数据发送回主机*********************************/
void ISendBuf(U8 const *buf, U8 no)
{
U8 i;
for(i=0; i<no; i++) UART0_PutChar(buf[i]);
}
/****************************************************************************
**读取RTC的时间值,并将读出的时分秒值由串口发送到上位机显示。
****************************************************************************/
void SendTimeRtc(void)
{
U8 const MESSAGE[]= "RTC Time is : ";
U32 times;
U8 bak;
times = CTIME0; // 读取完整时钟寄存器0
bak = (times>>16)&0x1F; // 取得时的值
Send_BUF[0] = bak/10+'0';
Send_BUF[1] = bak%10+'0';
Send_BUF[2] = ':';
bak = (times>>8)&0x3F; // 取得分的值
Send_BUF[3] = bak/10+'0';
Send_BUF[4] = bak%10+'0';
Send_BUF[5] = ':';
bak = times&0x3F; // 取得秒的值
Send_BUF[6] = bak/10+'0';
Send_BUF[7] = bak%10+'0';
Send_BUF[8] = '\n';
ISendBuf(MESSAGE, 14); // 发送数据
ISendBuf(Send_BUF, 9);
}
/********************初始化实时时钟*******************************************/
void RTCInit(void)
{
YEAR = 2006; // 初化年
MONTH = 03; // 初化月
DOM = 2; // 初化日
HOUR = 12;
MIN = 00;
SEC = 00;
CIIR = 0x01; // 设置秒值的增量产生一次中断
CCR = 0x11; // 使用独立振荡器,启动RTC
}
void PLL_Init(void)
{
PLLCON = 1;
#if ((Fcclk / 4) / Fpclk) == 1
VPBDIV = 0;
#endif
#if ((Fcclk / 4) / Fpclk) == 2
VPBDIV = 2;
#endif
#if ((Fcclk / 4) / Fpclk) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
}
/****************************************************************************
**主函数:读取实时时钟的值,并从串口发送出去。
****************************************************************************/
void main(void)
{
PINSEL0 |= 0x00050005; // 设置I/O连接到UART0
PINSEL1 = 0x00000000;
IO0DIR = LED_MASK; // 设置LED1控制口为输出,其它I/O为输入
PLL_Init();
UART0_Init();
U1FCR = 0x01; // 使能FIFO
RTCInit(); // 初始化RTC
while (1 )
{
IO0SET = LED_MASK; // 熄灭LED
while( (ILR&0x01)==0 ); // 等待RTC增量中断标志
ILR = 0x01; // 清除中断标志
SendTimeRtc(); // 读取时钟值,并向UART0发送
IO0CLR = LED_MASK; // 点亮LED
while( (ILR&0x01)==0 );
ILR = 0x01;
SendTimeRtc();
}
}