?? main.c
字號:
/*******************************************************************************
*File: main.c
*功能: 運行RTC進行計時,并將所計時間值不斷地通過串口向上位機發送
*******************************************************************************/
#include "config.h"
#define LED1CON 0x00000400 /*P0.10口為LED1控制端*/
/* 定義Fpclk值,用于設置串口波特率*/
#define FPCLK 2764800L
/*定義串口模式設置數據結構*/
typedef struct UartMode
{ uint8 datab; //字長度,5/6/7/8
uint8 stopb; //停止位,1/2
uint8 parity; //奇偶校驗位,0為無校驗,1為奇數校驗,2為偶數校驗
} UARTMODE;
uint8 send_buf[16]; //UART0數據接收緩沖區
/*******************************************************************************
*名稱: UART0_Ini()
*功能: 初始化串口0。設置其工作模式及波特率
*入口參數: baud 波特率
* set 模式設置(UARTMODE數據結構)
*出口參數: 返回值為1時表示初始化成功,為0時表示參數出錯
*******************************************************************************/
uint8 UART0_Ini(uint32 baud, UARTMODE set)
{ uint32 bak;
/*參數過濾*/
if ((0==baud)||(baud>115200))return(0);
if ((set.datab<5)||(set.datab>8))return(0);
if ((0==set.stopb)||(set.stopb>2))return(0);
if (set.parity>4)return(0);
/*設置串口波特率*/
U0LCR=0x80; //DLAB位置1
bak=(FPCLK>>4)/baud;
U0DLM=bak>>8;
U0DLL=bak&0xff;
/*設置串口模式*/
bak=set.datab-5; //設置字長度
if(2==set.stopb)bak|=0x04; //判斷是否為2位停止位
if(0!=set.parity){set.parity=set.parity-1; bak|=0x08;}
bak|=set.parity<<4; //設置奇偶校驗
U0LCR=bak;
return(1);
}
/*******************************************************************************
*名稱: SendByte()
*功能: 向串口發送字節數據,并等待發送完畢
*******************************************************************************/
void SendByte(uint8 data)
{ U0THR=data; //發送數據
while((U0LSR&0x20)==0); //等待數據發送
}
/*******************************************************************************
*名稱: ISendBuf()
*功能:將緩沖區的數據發送回主機
*入口參數: buf 數據緩沖區
* no 發送數據的個數
*出口參數: 無
*******************************************************************************/
void ISendBuf(uint8 const *buf,uint8 no)
{ uint8 i;
for(i=0;i<no;i++)SendByte(buf[i]);
}
/*******************************************************************************
*名稱: SendTimeRtc()
*功能: 讀取RTC的時間值,并將讀出的時分秒值由串口發送到上位機顯示
*******************************************************************************/
void SendTimeRtc(void)
{ uint8 const MESSAGE[]="RTC Time is:";
uint32 times;
uint8 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);
}
/*******************************************************************************
*名稱: RTCIni()
*功能: 初始化實時時鐘
*******************************************************************************/
void RTCIni(void)
{ PREINT=FPCLK/32768-1; //設置預分頻器
PREFRAC=FPCLK-(FPCLK/32768)*32768;
YEAR=2005; //初始化年
MONTH=6; //初始化月
DOM=10; //初始化日
HOUR=8;
MIN=30;
SEC=0;
CIIR=0x01; //設置秒值的增量產生一次中斷
CCR=0x01; //啟動RTC
}
/*******************************************************************************
*名稱: main()
*功能: 讀取實時時鐘的值,并從串口發送出去
*******************************************************************************/
int main(void)
{ UARTMODE uart0_set;
PINSEL0=0x00000005; //設置I/O連接到UART0
PINSEL1=0x00000000;
IODIR=LED1CON; //設置LED1控制口為輸出,其它I/O為輸入
uart0_set.datab=8; //8位數據位
uart0_set.stopb=1; //1位停止位
uart0_set.parity=0; //無奇偶校驗位
UART0_Ini(9600,uart0_set); //初始化串口模式
U0FCR=0x01; //使能FIFO
RTCIni(); //初始化RTC
while(1)
{ IOSET=LED1CON; //熄滅LED
while(0==(ILR&0x01)); //等待RTC增量中斷標志位
ILR=0x01; //清除中斷標志位
SendTimeRtc(); //讀取時鐘值,并向UART0發送
IOCLR=LED1CON; //點亮LED
while(0==(ILR&0x01));
ILR=0x01;
SendTimeRtc();
}
return(0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -