📄 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 + -