新手入门
- 积分
- 32
- 金钱
- 32
- 注册时间
- 2014-9-15
- 在线时间
- 0 小时
|
5金钱
我的程序需要实现的功能是通过两个串口分别控制WIFI和Zigbee的通讯,WIFI和Zigbee的通讯都是双向的,并且发生的时间是不一定的(也就是说可能会出现Zigbee和WIFI同时接收到数据的情况)。
我在程序中分别用到了USART1和USART3来接收数据,然后在调试的过程中发现程序跑死在了串口中断中,检查相应的串口SR寄存器发现是发生了过载(ORE)错误从而触发串口中断,由于我没有对这种问题进行处理,所以串口中断就不停地触发,从而造成程序跑死在串口中断中了。
情况细节补充:
1.程序中只用到了1个定时器中断和两个串口中断,除此之外没有其他的中断了,同时USART1的中断优先级为0,1(抢占和子优先级),USART3优先级为1,2,定时器中断优先级为3,3;
2.USART1所设波特率为115200,USART3所设波特率为1M,并且USART1和USART3都出现过过载错误;
3.程序源码
/*********************************************************************************************************
串口1中断服务函数,接收中断,ZigBee
*********************************************************************************************************/
void USART1_IRQHandler(void)
{
unsigned char i;
unsigned int data_begin_point = 0;
LED0=!LED0;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Zigbee_Rx_Buf[Zigbee_Rx_Cnt++] = USART_ReceiveData(USART1);
/*********************************************************************************************************
*********************************************************************************************************/
if(API_Rx_Identifier)
{
API_Rx_Cnt++;
API_Rx_Checksum += Zigbee_Rx_Buf[Zigbee_Rx_Cnt-1];
if(API_Rx_Cnt >=(API_Rx_Len+1))
{
Test_Zigbee_Rx_Num++;
if(API_Rx_Checksum == 0xFF) //校验和核对正确,接收完成
{
if(Zigbee_Rx_Cnt >= (API_Rx_Len-11) )
data_begin_point = Zigbee_Rx_Cnt-API_Rx_Len+11;
else
data_begin_point = ZIGBEE_RECEIVEBUF_SIZE+Zigbee_Rx_Cnt-API_Rx_Len+11;
for(i=0;i < (API_Rx_Len-12);i++)
{
ReceiveData_Zigbee[Zigbee_Rx_Point] = Zigbee_Rx_Buf[data_begin_point];
data_begin_point++;
if(data_begin_point >= ZIGBEE_RECEIVEBUF_SIZE)
data_begin_point = 0;
}
Zigbee_Rx_Num[Zigbee_Rx_Point] = API_Rx_Len-12;
Zigbee_Rx_Point++;
if(Zigbee_Rx_Point >= ZIGBEE_RECV_SIZE)
Zigbee_Rx_Point = 0;
for(i = 0; i < ZIGBEE_RECEIVEBUF_SIZE; i++)
{
ReceiveData_Zigbee[Zigbee_Rx_Point] = 0;
}
Zigbee_Rx_Flag = 1;
if((API_Rx_Len-12) == 47)
Test_Data_Num++;
else if((API_Rx_Len-12) == 63)
Test_Para_Num++;
else if((API_Rx_Len-12) == 52)
Test_Stat_Num++;
else if((API_Rx_Len-12) == 9)
Test_ACK_Num++;
}
API_Rx_Checksum = 0;
API_Rx_Cnt = 0;
API_Rx_Identifier = 0;
API_Rx_Len = 0;
Zigbee_Rx_Cnt = 0;
for(i = 0; i < ZIGBEE_RECEIVEBUF_SIZE; i++)
{
Zigbee_Rx_Buf = 0;
}
}
}
else
if((Zigbee_Rx_Buf[Zigbee_Rx_Cnt-1] == 0x90) && (Zigbee_Rx_Buf[Zigbee_Rx_Cnt-4] == 0x7E))//接收到API数据的帧头0x7E及接受包标识符0x90
{
API_Rx_Identifier = 1;
API_Rx_Len = (Zigbee_Rx_Buf[Zigbee_Rx_Cnt-3]<<8);
API_Rx_Len = Zigbee_Rx_Buf[Zigbee_Rx_Cnt-2];
API_Rx_Cnt++;
API_Rx_Checksum += 0x90;
}
if(Zigbee_Rx_Cnt >= ZIGBEE_RECEIVEBUF_SIZE)
{
Zigbee_Rx_Cnt = 0;
}
}
}
/*********************************************************************************************************
串口3中断服务函数,接收中断,WIFI
*********************************************************************************************************/
void USART3_IRQHandler(void) //串口3中断服务程序
{
unsigned char j = 0,k = 0;
unsigned long i = 0;
unsigned int code_num=0;
unsigned short err_usart_sr,err_usart_cr;
LED0=!LED0;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
ReceiveData2[Wifi_RX_Sta++] = USART_ReceiveData(USART3);
/***************************************
WIFI数据解析程序段
***************************************/
}
}
其中USART3接收中断中数据解析程序段程序比较长所以就不全部贴出来了,基本都是些if和switch的判断,我用LED灯的亮灭指示过USART3接收中断的执行时间,最长的情况下是24us。
我想请问大神们以下两个问题:
1.我的这种应用情况下采用串口双中断的方式是否可行?
2.频繁地发生这种过载错误的原因是什么?
谢谢大家了!
|
|