新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2021-1-2
- 在线时间
- 6 小时
|
5金钱
运用新战舰 V3开发板,SPI flash为W25Q128xx,Flash每4KB为一个Sector,共计4096个Sector
方法一:串口中断接收数据,保存在开辟的存储区(数组),数组长度4096,写满这个数组刚好4KB,然后W25QXX_Write((u8*)TEXT_Buffer,t*4096,4096);将整个数组的数据依次写入并保存在Flash里面
方法一可以正确的写入数据,但是有一个问题就是只有写满数组4096个字节,数据才会写入FLASH,如果数组没有写满是无法写入到FLASH的;
例如:串口1正常接收数据,每满4096个字节就写入到Flash,但是最后一个段数据不满4096个字节,那么最后这一段就会出现没有写入flash的情况;
为了解决数据没有写满4096个字节也能写入Flash的问题,修改为下面的方法二,但是有问题,希望高手来指点一下。
方法一:
void USART1_IRQHandler(void)
{
if(t<4096) //判断地址是否超出范围
{
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
res=USART_ReceiveData (USART1);
TEXT_Buffer[i]=res; //串口1接收数据并保存在数组中
if(i<4095)
{
i++; //数组还未写满
}
else
{
W25QXX_Write((u8*)TEXT_Buffer,t*4096,4096); //数组写满,写入Flash中
i=0;
t++;
}
}
}
}
===========================================================================================================================
方法二:
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
res=USART_ReceiveData (USART1); //串口1接收数据,并放入数组的第一位
TEXT_Buffer[0]=res;
if(i<4096)
{
W25QXX_Write((u8*)TEXT_Buffer,num*4096+i,1); //数据还没满4096,Sector的地址不变,偏移地址加1,每来一个数据就写一次
i++;
}
else
{
num++; //数据满4096个,进入下一个Sector地址,偏移地址从0开始
i=0;
}
}
}
目前采用方法二进行验证,有一个问题就是数据写入不全,串口1接收好多数据,但是写入到Flash的字符数量很少;
个人分析可能是串口1接收数据太快,在串口中断程序里面写入太平凡,导致串口1丢数据太严重;
针对这个问题,大家有没有什么好的编程思路。要求就是串口1接收任意长度的(不超过4096个字节)的数据能够准确写入FLASH里面。
|
最佳答案
查看完整内容[请看2#楼]
按照方法一,在两个情况下写flash,1:满了4096;2:你这收到的字节不是会计数吗,当这个字节不动了,不是就收完了数据吗,然后把这一包数据写到flash就好了
|