/*********************************************************************************************************** 功能: 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() { /*uart1_gpio_init(); SM0 = 0; SM1 = 1; // SM0\SM1=01 UART mode=1;8位数据传送 SM2 = 0; // Mode 1, 3 波特率采用9600 = (SMOD+1) x Fsysclk / (32 x 2 x (256-TH1)) --- 若使用Timer1 自动重载模式 SET_REG_BITS(PCON, SMOD, 1); // SMOD=1允许UART1双波特率控制 SET_REG_BITS(OPTION, UART1W, 0); // UART1禁止一线UART模式 // Mode 1 波特率采用115200 = Fsysclk / (32 x (65536-TH1)) --- 若使用Timer1 自动重载模式 // 假如我用7.3728MHZ晶体通过计算 65536-TH1应等于2, SET_REG_BITS(TMOD, TMOD1, 2); // 选择8位自动重载计数器/定时器 TL1 = 256 - 24; TH1 = 256 - 24; // 9600 TCLK = 0; // UART1模式1&3发送时钟源:0-timer1 1-timer2 RCLK = 0; // UART1模式1&3接收时钟源:0-timer1 1-timer2 TR1 = 1; REN = 1; // UART1接收收据使能 ES = 1; // 允许串口Uart1中断*/ SET_REG_BITS(PCON, SMOD, SMOD_PRICE); // 双波特率控制位 /*SET_REG(PORTIDX, PORT3); SET_REG_BITS(PINMOD10, PINMOD1, PIN_MODE_PP); SET_REG_BITS(PINMOD10, PINMOD0, PIN_MODE_OD_IPU);*/ uart0_gpio_init(); 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中断 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 UART1_send(unsigned char c) // 发送单字节 { // while (busy) // ; // busy = 1; SBUF = c; // 发送单字节 while (TI == 0) ; // 等待发送完成 TI = 0; // } /********************************************************************************************************** **函数名称 UART1_send_buf **函数描述 :uart1发送字符串 **输 入 char **输 出 :None **********************************************************************************************************/ void UART1_send_buf(char *s) // 发送字符串 { while (*s) { UART1_send(*s++); } }