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