123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- /***********************************************************************************************************
- 功能:
- Uart1(9600)Uart2(9600),采用time1定时器
- Uart1选用P30,P31作为通信口,Uart2选用P17,P36作为通信口
- 8位数据位,无校验位,1位停止位。
- ***********************************************************************************************************/
- #include <REGtenxTM52F1386.h>
- #include "TM52F1386_bsp.h"
- #include <intrins.h>
- #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++);
- }
- }
|