- 打卡等级:初来乍到
- 打卡总天数: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能正常工作。
谢谢。
|
|