使用STM32CUBEMX生成FatFS代码,操作SPI FLASH

发布者:温柔浪漫最新更新时间:2018-09-16 来源: eefocus关键字:STM32CUBEMX  FatFS代码  操作SPI  FLASH 手机看文章 扫描二维码
随时随地手机看文章

首先配置SPI,我的板子是SPI2连接到SPI FLASH 上,我的flash是W25Q64, PB12用来当CSN。

接下来配置FATFS,这里选择用户定义的。

配置FATFS的时候要注意,由于SPI FLASH 的sector是4096字节的,故需要设置sector的大小为4096,其余选项根据自己情况配置。

配置好了生成代码和工程。记得把堆栈尺寸调大一些。我用IAR这样配置:

接着把SPI FLASH的读写操作实现:读一个sector和写一个sector。我写好的函数叫做W25_WriteSector和W25_ReadSector. 然后定义好常量:

#define PAGE_SIZE       256

#define SECTOR_SIZE     4096

 

#define SECTOR_COUNT 200

#define BLOCK_SIZE 65536

#define FLASH_PAGES_PER_SECTOR SECTOR_SIZE/PAGE_SIZE

下一步打开user_diskio.c 文件,填充几个函数。


/**

  * @brief  Reads Sector(s) 

  * @param  pdrv: Physical drive number (0..)

  * @param  *buff: Data buffer to store read data

  * @param  sector: Sector address (LBA)

  * @param  count: Number of sectors to read (1..128)

  * @retval DRESULT: Operation result

  */

DRESULT USER_read (

BYTE pdrv,      /* Physical drive nmuber to identify the drive */

BYTE *buff,     /* Data buffer to store read data */

DWORD sector,   /* Sector address in LBA */

UINT count      /* Number of sectors to read */

)

{

  /* USER CODE HERE */

  UINT i = 0;

  for(i = 0; i < count; i ++)

  {

    W25_ReadSector(sector, buff);

    sector ++;

    buff += SECTOR_SIZE;

  }

  return RES_OK;

}


/**

  * @brief  Writes Sector(s)  

  * @param  pdrv: Physical drive number (0..)

  * @param  *buff: Data to be written

  * @param  sector: Sector address (LBA)

  * @param  count: Number of sectors to write (1..128)

  * @retval DRESULT: Operation result

  */

#if _USE_WRITE == 1

DRESULT USER_write (

BYTE pdrv,          /* Physical drive nmuber to identify the drive */

const BYTE *buff,   /* Data to be written */

DWORD sector,       /* Sector address in LBA */

UINT count          /* Number of sectors to write */

)

  /* USER CODE HERE */

  UINT i = 0;

  for(i = 0; i < count; i ++)

  {

    W25_WriteSector(sector, buff);

    sector ++;

    buff += SECTOR_SIZE;

  }

  return RES_OK;

}

#endif /* _USE_WRITE == 1 */


/**

  * @brief  I/O control operation  

  * @param  pdrv: Physical drive number (0..)

  * @param  cmd: Control code

  * @param  *buff: Buffer to send/receive control data

  * @retval DRESULT: Operation result

  */

#if _USE_IOCTL == 1

DRESULT USER_ioctl (

BYTE pdrv,      /* Physical drive nmuber (0..) */

BYTE cmd,       /* Control code */

void *buff      /* Buffer to send/receive control data */

)

{

  DRESULT res = RES_OK;

  

  switch(cmd)

  {

    case CTRL_SYNC :

        break;

 

    case CTRL_TRIM:

        break;

    case GET_BLOCK_SIZE:

*(DWORD*)buff = BLOCK_SIZE;

break;

    case GET_SECTOR_SIZE:

*(DWORD*)buff = SECTOR_SIZE;

        break;

    case GET_SECTOR_COUNT:

*(DWORD*)buff = SECTOR_COUNT;

break;

    default:

res = RES_PARERR;

break;

    }

  

  return res;

}

#endif /* _USE_IOCTL == 1 */


这些函数填充好,就可以用FATFS了。对于一个新的SPI FLASH,先挂载f_mount,再格式化文件系统f_mkfs,之后就可以做各种新建文件、读写操作了。

补充一个,在fatfs.c 文件中,定义了这样一个:


char USER_Path[4];  /* USER logical drive path */


之后我们可以在main或者其他文件里用extern声明它,mount和mkfs时的USER_Path都是它。

附上我的测试代码


void mount_disk(void)

{

  uint8_t res = f_mount(&fs, USER_Path, 0);

  if (res != FR_OK)

  {

    printf("FAILED: %d\n",res);

   return;

 }

  printf("MOUNT OK\n");

}

 

void format_disk(void)

{

  uint8_t res = 0;

      

  printf("PROCESSING...\n");

  res = f_mkfs(USER_Path, 1, 4096);

  if (res == FR_OK)

  {

    printf("OK!\n");

  }

  else

  {

    printf("failed with: %d\n",res);

  }

}

 

void create_file(void)

{

  FIL file;

  FIL *pf = &file;

  uint8_t res;

  res = f_open(pf, "0:/test.txt", FA_OPEN_ALWAYS | FA_WRITE);

  if (res == FR_OK)

  {

    printf("creat ok\n");

  }

  else

  {

    printf("creat failed\n");

    printf("error code: %d\n",res);

  }

  

  f_printf(pf, "hello fatfs!\n");

  

  res = f_close(pf);

    if (res != FR_OK)

    {

      printf("close file error\n");

      printf("error code: %d\n",res);

    }

}

 

void get_disk_info(void)

{

FATFS fs;

FATFS *fls = &fs;

FRESULT res;

DWORD fre_clust;

 

res = f_getfree("/",&fre_clust,&fls);         /* Get Number of Free Clusters */

if (res == FR_OK) 

{

                                            /* Print free space in unit of MB (assuming 4096 bytes/sector) */

        printf("%d KB Total Drive Space.\n"

               "%d KB Available Space.\n",

               ((fls->n_fatent-2)*fls->csize)*4,(fre_clust*fls->csize)*4);

}

else

{

printf("get disk info error\n");

printf("error code: %d\n",res);

}   

}

 

void read_file(void)

{

  FIL file;

  FRESULT res;

  UINT bw;

  uint8_t rbuf[100] = {0};

  

  res = f_open(&file, "0:/test.txt", FA_READ);

  if (res != FR_OK)

  {

    printf("open error: %d\n",res);

    return;

  }

  f_read(&file, rbuf, 20, &bw);

  printf("%s\n", rbuf);

  

  res = f_close(&file);

  if (res != FR_OK)

  {

     printf("close file error\n");

     printf("error code: %d\n",res);

  }

}


关键字:STM32CUBEMX  FatFS代码  操作SPI  FLASH 引用地址:使用STM32CUBEMX生成FatFS代码,操作SPI FLASH

上一篇:STM32CubeMX基于SD卡的FATFS文件系统测试
下一篇:STM32F4中USB与PC双向通信

推荐阅读最新更新时间:2024-03-16 16:14

STM32CubeMX系列教程4:PWM
1.PWM简介 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调试。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。 例如上图中,图b)是微处理输出的数字信号,实际上他接到电机等功率设备上时,效果相当于图a)。这就是PWM调制。例如输出占空比为50%,频率为10Hz的脉冲,高电平为3.3V.则其输出的模拟效果相当于输出一个1.65V的高电平。脉冲调制有两个重要的参数,第一个就是输出频率,频率越高,则模拟的效果越好。第二个就是占空比。占空比就是改变输出模拟效果的电压大小。占空比越大则模拟出的电压越大。 2.
[单片机]
<font color='red'>STM32CubeMX</font>系列教程4:PWM
供不应求格局不变,第三季 NOR Flash 价格将继续上涨
电子网消息,集邦咨询半导体研究中心(DRAMeXchange)最新研究指出,受到智能手机 AMOLED 的新增需求、触控 IC 以及驱动 IC 整合单芯片带动的 NOR Flash 需求的影响,再加上全球 NOR Flash 的每月投片仅约 8.8 万片,高度客制化与产能不易扩张,供不应求的格局将持续,预估第三季 NOR Flash 价格将上涨两成。 DRAMeXchange 研究协理吴雅婷指出,观察全球 NOR Flash 供给状况,如赛普拉斯半导体等国际大厂已经确定逐步淡出 NOR Flash 市场,将专注车用和工规市场,另外,国际大厂出售8寸厂的动作也将影响整体 NOR Flash 市场的供应。另一方面,属于中资的兆易创
[半导体设计/制造]
纯固态Flash激光雷达即将量产
5月13日,亮道智能面向中国市场发布自研的纯固态Flash激光雷达——LDSense Satellite。根据企业介绍,这是一款用于侧向补盲的激光雷达,计划在2023年下半年量产。 在此之前,2021年11月,Ouster也发布了DF(Digital Flash)系列固态激光雷达,并计划在2025年量产上车。 此外,北科天绘、镭神智能、北醒光子等激光雷达厂商,也在布局Flash激光雷达,预计未来几年会有越来越多的产品落地。 01 Flash激光雷达的优势 如果按照扫描方式来划分,激光雷达的技术演进路线可以分为:机械式到半固态再到纯固态三个阶段。 半固态激光雷达又可以分为三个技术路径:MEMS、棱镜和转镜,
[汽车电子]
纯固态<font color='red'>Flash</font>激光雷达即将量产
STM32用keil5调试程序出现 Error:Flash Download Failed-"Cortex-M3"解决方案
一 目的:装好keil MDK 想用 在线调试 二 背景:开发环境 keil MDK 422 三 准备: 1 keil MDK 安装文件夹ARMSegger里是否有三个动态连接表 2 程序编译通过 3 jlink驱动安装好(我安装的是408版本) 四 操作步骤: 1 2 3 5 然后一路OK过去 就可以了。 6 点 进入到在线调试届满 进行调试。 注:如果没有进行第五步(根据芯片选择flash容量)会报错 Error: Flash download failed- Cortex-M3 。 、、、、、、、、、、、、、、、、、、
[单片机]
STM32用keil5调试程序出现 Error:<font color='red'>Flash</font> Download Failed-
外挂Flash的TMS320VC5409引导装载设计
TI的5000系列DSP提供多种引导装载模式,主要包括HPI引导装载、串行EEPROM引导装载、并行引导装载、串行口引导转载、I/O口引导装载等,其中使用Flash的并行引导装载是最常用的一种,使用该种方法可以尽快地开发出样机,是加快开发进度的首选。以下将详细介绍并行引导装载的过程,其它引导过程可参考TI公司有关Bootloader的技术资料。 1 Bootloader分析 TI公司的DSP芯片出厂时,在片内ROM中固化有引导装载程序Bootloader,其主要功能就是将外部的程序装载到片内RAM中运行,以提高系统的运行速度。 TMS320VC5409是TI公司的一款定点DSP芯片,其指令周期可达10ns,片内有32K
[嵌入式]
基于MC9S08QG4的烟雾传感器应用设计
  在消防安全报警系统中, 烟雾传感器 设计的主要要求为:低功耗,低成本,高可靠性。飞思卡尔半导体推出的MC9S08QG4的具有高集成度、高性能,低功耗,高性价比和优异的可靠性,非常适合用于烟雾 传感器 的设计。   图1表示了烟雾传感器的一般结构。环路中的每一只烟雾传感器都具有唯一的地址编码。   MC9S08QG4特性及片上资源   ·20MHz HCS08 CPU ,支持高效C语言编程。   ·4 KB FLASH ,256 字节RAM。   ·内部时钟源可以以0.2%的分辨率调整。   ·12个功能丰富的双向通用I/O,1个输入和1个输出端口。   ·8通道10位 ADC 具有转换结果自动
[单片机]
u-boot在s3c2410研发板上移植(NAND Flash Boot)过程
这篇文章对于我的U-Boot移植起了重要作用,阐述了U-Boot从NAND Flash启动需要做的修改,但是其做法并不是完全正确(只是个人意见)。在这里谢谢 Bekars涡轮增压 !! 这篇文章转载自他的博客:http://blog.csdn.net/bekars/archive/2006/05/06/710888.aspx 1)u-boot版本1.1.3,gcc version 3.3.3 (DENX ELDK 3.1.1 3.3.3-9) 2)在Makefile中加入 bks2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t bks2410 NULL s3c
[单片机]
SPI串行Flash在数据
    摘要: 介绍单片机的低功耗设计技术特点及单片机应用系统中的低功耗设计要注意的几个问题,并列举了充分利用片内资源实现低功耗及C语言源程序。     关键词: 单片机 低功耗 设计 随着集成电路技术和工艺的飞速发展,真正单片化的单片机已经成为主流产品。它的绝在部分资源都在单片机芯片内部;过去需要用外部扩展器件才能实现的功能,如ROM、RAM、A/D、D/A、数字量I/O、显示驱动等功能,现在在单片机内部就可以完成。单片机真正单片化,省去了大量的硬件开发调试工作,大大地提高了工作效率;系统先天的可靠性、抗干扰能力得到了显著的改善。经实验测试,实现同样功能的系统,采用单片方式比总线扩展方式具有更多的优点。系统
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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