/*********************************************************************************************************** 功能: Uart1(9600)Uart2(9600),采用time1定时器 Uart1选用P30,P31作为通信口,Uart2选用P17,P36作为通信口 8位数据位,无校验位,1位停止位。 ***********************************************************************************************************/ #include #include "TM52F1386_bsp.h" #include #include "uart.h" #include "zigbee.h" // 波特率=(SMOD+1) x F SYSCLK /(32 x 2 x (256 – TH1)) #define SMOD_PRICE 1 #define FRC_HZ 18432000 #define FRC_DIV 2 #define BAUD4800 4800 #define BAUD9600 9600 #define BAUD19200 19200 #define BAUD38400 38400 #define BAUD57600 57600 #define BAUD115200 115200 // 必须在系统一分频下 #define UART0_BAUD_RATE BAUD9600 #define TIM_NUM (unsigned int)(256 - ((((FRC_HZ / FRC_DIV) * (SMOD_PRICE + 1)) / 2) / 32 / BAUD9600)); // 计算不同波特率下的定时器值 /* 系统频率设置为二分频 */ unsigned char txrx_buf[8] = {0x55}; char busy; char setuart; /********************************************************************************************************** **函数名称 :uart1_gpio_init **函数描述 :串口IO初始化 **输 入 :None **输 出 :None **********************************************************************************************************/ void uart0_gpio_init() { // RXD p30 --p4.4 // TXD p31 --p4.5 /*SET_REG(PORTIDX, PORT3); SET_REG_BITS(PINMOD10, PINMOD1, PIN_MODE_PP); SET_REG_BITS(PINMOD10, PINMOD0, PIN_MODE_OD_IPU);*/ ////modified by zzw 修改串口为P4.4和P4.5 SET_REG(PORTIDX, PORT4); SET_REG_BITS(PINMOD54, PINMOD5, PIN_MODE_PP); SET_REG_BITS(PINMOD54, PINMOD4, PIN_MODE_OD_IPU); setuart = GET_REG(PINMODE) | 0x02; SET_REG(PINMODE, setuart); // 设置UART0PS为10,将P4.4/P4.5用作RXD0/TXD0 ////modified by zzw 修改串口为P4.4和P4.5 } /********************************************************************************************************** **函数名称 :uart1_timer2_init **函数描述 :uart1在timer2下配置 **输 入 :None **输 出 :None **********************************************************************************************************/ void uart0_timer1_init() { /*SET_REG(PORTIDX, PORT3); SET_REG_BITS(PINMOD10, PINMOD1, PIN_MODE_PP); SET_REG_BITS(PINMOD10, PINMOD0, PIN_MODE_OD_IPU);*/ uart0_gpio_init(); SET_REG_BITS(PCON, SMOD, SMOD_PRICE); // 双波特率控制位 SM0 = 0; SM1 = 1; // 模式1 SM2 = 0; REN = 1; // 允许接收 SET_REG_BITS(TMOD, TMOD1, 2); // 8 位自动重载定时器/计数器(TL1),溢出时从 TH1 重新装载。 TL1 = TIM_NUM; TH1 = TIM_NUM; TI = 0; // 先清发送中断 标志 RI = 0; // 先清接收中断 标志 TR1 = 1; // TIMER1 运行 REN = 1; // UART接收收据使能 ES = 1; // 允许串口Uart1中断 ////boot uart,前提一倍频下计算//// /*UART0CON = UART0CON & ~0x80; // UART0BRS清零,波特率设置同标准 8051 SM0 = 0; SM1 = 1; // SM0\SM1=01 UART mode=1;8位数据传送 ,01:模式 1:8 位 UART0,波特率可变 SM2 = 0; // Mode 1, 3 波特率采用9600 = (SMOD+1) x Fsysclk / (32 x 2 x (256-TH1)) --- 若使用Timer1 自动重载模式 PCON = (PCON & 0x7F) | 0x80; // SMOD=1允许UART双波特率控制//波特率= (SMOD + 1) x F SYSCLK / (32 x 2 x (256 – TH1)) // Fsysclk = 波特率 * 32 * (256 - TH1) // TH1 = 256-Fsysclk/(波特率*32) // 115200 :TH1 =256- 18432000/115200/32=256-5 // 9600 : TH1 =256- 18432000/9600/32=256- 60 TMOD = TMOD & ~0X30 | 0x20; TL1 = 256 - 5; TH1 = 256 - 5; // 115200 //TL1 = 256 - 60; //TH1 = 256 - 60; // 9600 TCLK = 0; // UART1模式1&3发送时钟源:0-timer1 1-timer2 RCLK = 0; // UART1模式1&3接收时钟源:0-timer1 1-timer2 ES = 1; // 允许串口Uart中断 TI = 0; // 先清发送中断 标志 RI = 0; // 先清接收中断 标志 TR1 = 1; // TIMER1 运行 REN = 1; // UART接收使能*/ ////boot uart/// busy = 0; // 初始化 } /********************************************************************************************************** **函数名称 :uart1_irq **函数描述 :uart1中断入口 **输 入 :None **输 出 :None **********************************************************************************************************/ void uart0_irq() interrupt 4 { unsigned char temp; if (RI) { temp = SBUF; uart_receive_input(temp); // zigbee函数 RI = 0; } /* if (TI) { TI = 0; busy = 0; // 清除忙标志 }*/ // 不是方式0,不采用中断请标志位 } /********************************************************************************************************** **函数名称 UART1_send **函数描述 :uart1发送单字节数据 **输 入 char **输 出 :None **********************************************************************************************************/ void UART0_send(unsigned char c) // 发送单字节 { // while (busy) // ; // busy = 1; SBUF = c; // 发送单字节 while (TI == 0) ; // 等待发送完成 TI = 0; // } /********************************************************************************************************** **函数名称 UART1_send_buf **函数描述 :uart1发送字符串 **输 入 char **输 出 :None **********************************************************************************************************/ void UART0_send_buf(char *s) // 发送字符串 { while (*s) { UART0_send(*s++); } }