{ } else { }
if ( (uartch2->S1) & UART_S1_TDRE_MASK ) { }
uartch2->D = ch; break;
if ( (uartch1->S1) & UART_S1_TDRE_MASK ) { }
uartch1->D = ch; break;
}//end for if (t >= 0xFBBB) return 1; //发送超时 else
return 0; //成功发送 }
//============================================================================ //函数名称:uart_sendN
//参数说明:uartNo: 串口号:UART_0、UART_1、UART_2 // buff: 发送缓冲区 // len:发送长度
//函数返回: 函数执行状态:0=正常;1=异常 //功能概要:串行 接收n个字节
//============================================================================ uint_8 uart_sendN (uint_8 uartNo ,uint_16 len ,uint_8* buff) {
uint_16 i;
for (i = 0; i < len; i++) {
23
if (uart_send1(uartNo, buff[i]))
{
break; }
}
if (i >= len) return 1; else return 0; }
//============================================================================ //函数名称:uart_send_string
//参数说明:uartNo:UART模块号:UART_0、UART_1、UART_2 // buff:要发送的字符串的首地址 //函数返回: 函数执行状态:0=正常;非0=异常。 //功能概要:从指定UART端口发送一个以'\\0'结束的字符串
//============================================================================ uint_8 uart_send_string(uint_8 uartNo, void *buff) {
uint_16 i = 0;
uint_8 *buff_ptr = (uint_8 *)buff; for(i = 0; buff_ptr[i] != '\\0'; i++) {
if (uart_send1(uartNo,buff_ptr[i])) return 1; } return 0; }
//============================================================================ //函数名称:uart_re1
//参数说明:uartNo: 串口号:UART_0、UART_1、UART_2
// fp:接收成功标志的指针:*fp=0,成功接收;*fp=1,接收失败 //函数返回:接收返回字节 //功能概要:串行接收1个字节
//============================================================================
24
uint_8 uart_re1 (uint_8 uartNo,uint_8 *fp) {
uint_32 t; uint_8 dat;
for (t = 0; t < 0xFBBB; t++)//查询指定次数 {
if(0==uartNo) {
UARTLP_MemMapPtr uartch1=UART0_BASE_PTR; UART_MemMapPtr uartch2 = UART_ARR[uartNo-1];
//判断接收缓冲区是否满
if ((uartch1->S1) & UART_S1_RDRF_MASK ) {
dat = uartch1->D; *fp= 0; //收到数据 break; }
} else {
//判断接收缓冲区是否满
if ((uartch2->S1) & UART_S1_RDRF_MASK ) {
dat = uartch2->D; *fp= 0; //收到数据 break; }
}//end for if(t >= 0xFBBB) {
dat = 0xFF;
*fp = 1; //未收到数据 }
return dat; //返回接收到的数据
}
25
}
//============================================================================ //函数名称:uart_reN
//参数说明:uartNo: 串口号:UART_0、UART_1、UART_2 // buff: 接收缓冲区 // len:接收长度
//函数返回:函数执行状态 0=正常;非0=异常 //功能概要:串行 接收n个字节
//============================================================================ uint_8 uart_reN (uint_8 uartNo ,uint_16 len ,uint_8* buff) {
uint_16 i; uint_8 flag = 0;
for (i = 0; i < len && 0 == flag; i++) {
buff[i] = uart_re1(uartNo, &flag); }
if (i >= len)
return 1; //接收失败 else
return 0; //接收成功 }
//====定义串口IRQ号对应表==== static uint_8 table_irq_uart[3] = {12, 13, 14};
//============================================================================ //函数名称:uart_enable_re_int
//参数说明:uartNo: 串口号:UART_0、UART_1、UART_2 //函数返回:无
//功能概要:开串口接收中断
//============================================================================ void uart_enable_re_int(uint_8 uartNo) {
26
UARTLP_MemMapPtr uartch1=UART0_BASE_PTR;
UART_MemMapPtr uartch2 = UART_ARR[uartNo-1]; if(0==uartNo)
uartch1->C2 |= UART_C2_RIE_MASK; //开放UART接收中断 else
uartch2->C2 |= UART_C2_RIE_MASK; //开放UART接收中断 enable_irq(table_irq_uart[uartNo]); //开中断控制器IRQ中断 }
//============================================================================ //函数名称:uart_disable_re_int
//参数说明:uartNo: 串口号 :UART_0、UART_1、UART_2 //函数返回:无
//功能概要:关串口接收中断
//============================================================================ void uart_disable_re_int(uint_8 uartNo) {
UARTLP_MemMapPtr uartch1=UART0_BASE_PTR; UART_MemMapPtr uartch2 = UART_ARR[uartNo-1]; if(0==uartNo)
uartch1->C2 &= ~UART_C2_RIE_MASK; //禁止UART接收中断
else
uartch2->C2 &= ~UART_C2_RIE_MASK; //禁止UART接收中断 }
//============================================================================ //启用MCGIRCLK时钟,输出时钟频率在31.25Khz ~ 4Mhz void MCGIRCLK_OutEnable(void) {
MCG_C1 |= MCG_C1_IRCLKEN_MASK|MCG_C1_IREFSTEN_MASK; MCG_SC |=MCG_SC_FCRDIV(0x0); //内部4M快速参考时钟分频因子, //可将时钟分频在31.25Khz ~ 4Mhz MCG_C4 |= MCG_C4_FCTRIM(0xA); MCG_C2 |= MCG_C2_IRCS_MASK; while (!(MCG_S & MCG_S_IRCST_MASK));
27
disable_irq(table_irq_uart[uartNo]); //禁止中断控制器IRQ中断