历史上的今天
今天是:2025年01月31日(星期五)
2020年01月31日 | STM32把SD卡内容搬运到内部FLASH之一
2020-01-31 来源:eefocus
首先阅读这篇博文:
STM32操作访问内部flash,包括写入数据到flash和从flash读取数据 :https://blog.csdn.net/Ace_Shiyuan/article/details/78196648
这篇文章写得比较明白,但是它写的函数不饱满,没有把Flash充分写满,意思如下:
请看写数组的函数:FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i*2, temp);//写入数据
存在问题:比如写u8 pBuffer[10]={"123456789"};写进去是:01 00 02 00.... 这样的 中间浪费了,/因为u8转u16会自动给前面补0 那就是01 02 03 在写到内存会字节序反过来。
而如果FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i, temp);会失败
因为写之前要擦除的,你写了必须后面移动。你写的是00 01 一次写了2个字节。
有两种解决办法,一种实诚,一种高级。
1基于内部FLASH的库函数,自己写扩展函数。
* @param Address: specifies the address to be programmed.
* This parameter can be 0x1FFFF804 or 0x1FFFF806. -----------------测试下 这两个地址也是不能写的!
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)----------这个函数放弃使用。至少是写u16的!写u8会失败!
FLASH_Status FLASH_ProgramHalfWord (uint32_t Address, uint16_t Data)--OK
FLASH_Status FLASH_ProgramWord (uint32_t Address, uint32_t Data)--OK
2测试
#define STM32ADDR_ADJUSTMENT 0X08078800 //p241//0X0807F800 //PAGE255 2K
#define STM32ADDR_PAGE 15
u8 pBuffer[10]={"123456789"};
u8 TBuffer[9];
函数:
stm32_flash_page_clear(STM32ADDR_ADJUSTMENT);
stm32_flash_write_Array(pBuffer,STM32ADDR_ADJUSTMENT,9);
stm32_flash_read_Array(TBuffer,STM32ADDR_ADJUSTMENT,9) ;

3擦掉Flash
for(i=0;i stm32_flash_read_Array((u8*)buf,STM32ADDR_ADJUSTMENT,1024*2); for(j=0;j<512;j++) { if(buf[j]!=0XFFFFFFFF)break; } if(j!=512) stm32_flash_page_clear(STM32ADDR_ADJUSTMENT+i*1024*2); } 4开始写 while(res==FR_OK)//死循环执行 { // res=f_read(fftemp,tempbuf,4096,(UINT *)&bread); //读取数据 // if(res!=FR_OK)break; //执行错误 // W25QXX_Write(tempbuf,offx+flashaddr,4096); //从0开始写入4096个数据 // offx+=bread; // fupd_prog(x,y,size,fftemp->fsize,offx); //进度显示 // if(bread!=4096)break; //读完了. res=f_read(fftemp,tempbuf,1024*2,(UINT *)&bread); //读取数据 stm32_flash_write_Array(tempbuf,i*2018+STM32ADDR_ADJUSTMENT,2048); offx+=bread; i++; fupd_prog(x,y,size,15,i); //进度显示 } f_close(fftemp); 注意:f_read(fftemp(文件),tempbuf(数组名),1024*2(数组长),(UINT *)&bread(这个变量好,可以告诉你读到多少个,比如你去读2018结果它是23那就是告诉你读完了你只读到了23个)); +++++++++++++++++++++++ unsigned char UpdateBuffer[256]; dWrd = *(uint32_t *)&UpdateBuffer[idx]; +++++++++++++++++++++++
下一篇:STM32F读写SD卡的驱动
史海拾趣
|
我看各位讲的天花乱坠的,要把一些.dll文件拷贝到目标机器的windows目录下面,还要注册一个regedit.dll,可是我用的是模拟器,我怎么使用adoce呢?… 查看全部问答> |
|
我想进入IC设计这方面的领域。以前学习软件开发,伴随着软件开发经验越多,感觉硬件太差,这时想搞清楚计算机电路设计构造,尤其是芯片设计。在网上查找了些资料,才发现这时有关IC设计领域的事情。 或许是软件经验太 ...… 查看全部问答> |
|
在wince6.0平台上如何将模拟器中任务栏上的软键盘的位置调整到桌面上的任意一个位置? 在wince6.0界面下,将生成的模拟器界面中的任务栏上的软键盘的位置调整到桌面上的任意一个位置,该如何操作?谢谢!… 查看全部问答> |
|
1. Hive-based registry在suspend的时候会调用RegFlushKey 我想知道是那个模块,在那一个具体的步骤中调用的RegFlushKey。 2.按suspend正常过程打印下面了内容 Powering Off system: Calling GWES power ...… 查看全部问答> |
|
本人在做圆感应同步器的数显系统,打算用AD2S80芯片,现在看不太明白它与单片机的接口是如何工作的. 哪位弟兄用过改芯片,望不吝赐教.(附件上传了该芯片的说明资料)… 查看全部问答> |
|
网上看到一个老外做的有趣的小工具,bus pirate,就是利用PC做控制台,通过一个PIC单片机板子,模拟输出各种常用的单片机总线信号,比如I2C,SPI,1WIRE等等,这样就可以对常用的各种总线接口的芯片进行直接操作,不需要利用单片机编程序的麻 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:37 编辑 我在做fir滤波试验时,如果fir滤波系数放在程序存储器中(coeffs指定其首地址). 例程里有如下滤波语句: firs *AR2+0% , *AR3+0% , coeffs coeffs不是总是指向滤波系数表的第一个吗???哪里有自加啊?它 ...… 查看全部问答> |




