STM32把SD卡内容搬运到内部FLASH之一

发布者:AdventureSeeker最新更新时间:2020-01-31 来源: eefocus关键字:STM32  SD卡  内部FLASH 手机看文章 扫描二维码
随时随地手机看文章

首先阅读这篇博文:

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];

+++++++++++++++++++++++

关键字:STM32  SD卡  内部FLASH 引用地址:STM32把SD卡内容搬运到内部FLASH之一

上一篇:stm32——Fatfs文件系统读写文件
下一篇:STM32F读写SD卡的驱动

推荐阅读最新更新时间:2024-11-09 18:54

STM32时钟系统的基础知识
01 时钟系统 1.1 时钟系统的作用 Stm32芯片中有大量的电路模块,时钟系统提供一个频率信号为电路模块提供统一的节拍,使电路模块能有序工作,最终达到控制电路的目的。 图1.1 晶振频率图 1.2 时钟周期的关系 时钟:为Stm32提供统一的节拍,形象的称时钟是单片机的心脏。 时钟周期:又名振荡周期,一个高低电平(0或1)所需要的时间。 指令周期:CPU从存储器中取出并执行一条指令所需的全部时间(取指、译码与执行三部分时间)。 机器周期:执行一个动作的时间周期,如取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。 图1.2 指令周期图 02 Stm32的时钟源 2.1
[单片机]
<font color='red'>STM32</font>时钟系统的基础知识
STM32之AFIO介绍
先问自己一个问题:STM32中,USART2和TIM2是共用相同IO的,你如何决定这几个IO到底是做USART2还是做TIM2呢?如果你要同时使用USART2和TIM2,该怎么办? 1、不是说使用了IO的复用功能就一定要启动RCC_APB2Periph_AFIO的Clock的,参考下图 只有使用了AFIO的事件控制寄存器、AFIO的重映射功能以及外部中断(EXTI)控制寄存器才需要开启AFIO的时钟,STM32参考手册从来没说过使用IO的复用功能就一定要开启AFIO时钟,这是个误区。 例如下面的,最常用的USART1,如果你的板子上,默认用的就是PA9和PA10这两个IO作为USART1的TX和TX,那么也就是没有重
[单片机]
<font color='red'>STM32</font>之AFIO介绍
STM32库函数与寄存器开发区别
**1.1 **寄存器 寄存器开发优点 直接操作寄存器,运行效率高。 寄存器开发缺点 1、开发难度大,开发周期长 2、代码可阅读性差,可移植差 3、后期维护难度高 1.2****库函数 库函数开发优点 1、开发难度较小,开发周期短 2、代码可阅读性强,可移植高 3、后期维护难度低 库函数开发缺点 相对于寄存器开发,运行效率略低 注意:库函数其实是ST公司对寄存器的进一步封装。 一、 库函数开发LED 库函数开发LED要添加的库函数文件:stm32f4xx_gpio.c 1、理解led灯原理图 LED0连接在PF9 PF9输出低电平(0),灯亮;PF9输出高电平(0),灯灭; 2、打开GPIOF组时钟 在ST
[单片机]
<font color='red'>STM32</font>库函数与寄存器开发区别
stm32之备份寄存器(BKP)应用(侵入检测中断)
前言:很多的嵌入式设备使用过程中,当系统掉电时,往往需要把一些用户设置的参数保存起来,或者是将掉电前的一些状态信息保存,或者是统计系统重启次数。保存这些动态信息其实有很多种方法,第一种:在系统掉电前保存到片内flash,但是对flash的读写是按页操作,对于保存一些少量的数据来说并不合算。第二种:在系统掉电前保存在片外的EEPROM,可以根据需要选用合适的EEPROM存储的大小,但这样需要增加额外电路,增加成本。第三种:利用片内的备份寄存器里的后备数据寄存器存储。对于一些中、小型容量产品来说,有10个16位的数据后备寄存器。与前两种不同,它需要将引脚接上电池,否则数据会丢失。下面对备份寄存器深入了解。 1.备份寄存器的特性
[单片机]
<font color='red'>stm32</font>之备份寄存器(BKP)应用(侵入检测中断)
stm32 Ctext-M3内核最简单的多任务RTOS
RTOS 实时操作系统,我做的是一个多任务的操作系统,可以同时运行多个任务,我这里设置的最大任务数是32个, 估计跑30多个任务的嵌入式设备很少吧,32个任务够用了。 OS我把它叫做HesOS,主要功能如下,比较简单。 1--实现多任务调度 2--实现任务调度锁 3--实现临界区保护 4--实现读取cpu使用率(这个功能比较重要的) 5--实现us延时(用于模拟如IIC总线模拟) 对于一般的嵌入式应用有这些功能,差不多够用了。 移植HesOS也非常简单,不会像其它的OS一样比较庞大,修改的地方也比较多,使用起来也复杂。 HesOS不管是移植和使用都是非常简单的,类似于PC的线程使用。 主
[单片机]
<font color='red'>stm32</font> Ctext-M3内核最简单的多任务RTOS
STM32芯片开发之添加外置NOR FALSH扩展代码空间
网上查了很多资料,但都很零碎不是很完整,这里我系统总结一下从0开始建立一个使用外部NOR Flash的程序的方法。 Nor Flash是通过FSMC总线可以直接读写的Flash存储器,掉电不丢失,相比NandFlash成本高,容量小,但可以作为程序存储器使用,即可以直接在NorFlash上执行代码,NandFlash虽然也可以执行代码,在至少在STM32中是不支持的,可能ARM7都是不支持的。 STM32本身Flash容量较小,不能建立大型项目,或者在代码中有大量数据时就不够用了,至少在我一直STemWin时就不能全开所有的Demo程序,很不爽。当然你将数据存储在SD卡或Flash中在通过修改代码实现数据的读取,但中会有直
[单片机]
关于STM32 利用IO口模拟串口实现数据通信
网上有好多关于利用IO口来实现串口数据收发的实例,这种方法的实质都是可以应用于任何一款微处理器上,而不仅仅局限于stm32。有相关的源代码链接参考: https://github.com/TonyIOT/SoftWareSerial 当然,如果成本要求不高,可以利用串口扩展芯片是最方便的,如CH438,WK系列芯片等。 IO口模拟串口的一些基本原理,阐述如下: STM32单片机一般少则3个串口,多则5个,而项目还偏偏5个硬件串口还是不够用.板子上有几个预留IO口,可以用来模拟串口. 模拟串口一般都选9600,速度最快试了也才19200,所以限制还是较多的,一般不得以情况下才会用到. IO口模拟串口的思路也比较简单,
[单片机]
stm32 mmc卡扫描指定文件夹下的所有文件 串口输出(文件名长度有限制)
硬件环境:神州一号开发板 软件环境:mdk 1、sd卡初始化 2、f_mount 3、扫描函数如下: #define _USE_LFN 0 FRESULT scan_files (char* path) { FRESULT res; FILINFO fno; DIR dir; int i; char *fn; #if _USE_LFN static char lfn ; fno.lfname = lfn; fno.lfsize = sizeof(lfn); #endif res = f_opendir(&dir, path); if (res == FR_OK) { i = strl
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved