可以用串口下载,先发送BIN文件要写在FLASH里的地址和BIN文件的具体容量(不是占用量),然后用串口工具发送BIN文件,由于W25QXX一次只能写256字节,编程还要40MS,串口工具发送文件要每256字节延时50MS。
参考代码:
[C] 纯文本查看 复制代码 void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
u32 saddrs;
u16 slen;
u16 i;
PDownConfig UartDownConfig; //4字节数据长度,2字节开始扇区地址
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if(flashdown)
{
UartBuf[UartCount]=Res;
if(RevFlag==0)
{
if(++UartCount>=6) //首先接收配置参数
{
UartCount=0;
RevFlag=1;
UartDownConfig=(PDownConfig)UartBuf;
Capacity_vel=UartDownConfig->Capacity;
addrs=UartDownConfig->Sector*256;
Printf(USART1,"The total capacity is %d Byte,The starting ADDRs is %6X \r\n",Capacity_vel,addrs);
saddrs=addrs>>12;
slen=Capacity_vel>>12;
if(Capacity_vel%4096!=0) slen+=1;
Printf(USART1,"Erase Sector adds:%X nums:%d\r\n",saddrs,slen);
for(u16 i=0;i<slen;i++)
{
W25QXX_Erase_Sector(saddrs);
Delay_Ms(50);
saddrs++;
}
Printf(USART1,"Erase OK!\r\n");
}
}
else //收完头信息后接收数据
{
if(++UartCount>255 )//满256个或者传完了
{
UartCount = 0;
FullFlag=0; //没有完呢
UartComp=1; //满256个启动DMA
for(i=0;i<=255;i++)
{
CopyBuf[i]=UartBuf[i]; //转存在CopyBuf[]中倒出缓冲区
}
}
else if(Capacity_vel<256) //传完了
{
FullFlag=1; //传完整页了剩的数据
UartComp=1;
datacnt=Capacity_vel; //剩的数据
for(i=0;i<=datacnt;i++)
{
CopyBuf[i]=UartBuf[i];
}
}
}
}
else
{
if((USART1_RX_STA&0x8000)==0)//接收未完成
{
if(USART1_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART1_RX_STA=0;//接收错误,重新开始
else
{
USART1_RX_STA|=0x8000; //接收完成了
Copy_len=USART1_RX_STA&0x3fff; //接收长度
for(i=0;i<Copy_len;i++)
{
CopyBuf[i]=USART1_RX_BUF[i]; //转存
}
Usart1_Flag=1; //标志接收完
USART1_RX_STA=0; //重新开始接收新数据
}
}
else //还没收到0X0D
{
if(Res==0x0d)USART1_RX_STA|=0x4000;
else
{
USART1_RX_BUF[USART1_RX_STA&0X3FFF]=Res ;
USART1_RX_STA++;
if(USART1_RX_STA>(USART_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除串口接受中断
}
|