香水城 发表于 2013-5-23 13:40 
中断接收填满buffer之后,就调用Display()显示;如果在display的过程中,接收buffer又满了,难道也还要调用 ...
我准备写入外部FALSH当中,假如写完了之后我 重启单片机, 然后读取相应的配置文件,然后再显示 香水城 有妙招没
程序如下 没有调用显示函数时 串口正常,但调用显示函数时就 读取不了数据 显示函数时间 大约在3S钟 所以想跳出显示函数
while(1)
{
if(UartData标志寄存器==0)
{
Display(1,0,0,0,0,0); //调用显示函数
}
SYN_标志寄存器 = checksyn(); //同步字节检测
if(SYN_标志寄存器 == 1) //如果成功
{
uart1_get(&tmp);
switch(tmp)
{
case 0x01:
if(Parameter_Set()) //参数设置正确
{
goto Prog_start; //重新读取配置信息
}
else
{
break;
}
for(i=0;i<count; i++)
{
// while(UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET); //check whethe is empty of the Tx buff
// UART1->DR = (u8) read_eeprom(address+i);
// count--;
}
break;
case 0x02:
// UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE); //串口1接收使能
break;
case 0x03:
UartData标志寄存器 = 0;
// SYN_标志寄存器=0;
goto Prog_start;
break;
case 0x04:
uart1_get(&tmp);
DataLen = tmp; //接收数据长度 32b
DataLen = DataLen<<8;
uart1_get(&tmp);
DataLen |= tmp;
DataLen = DataLen<<8;
uart1_get(&tmp);
DataLen |= tmp;
DataLen = DataLen<<8;
uart1_get(&tmp);
DataLen |= tmp;
count = DataLen;
i=0;
while(DataLen>0) //将数据读出来并且存入到flash CRC校验
{
while(!uart1_get(&tmp)); //等待串口下一个数据 需要加一个跳出语句 不然后果不堪设想
// break;
gWRFlash_Buffer[k++] = tmp;
DataLen--;
if((count<256)&&(k==count)) //如果接收长度小于一个256即小于写入的一页flash
{
SPI_Flash_BufferToMainMemoryPageProgram_Built_inErase(0x01,0x00,0x00,gWRFlash_Buffer,count);
k = 0;
}
if(k==256)
{
SPI_Flash_BufferToMainMemoryPageProgram_Built_inErase(0x01,WRPageAddress,0x00,gWRFlash_Buffer,k);
k=0;
WRPageAddress++;
if(WRPageAddress==1024)
{
// ExternFlashOver标志寄存器 = 1; //外部FLASH已写满标志
}
}
// delay_ms(10); flash 可以读到264BYTE
} // end while(DataLen>0)
SPI_Flash_ContinuousArrayRead(0x00,0x00,gTXBuffer,count);
for(i=0;i<count; i++)
{
while(UART2_GetFlagStatus(UART2_FLAG_TXE)==RESET); //check whether is empty of the Tx buff
// UART1_ClearFlag(UART1_FLAG_TC);
UART2->DR = gTXBuffer;
//delay_ms(100); 此延时不能设置太长时间 即会出先串口输出太慢
}
// UartData标志寄存器 = 0;
// goto Prog_start;
break;
case 0x05:
break;
// case 0x06:
// default :
// goto Prog_start;
// break;
}
}
}
|