当前位置: 代码迷 >> 单片机 >> STM32读Flash解决办法
  详细解决方案

STM32读Flash解决办法

热度:43   发布时间:2016-04-28 15:10:21.0
STM32读Flash
大家好!

现在有一个问题很奇怪,就是我用STM32读取Flash的内容时,只能读到一页的数据,超过这个范围后就死机了。

读取Flash内容的代码如下,Flash类型是:MX25L1605D,我使用的是第一个扇区(0x000-0xFFF),共4K字节,从0开始写入和读取,但只能读到0xFF后(第一页),要读取的Flash地址addr再往后增加就死机了,我确认Flash驱动没有问题:


/*
 * 函数名:Read_Card_Record
 * 描述  :用于从Flash中读取一条权限信息
 * 输入  :buf:临时保存读取到的记录 
 *  : dst:要比较的对象,也就是系统从读卡器接收到的刷卡信息
 *  : addr:要读取权限数据在Flash中的的起始地址 
 * 输出  : 返回1为比对正确,否则对比失败
 * 调用  :由主函数调用
 */
u8 Read_Card_Record(u8 buf[], u8 dst[], u32 addr)
{
u8 i = 0;
u8 flag = 0;//权限比对成功与否标志位
//从Flash依次读取每条权限记录,Card_Len是一个常数0x04
SPI_FLASH_BufferRead(buf, addr, Card_Len);//从Flash依次读取每条权限记录
for(i=0;i<Card_Len;i++)
{
//只要有一个字节对比不相等就表示当前读取的权限信息与刷卡信息不匹配
if (buf[i]!=dst[i])
{
flag=0;
break;
}
else
{
flag=1;
}
}
if (flag==0)//表示从Flash权限中读取的信息与当前刷卡的信息不匹配
{
addr+=Card_Len;//将要读取的Flash地址信息增加到下一条记录的开始位置
if (addr>0xFF)//将Flash的0x000-0xFFF作为存储权限的区域,4K字节,也就是第0扇区
{
return 0;
}
else
{
return Read_Card_Record(buf, dst, addr);
}
}
else//比对正确返回1
{
return 1;
}
}
flash

------解决方案--------------------
你这递归调用,估计堆栈爆了,增大堆栈试试。
------解决方案--------------------
引用:
Quote: 引用:


Quote: 引用:

现在的这个程序,我如果想将某一个数组中每个元素和Flash中存储的每条记录(一个数组)每个元素进行比较,看他们是否匹配,如果匹配就返回,否则继续在Flash中读取,有没有什么更高效的方法?我也知道用递归不是太好。

每存储一组数据  添加一个CRC校验 检测时只需检测CRC校验就行了


有道理,这样可以少读很多数据,谢谢了!

会占用存储空间
  相关解决方案