| 
				打卡等级:初来乍到打卡总天数:1最近打卡:2025-09-01 10:05:43  已绑定手机新手上路 
 
 
	积分11 
 | 
 
| 大家好,请教一下有关串口1用定时器1作波特率时无法工作(暂未找到原因) 
 
 串口及定时器相关函数如下:
 
 这是串口1初始化函数
 
 void XC1_init(u16 BaudRate)
 {
 
 COMx_InitDefine                COMx_InitStructure;
 COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;
 COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;        (此处改BRT_Timer2时可以正常工作)
 COMx_InitStructure.UART_BaudRate  = BaudRate;
 COMx_InitStructure.UART_RxEnable  = ENABLE;
 COMx_InitStructure.BaudRateDouble = DISABLE;
 COMx_InitStructure.UART_Interrupt = ENABLE;
 COMx_InitStructure.UART_Polity    = Polity_1;
 COMx_InitStructure.UART_P_SW      = UART1_SW_P30_P31;
 UART_Configuration(UART1, &COMx_InitStructure);
 
 }
 
 
 这是串口2初始化函数:
 
 
 void XC2_init(u16 BaudRate)
 {
 
 COMx_InitDefine                COMx_InitStructure;
 COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;
 COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;
 COMx_InitStructure.UART_BaudRate  = BaudRate;
 COMx_InitStructure.UART_RxEnable  = ENABLE;
 COMx_InitStructure.BaudRateDouble = DISABLE;
 COMx_InitStructure.UART_Interrupt = ENABLE;
 COMx_InitStructure.UART_Polity    = Polity_1;
 COMx_InitStructure.UART_P_SW      = UART2_SW_P10_P11;
 UART_Configuration(UART2, &COMx_InitStructure);
 
 }
 
 
 
 
 这是UART_Configuration串口初始化程序(用库、未改)
 
 u8 UART_Configuration(u8 UARTx, COMx_InitDefine *COMx)
 {
 u8        i;
 u32        j;
 
 #ifdef UART1
 if(UARTx == UART1)
 {
 COM1.id = 1;
 COM1.TX_read    = 0;
 COM1.TX_write   = 0;
 COM1.B_TX_busy  = 0;
 COM1.RX_Cnt     = 0;
 COM1.RX_TimeOut = 0;
 COM1.B_RX_OK    = 0;
 for(i=0; i<COM_TX1_Lenth; i++)        TX1_Buffer[i] = 0;
 for(i=0; i<COM_RX1_Lenth; i++)        RX1_Buffer[i] = 0;
 
 if(COMx->UART_Polity > Polity_3)        return 2;        //错误
 UART1_Polity(COMx->UART_Polity);        //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
 if(COMx->UART_Mode > UART_9bit_BRTx)        return 2;        //模式错误
 SCON = (SCON & 0x3f) | COMx->UART_Mode;
 if((COMx->UART_Mode == UART_9bit_BRTx) || (COMx->UART_Mode == UART_8bit_BRTx))        //可变波特率
 {
 j = (MAIN_Fosc / 4) / COMx->UART_BaudRate;        //按1T计算
 if(j >= 65536UL)        return 2;        //错误
 j = 65536UL - j;
 if(COMx->UART_BRT_Use == BRT_Timer1)
 {
 TR1 = 0;
 AUXR &= ~0x01;                //S1 BRT Use Timer1;
 TMOD &= ~(1<<6);        //Timer1 set As Timer
 TMOD &= ~0x30;                //Timer1_16bitAutoReload;
 AUXR |=  (1<<6);        //Timer1 set as 1T mode
 TH1 = (u8)(j>>8);
 TL1 = (u8)j;
 ET1 = 0;        //禁止中断
 TMOD &= ~0x40;        //定时
 INT_CLKO &= ~0x02;        //不输出时钟
 TR1  = 1;
 }
 else if(COMx->UART_BRT_Use == BRT_Timer2)
 {
 AUXR &= ~(1<<4);        //Timer stop
 AUXR |= 0x01;                //S1 BRT Use Timer2;
 AUXR &= ~(1<<3);        //Timer2 set As Timer
 AUXR |=  (1<<2);        //Timer2 set as 1T mode
 TH2 = (u8)(j>>8);
 TL2 = (u8)j;
 IE2  &= ~(1<<2);        //禁止中断
 AUXR |=  (1<<4);        //Timer run enable
 }
 else return 2;        //错误
 }
 else if(COMx->UART_Mode == UART_ShiftRight)
 {
 if(COMx->BaudRateDouble == ENABLE)        AUXR |=  (1<<5);        //固定波特率SysClk/2
 else                                                                AUXR &= ~(1<<5);        //固定波特率SysClk/12
 }
 else if(COMx->UART_Mode == UART_9bit)        //固定波特率SysClk*2^SMOD/64
 {
 if(COMx->BaudRateDouble == ENABLE)        PCON |=  (1<<7);        //固定波特率SysClk/32
 else                                                                PCON &= ~(1<<7);        //固定波特率SysClk/64
 }
 if(COMx->UART_Interrupt == ENABLE)        ES = 1;        //允许中断
 else                                                                ES = 0;        //禁止中断
 if(COMx->UART_RxEnable == ENABLE)        REN = 1;        //允许接收
 else                                                                REN = 0;        //禁止接收
 P_SW1 = (P_SW1 & 0x3f) | (COMx->UART_P_SW & 0xc0);        //切换IO
 return        0;
 }
 #endif
 #ifdef UART2
 if(UARTx == UART2)
 {
 COM2.id = 2;
 COM2.TX_read    = 0;
 COM2.TX_write   = 0;
 COM2.B_TX_busy  = 0;
 COM2.RX_Cnt     = 0;
 COM2.RX_TimeOut = 0;
 COM2.B_RX_OK    = 0;
 for(i=0; i<COM_TX2_Lenth; i++)        TX2_Buffer[i] = 0;
 for(i=0; i<COM_RX2_Lenth; i++)        RX2_Buffer[i] = 0;
 
 if((COMx->UART_Mode == UART_9bit_BRTx) ||(COMx->UART_Mode == UART_8bit_BRTx))        //可变波特率
 {
 if(COMx->UART_Polity > Polity_3)        return 2;        //错误
 UART2_Polity(COMx->UART_Polity);        //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
 if(COMx->UART_Mode == UART_9bit_BRTx)        S2CON |=  (1<<7);        //9bit
 else                                                                        S2CON &= ~(1<<7);        //8bit
 j = (MAIN_Fosc / 4) / COMx->UART_BaudRate;        //按1T计算
 if(j >= 65536UL)        return 2;        //错误
 j = 65536UL - j;
 AUXR &= ~(1<<4);        //Timer stop
 AUXR &= ~(1<<3);        //Timer2 set As Timer
 AUXR |=  (1<<2);        //Timer2 set as 1T mode
 TH2 = (u8)(j>>8);
 TL2 = (u8)j;
 IE2  &= ~(1<<2);        //禁止中断
 AUXR |=  (1<<4);        //Timer run enable
 }
 else        return 2;        //模式错误
 if(COMx->UART_Interrupt == ENABLE)        IE2   |=  1;                //允许中断
 else                                                                IE2   &= ~1;                //禁止中断
 if(COMx->UART_RxEnable == ENABLE)        S2CON |=  (1<<4);        //允许接收
 else                                                                S2CON &= ~(1<<4);        //禁止接收
 P_SW2 = (P_SW2 & ~1) | (COMx->UART_P_SW & 0x01);        //切换IO
 return        0;
 }
 #endif
 #ifdef UART3
 if(UARTx == UART3)
 {
 COM3.id = 3;
 COM3.TX_read    = 0;
 COM3.TX_write   = 0;
 COM3.B_TX_busy  = 0;
 COM3.RX_Cnt     = 0;
 COM3.RX_TimeOut = 0;
 COM3.B_RX_OK    = 0;
 for(i=0; i<COM_TX3_Lenth; i++)        TX3_Buffer[i] = 0;
 for(i=0; i<COM_RX3_Lenth; i++)        RX3_Buffer[i] = 0;
 
 if((COMx->UART_Mode == UART_9bit_BRTx) || (COMx->UART_Mode == UART_8bit_BRTx))        //可变波特率
 {
 if(COMx->UART_Polity > Polity_3)        return 2;        //错误
 UART3_Polity(COMx->UART_Polity);        //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
 if(COMx->UART_Mode == UART_9bit_BRTx)        S3_9bit();        //9bit
 else                                                                        S3_8bit();        //8bit
 j = (MAIN_Fosc / 4) / COMx->UART_BaudRate;        //按1T计算
 if(j >= 65536UL)        return 2;        //错误
 j = 65536UL - j;
 if(COMx->UART_BRT_Use == BRT_Timer3)
 {
 S3_BRT_UseTimer3();                //S3 BRT Use Timer3;
 TH3 = (u8)(j>>8);
 TL3 = (u8)j;
 T4T3M = 0x0a;                        //Timer3 set As Timer, 1T mode, Start timer3
 }
 else if(COMx->UART_BRT_Use == BRT_Timer2)
 {
 AUXR &= ~(1<<4);                //Timer stop
 S3_BRT_UseTimer2();        //S3 BRT Use Timer2;
 AUXR &= ~(1<<3);                //Timer2 set As Timer
 AUXR |=  (1<<2);                //Timer2 set as 1T mode
 TH2 = (u8)(j>>8);
 TL2 = (u8)j;
 IE2  &= ~(1<<2);        //禁止中断
 AUXR |=  (1<<4);        //Timer run enable
 }
 else return 2;        //错误
 }
 else        return 2;        //模式错误
 if(COMx->UART_Interrupt == ENABLE)        S3_Int_Enable();                //允许中断
 else                                                                S3_Int_Disable();                //禁止中断
 if(COMx->UART_RxEnable == ENABLE)        S3_RX_Enable();        //允许接收
 else                                                                S3_RX_Disable();        //禁止接收
 P_SW2 = (P_SW2 & ~2) | (COMx->UART_P_SW & 0x02);        //切换IO
 return        0;
 }
 #endif
 #ifdef UART4
 if(UARTx == UART4)
 {
 COM4.id = 3;
 COM4.TX_read    = 0;
 COM4.TX_write   = 0;
 COM4.B_TX_busy  = 0;
 COM4.RX_Cnt     = 0;
 COM4.RX_TimeOut = 0;
 COM4.B_RX_OK    = 0;
 for(i=0; i<COM_TX4_Lenth; i++)        TX4_Buffer[i] = 0;
 for(i=0; i<COM_RX4_Lenth; i++)        RX4_Buffer[i] = 0;
 
 if((COMx->UART_Mode == UART_9bit_BRTx) || (COMx->UART_Mode == UART_8bit_BRTx))        //可变波特率
 {
 if(COMx->UART_Polity > Polity_3)        return 2;        //错误
 UART4_Polity(COMx->UART_Polity);        //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
 if(COMx->UART_Mode == UART_9bit_BRTx)        S4_9bit();        //9bit
 else                                                                        S4_8bit();        //8bit
 j = (MAIN_Fosc / 4) / COMx->UART_BaudRate;        //按1T计算
 if(j >= 65536UL)        return 2;        //错误
 j = 65536UL - j;
 if(COMx->UART_BRT_Use == BRT_Timer4)
 {
 S4_BRT_UseTimer4();                //S4 BRT Use Timer4;
 TH4 = (u8)(j>>8);
 TL4 = (u8)j;
 T4T3M = 0xa0;                        //Timer4 set As Timer, 1T mode, Start timer4
 }
 else if(COMx->UART_BRT_Use == BRT_Timer2)
 {
 AUXR &= ~(1<<4);                //Timer stop
 S4_BRT_UseTimer2();        //S4 BRT Use Timer2;
 AUXR &= ~(1<<3);                //Timer2 set As Timer
 AUXR |=  (1<<2);                //Timer2 set as 1T mode
 TH2 = (u8)(j>>8);
 TL2 = (u8)j;
 IE2  &= ~(1<<2);        //禁止中断
 AUXR |=  (1<<4);        //Timer run enable
 }
 else return 2;        //错误
 }
 else        return 2;        //模式错误
 if(COMx->UART_Interrupt == ENABLE)        S4_Int_Enable();                //允许中断
 else                                                                S4_Int_Disable();                //禁止中断
 if(COMx->UART_RxEnable == ENABLE)        S4_RX_Enable();        //允许接收
 else                                                                S4_RX_Disable();        //禁止接收
 P_SW2 = (P_SW2 & ~4) | (COMx->UART_P_SW & 0x04);        //切换IO
 return        0;
 }
 #endif
 return        2;        //错误
 }
 
 
 
 这是定时器0初始化:
 
 void Systick_Init(void)reentrant
 {
 unsigned int temp;
 
 AUXR &= 0x7F;                //定时器时钟12T模式
 TMOD &= 0xF0;                //设置定时器模式自动重装载
 
 //根据OS_TICKS_PER_SEC设置值来确认定时器初始值
 temp = 65536 - MAIN_Fosc/OS_TICKS_PER_SEC/12;
 
 TL0 = temp%256 ;
 TH0 = temp/256 ;
 TF0 = 0;                //清除TF0标志
 TR0 = 1;                //定时器0开始计时
 ET0 = 1;    //使能定时器中断
 }
 
 
 
 
 另外还用到定时器4
 
 void IR_init(void)//红外初始化:20键
 {
 
 
 INTCLKO |= 0X10;  //使能 INT2 下降沿中断
 P3SR = 0;
 
 
 T4T3M &= 0xDF;                        //定时器时钟12T模式
 T4L = 0;                                //设置定时初始值
 T4H = 0;                                //设置定时初始值
 
 T4T3M &= 0x7f;                        //定时器4停止计时
 
 
 EA = 1;
 }
 
 
 
 问题描述:当串口1串口2共用定时器2作波特率时,都能正常工作;当串口1用定时器1串口2用
 定时器2作波特率时串口1不工作,串口2、定时器0、定时器4能正常工作。
 
 谢谢。
 
 
 
 
 
 | 
 |