目的是 每秒种 向串口发送实时时钟 <br />每天定时 15点01分 向串口发送 This a test!!!<br />问题 每秒发送没问题<br />定时发送This a test!!! 时间到了没反应 <br />请教哪里设置错误或什么的?<br /><br />/****************************************************************************<br />* 文件名:SENDRTC.C<br />* 功能:运行RTC进行计时,将所时间值不断的通过串口向上位机发送<br />* 显示。<br />* 说明:将跳线器JP8短接。<br />* 通讯波特率115200,8位数据位,1位停止位,无奇偶校验。<br />****************************************************************************/<br />#include "config.h" <br /><br /><br /><br />/* 定义串口模式设置数据结构 */<br />typedef struct UartMode<br />{ uint8 datab; // 字长度,5/6/7/8<br /> uint8 stopb; // 停止位,1/2<br /> uint8 parity; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验<br />} UARTMODE;<br /><br /><br />uint8 send_buf[16]; // UART0数据接收缓冲区<br /><br /><br />/****************************************************************************<br />* 名称:UART0_Ini()<br />* 功能:初始化串口0。设置其工作模式及波特率。<br />* 入口参数:baud 波特率<br />* set 模式设置(UARTMODE数据结构)<br />* 出口参数:返回值为1时表示初化成功,为0表除参数出错<br />****************************************************************************/<br />uint8 UART0_Ini(uint32 baud, UARTMODE set)<br />{ uint32 bak;<br /> <br /> /* 参数过滤 */<br /> if( (0==baud)||(baud>115200) ) return(0);<br /> if( (set.datab<5)||(set.datab>8) ) return(0);<br /> if( (0==set.stopb)||(set.stopb>2) ) return(0);<br /> if( set.parity>4 ) return(0);<br /><br /> /* 设置串口波特率 */<br /> U0LCR = 0x80; // DLAB位置1<br /> bak = (Fpclk>>4)/baud;<br /> U0DLM = bak>>8;<br /> U0DLL = bak&0xff;<br /> <br /> /* 设置串口模式 */<br /> bak = set.datab-5; // 设置字长度<br /> if(2==set.stopb) bak |= 0x04; // 判断是否为2位停止位 <br /> <br /> if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}<br /> bak |= set.parity<<4; // 设置奇偶校验<br /> <br /> U0LCR = bak;<br /> <br /> return(1);<br />}<br /><br />/****************************************************************************<br />* 名称:SendByte()<br />* 功能:向串口UART0发送字节数据,并等待发送完毕。<br />* 入口参数:data 要发送的数据<br />* 出口参数:无<br />****************************************************************************/<br />void SendByte(uint8 data)<br />{ U0THR = data; // 发送数据<br /><br /> while( (U0LSR&0x20)==0 ); // 等待数据发送<br />}<br />//--------------------------------------------------------<br />void SendStr(char *str)<br />{<br />while(1)<br /> {<br /> if(*str == '\0') break;<br /> SendByte(*str++);<br /> }<br />}<br />/****************************************************************************<br />* 名称:ISendBuf()<br />* 功能:将缓冲区的数据发送回主机。<br />* 入口参数:buf 数据缓冲区<br />* no 发送数据的个数<br />* 出口参数:无<br />****************************************************************************/<br />void ISendBuf(uint8 const *buf, uint8 no)<br />{ uint8 i;<br /> <br /> for(i=0; i<no; i++) SendByte(buf);<br />} <br /><br /><br /><br />/****************************************************************************<br />* 名称:SendTimeRtc()<br />* 功能:读取RTC的时间值,并将读出的时分秒值由串口发送到上位机显示。<br />* 入口参数:无<br />* 出口参数:无<br />****************************************************************************/<br />void SendTimeRtc(void)<br />{ uint8 const MESSAGE[]= "RTC Time is : ";<br /> uint32 times;<br /> uint8 bak;<br /> <br /> times = CTIME0; // 读取完整时钟寄存器0<br /> <br /> bak = (times>>16)&0x1F; // 取得时的值<br /> send_buf[0] = bak/10+'0';<br /> send_buf[1] = bak%10+'0'; <br /> send_buf[2] = ':';<br /> <br /> bak = (times>>8)&0x3F; // 取得分的值<br /> send_buf[3] = bak/10+'0';<br /> send_buf[4] = bak%10+'0'; <br /> send_buf[5] = ':';<br /> <br /> bak = times&0x3F; // 取得秒的值<br /> send_buf[6] = bak/10+'0';<br /> send_buf[7] = bak%10+'0'; <br /> send_buf[8] = '\n';<br /> <br /> ISendBuf(MESSAGE, 14); // 发送数据<br /> ISendBuf(send_buf, 9);<br />}<br /><br /><br /><br />/****************************************************************************<br />* 名称:RTCIni()<br />* 功能:初始化实时时钟。<br />* 入口参数:buf 数据缓冲区<br />* no 发送数据的个数<br />* 出口参数:无<br />****************************************************************************/<br />void RTCIni(void)<br />{ PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器<br /> PREFRAC = Fpclk - (Fpclk / 32768) * 32768;<br /> <br /> <br /> YEAR = 2008; // 初化年<br /> MONTH = 11; // 初化月<br /> DOM = 8; // 初化日<br /> HOUR = 15;<br /> MIN = 0;<br /> SEC = 0;<br /> <br /> ALHOUR = 15;<br /> ALMIN = 1;<br /> ALSEC = 0;<br /> <br /> CIIR = 0x01; <br /> ILR = 0x03;<br /> AMR = 0xF8; <br /> CCR = 0x01; // 启动RTC<br />}<br /><br />void __irq IRQ_RTC()<br />{<br /> // 清除中断标志<br /> SendTimeRtc(); // 读取时钟值,并向UART0发送<br /> ILR |= 0x01; // 清除RTC增量中断标志<br /> VICVectAddr = 0; <br /><br />}<br /><br />void __irq IRQ_ALM()<br />{<br /> SendStr("This a test !!!");<br /> ILR |= 0x10; <br /> VICVectAddr = 1; <br /><br />}<br />/****************************************************************************<br />* 名称:main()<br />* 功能:读取实时时钟的值,并从串口发送出去,并把秒的值输出LED1--LED8显示。<br />****************************************************************************/<br />int main(void)<br />{ UARTMODE uart0_set;<br /><br /> PINSEL0 = 0x00000005; // 设置I/O连接到UART0 <br /> PINSEL1 = 0x00000000; <br /> IO0DIR = SPI_IOCON; // 设置LED1控制口为输出,其它IO为输入<br /> <br /> uart0_set.datab = 8; // 8位数据位<br /> uart0_set.stopb = 1; // 1位停止位<br /> uart0_set.parity = 0; // 无奇偶校验<br /> UART0_Ini(115200, uart0_set); // 初始化串口模式<br /> U0FCR = 0x01; // 使能FIFO<br /> <br /> RTCIni();<br /> <br /> /* VIC初始化 */<br /> VICIntSelect = 0x00; // 设置所有中断连接IRQ中断<br /> VICVectCntl0 = 0x20 | 13; // 分配通道0<br /> VICVectAddr0 = (int)IRQ_RTC; // 设置中断服务程序地址<br /> VICVectAddr1 = (int)IRQ_ALM;<br /> VICIntEnable = (1 << 13); // 使能RTC中断 <br /> <br /> while(1);<br /> return(0);<br />} |
|