如何使用CubeMx制作一个基于SD卡的文件系统工程

发布者:星辰耀眼最新更新时间:2016-12-27 来源: eefocus关键字:CubeMx  SD卡  文件系统工程 手机看文章 扫描二维码
随时随地手机看文章

1 前言

本文将介绍使用CubeMx工具从零开始制作一个基于SD卡的文件系统,以便后续使用此功能者参考。

2 准备工作

本文工程得测试将以STM3240G-EVAL这个ST官方的评估板为测试平台,所有这块板子的一些外部组件连接方式有必要先了解一下。

LED电路 
按键电路 
LED1~LED4分别使用管脚PG6,PG8,PI9,PC7,输出高电平LED灯点亮,用户按键使用PG15管脚,按下时为低电平。 
HSE电路 
SD卡电路 
如上图,MCU使用的HSE是25M晶振。SD卡使用STM32F407固定的6个管脚如上图所示D0(PC8),D1(PC9),D2(PC10),D3(PC11),CLK(PC12), CMD(PD2). SD卡插入检测脚为用户自定义的管脚,在STM3240G这块ST官方的评估板上是使用PH13管脚。

3 创建CubeMx工程与代码修改

3.1 创建CubeMx工程

打开CubeMx创建一个基于STM32F407IGHx的工程,使能RCC的HSE,外部晶振模式,SDIO使用4位总线宽度,如下图所示: 
RCC 
SDIO 
并在pinout右边将PH13设置为INPUT模式: 
pinout 
接来下配置时钟树,将主屏配置为168M: 
clock tree
在配置页面下的配置如下图所示: 
configuration 
在中间件添加SD Card类型的FATFS: 
middleware 
在配置中的文件系统相关参数配置都使用默认参数值。 
另外一点非常重要的是,在工程设置内配置栈大小为0x800,默认的0x400是不够的,运行时会出错。如下: 
project setting 
最后点击生成代码。

3.2 SD卡和文件系统初始化部分

在main函数内有如下代码:

  MX_GPIO_Init();  MX_SDIO_SD_Init();  MX_FATFS_Init();12341234

SDIO初始化代码已经自动生成,不需要修改任何地方,进入到MX_FATFS_Init()函数内,在/* USER CODE BEGIN Init /与/ USER CODE END Init */内添加用户自定义代码,如下:

/* USER CODE BEGIN Variables */FATFS SDFatFs;/* USER CODE END Variables */ void MX_FATFS_Init(void)
{  /*## FatFS: Link the SD driver ###########################*/
  retSD = FATFS_LinkDriver(&SD_Driver, SD_Path);  /* USER CODE BEGIN Init */
  /* additional user code for init */
    if(f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0) != FR_OK)
    {      /* FatFs Initialization Error */
      Error_Handler();
    }    else
    {//      if(f_mkfs((TCHAR const*)SD_Path, 0, 0) != FR_OK)        //格式化SD存储卡//      {//          /* FatFs Format Error *///          Error_Handler();//      }
    }  /* USER CODE END Init */}12345678910111213141516171819202122232425261234567891011121314151617181920212223242526

如上代码,自己定义全局变量SDFatFs,以供后续代码需要用到。 
上面代码中在挂载SD卡后的注释掉的f_mkfs行是格式化SD卡,可以根据情况来是否需要格式化SD卡,这里选择不格式化。

3.3 文件系统与SDIO对接部分

文件系统与SDIO对接有些地方需要修改。 
打开bsp_driver_sd.c文件,找到BSP_SD_IsDetected函数,由于SD卡插入检测是通过用户定义的管脚来实现检测的(本例是通过PH13来检测的),因此,这里需要匹配下,在此函数内的/* USER CODE BEGIN 1 /与/ USER CODE END 1 */之间添加用户自己的代码:

uint8_t BSP_SD_IsDetected(void)
{
  __IO uint8_t status = SD_PRESENT;  /* USER CODE BEGIN 1 */
  /* user code can be inserted here */
  if(HAL_GPIO_ReadPin(SD_DETECT_GPIO_Port, SD_DETECT_Pin) != GPIO_PIN_RESET) //SD卡插入时为低电平
    {
        status =SD_NOT_PRESENT;
    }  /* USER CODE END 1 */     

  return status;
}123456789101112131415123456789101112131415

就这样,就移植好了,接来下是写测试代码。

3.4 测试文件系统

回到main函数,在/* USER CODE BEGIN 2 /与/ USER CODE END 2 */添加自己的文件系统测试代码,如下:

if(f_open(&MyFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK) //创建一个文件
    {        /* 'STM32.TXT' file Open for write Error */
        Error_Handler();
    }  else
  {
            res = f_write(&MyFile, wtext, sizeof(wtext), (void *)&byteswritten);//写入内容
            if((byteswritten == 0) || (res != FR_OK))
            {                /* 'STM32.TXT' file Write or EOF Error */
                Error_Handler();
            }            else
            {
                f_close(&MyFile); //关闭文件

                /*##-7- Open the text file object with read access ###############*/
                if(f_open(&MyFile, "STM32.TXT", FA_READ) != FR_OK) //再次打开文件
                {                    /* 'STM32.TXT' file Open for read Error */
                    Error_Handler();
                }                else
                {
                    res = f_read(&MyFile, rtext, sizeof(rtext), (UINT*)&bytesread);  //读出内容

                    if((bytesread == 0) || (res != FR_OK))
                    {                        /* 'STM32.TXT' file Read or EOF Error */
                        Error_Handler();
                    }                    else
                    {
                        f_close(&MyFile); //关闭文件

                /*##-10- Compare read data with the expected data ############*/
                if((bytesread != byteswritten))  //比较
                {                  /* Read data is different from the expected data */
                  Error_Handler();
                }                else
                {                  /* Success of the demo: no error occurrence */
                  HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
                }
                    }
                }
            }
  }1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515212345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

上述代码流程为:创建一个文件,写入内容,再关闭此文件,然后再次打开这个文件,读出内容,关闭文件,最后比较读出的内容是否为写入的内容,根据比较结果分别进行处理。

最后编译整个工程烧录到STM3240G-EVAL这块评估板上进行测试,运行结果是OK的。

4 结论

CubeMx还是相当强大的,将一个SD存储卡的文件系统通过几步设置就自动生成了工程,只需要掌握几处关键地方进行修改就能让这么一个看似很复杂的工程通过几步简单的步骤就完成了。CubeMx是一个非常强大的工具,此文最关键的参数就栈大小设置为0x800,没碰到过的人需要花很长时间才会发现这个问题,所以再次强调下。

最后附上代码工程下载链接地址: 
http://download.csdn.net/detail/flydream0/9649702


关键字:CubeMx  SD卡  文件系统工程 引用地址:如何使用CubeMx制作一个基于SD卡的文件系统工程

上一篇:STM32F0xx在增加IAP后APP为什么在main函数中要重映射SRAM
下一篇:STM32L152的低功耗测试

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

第二节: 外部中断学习(用CubeMX学习STM32)
前言: 关于中断简单介绍 中断的流程: 中断流程图: 中断方式传送数据具有可以有效提高单片机工作效率, 适合于实时控制系统等优点, 相对于查询方式更为常用。 当CPU处理某件事情的时候, 外部发生的某一事件(如电平的改变、脉冲边沿跳变、定时器/计数器溢出等)请求CPU迅速处理, 于是CPU暂时中断当前的工作, 转去处理发生的事件。 处理完该事件后, 再回到原来中断处, 继续工作。 这样的过程称为中断 上图为中断流程图 这个中断的概念是不是有点晦涩难懂? 主要是这个是书上的内容, 所以不是很形象. 我再解释一遍:想象一个场景, 1、当有一天你正在和川建国同志吃饭(你和他吃饭这个事情就是主程序); 2、突然有个电话打给
[单片机]
第二节: 外部中断学习(用<font color='red'>CubeMX</font>学习STM32)
STM32的CubeMX关于串口中断
1、关于串口的初始化函数: MX_USART2_UART_Init()---波特率、奇偶校验等配置 HAL_UART_Init()---会将 huart- RxState = HAL_UART_STATE_READY; HAL_UART_MspInit()---GPIO,中断优先级等配置 2、当需要使用中断接收时需要调用 HAL_UART_Receive_IT()---配置接收的缓冲区指针,数量,huart- RxState = HAL_UART_STATE_BUSY_RX;,最后使能相应中断 3、当中断发生时,执行 HAL_UART_IRQHandler()--判断中断的类
[单片机]
STM32的<font color='red'>CubeMX</font>关于串口中断
STM32F767cubemx开发手记(1) 跑马灯
绪论 stm32的寄存器比较多,难于记忆,所以官方封装了两套库函数。一个是标准库,不过在F7上官方没有更新,以后可能不再维护了。另一个则是HAL库,HAL库的程序可移植性比较高,而且基本上不用和寄存器打交道,不懂硬件的小白也可以轻松学习。 由于用的正点原子的stm32F767,正点原子用的mdk5的方式新建工程,不是特别喜欢。加上现在关于HAL库的中文资料较少,不过原子,野火,硬石,微雪而已。而用Cubemx来开发F7甚至关于stm32移植的更是少之又少。当然折腾也是必不可少的了,我决定用stm32cubeMx + sw4stm32的方式开发,由于技术不熟个别地方可能还是会用到mdk5,还望谅解。 下边就详细讲解下关于stm32
[单片机]
STM32F767<font color='red'>cubemx</font>开发手记(1) 跑马灯
STM32CubeMX生成基于Eclipse的GCC工程(二)移植FreeRTOS操作系统
通过Freertos操作系统是小灯闪烁: 进入STM32Cube工程中,使能FREERTOS 接下来对FreeRTOS配置,首先是参数配置: 接下来配置任务:名字为Task_Sled1,优先级为正常就可以,进入函数为Func_LED0。 生成代码,并拷贝到eclipse工程中,添加库路径: 在Func_LED0函数中加上小灯闪烁的程序,编译一下,会出现如下问题: 只要在freertos.c加一个#include stm32f2xx_hal_def.h 的头文件就好了,这回再编译并调试,全速跑,小灯会闪烁
[单片机]
STM32<font color='red'>CubeMX</font>生成基于Eclipse的GCC工程(二)移植FreeRTOS操作系统
STM32CubeMX系列教程4:PWM
1.PWM简介 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调试。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。 例如上图中,图b)是微处理输出的数字信号,实际上他接到电机等功率设备上时,效果相当于图a)。这就是PWM调制。例如输出占空比为50%,频率为10Hz的脉冲,高电平为3.3V.则其输出的模拟效果相当于输出一个1.65V的高电平。脉冲调制有两个重要的参数,第一个就是输出频率,频率越高,则模拟的效果越好。第二个就是占空比。占空比就是改变输出模拟效果的电压大小。占空比越大则模拟出的电压越大。 2.
[单片机]
STM32<font color='red'>CubeMX</font>系列教程4:PWM
STM32CubeMX图形化配置工具的安装教程
STM32CubeMX是STM32芯片图形化配置工具,通过简单的操作便能实现相关配置,省去了我们配置各种外设的时间,支持MDK、IAR For ARM、TrueStudio等多种工具。 安装CubeMX分三步: JRE(Java Runtime Environment) STM32CubeMX STM32的HAL固件库 这三部分资料可以在网盘上下载,链接及提取码如下: 链接:https://pan.baidu.com/s/1I-QRA4Cmc9K4FufRv4PsRw 提取码:stm3 安装JRE 因为STM32CubeMX是用JAVA开发的,所以需要JRE(Java运行时环境)。 在上文提供的网盘上有安装文件,把文件下载下
[单片机]
STM32<font color='red'>CubeMX</font>图形化配置工具的安装教程
stm32 CubeMx falsh应用
STM32CubeMx工具没有配置Flash应用。需用户调用库函数实现FLASH的擦除、读、写操作。 具体FLASH的擦除、读、写流程及具体配置详情需查看STM32 FLASH编程文档。 现贴出基于STM32CubeMX工具MDK建立的工程文档,实现的FLASH操作代码。 //读取指定地址的半字(16位数据) //faddr:读地址(此地址必须为2的倍数!!) //返回值:对应数据. uint16_t STMFLASH_ReadHalfWord(uint32_t faddr) { return *(uint16_t*)faddr; } //从指定地址开始读出指定长度的数据 //ReadAddr:起始地址 /
[单片机]
英特尔的Edison PC可能并没有SD卡那么小
    在今年 CES 的时候,英特尔拿出了只有 SD 卡大小,基于 Linux 并且支持蓝牙、Wi-Fi 的 Edison PC。此举当时引起了很大的轰动,但几个月后,情况似乎有了点小小的变化。据悉英特尔已经改换了初代 Edison 的设计方案,原本专用于可穿戴设备、物联网产品的 Quark SoC 被换下,取而代之的是常见于当下许多 Windows 平板、更传统一些的 Atom 芯片。 这样做的好处当然是有的,Atom 在连线能力等方面选择性更强,而且价格也更低。但要说不好的地方,最明显的一点就是尺寸大了,SD 卡那么小恐怕是做不到了。当然,英特尔仍在努力开发 Quark,只是将于今夏与大家见面的 E
[手机便携]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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