stm32 CubeMx 怎么实现SD卡sd nand FATFS读写测试
本实验仅用于记录和分享技术经验若涉及侵权请联系我删除。
stm32 CubeMx 实现SD卡/sd nand FATFS读写测试。
材料:stm32F407ZGT6开发板、雷龙公司的SD_NAND 测试板(CSNP1GCR01-AOW)。(一开始是使用 Nandflash的操作起来不太方便而且 stm32cubemx自带的 fatfs还没有磨损平衡算法,很是难受。)
CSNP1GCR01-AOW的优势:
不用写驱动程序自带坏块管理的NAND Flash(贴片式TF卡),尺寸小巧,简单易用,兼容性强,稳定可靠,固件可定制,LGA-8封装,标准SDIO接口,兼容SPI/SD接口,兼容各大MCU平台,可替代普通TF卡/SD卡,尺寸6x8mm毫米,内置SLC晶圆擦写寿命10万次,通过1万次随机掉电测试耐高低温,支持工业级温度-40°~+85°,机贴手贴都非常方便,速度级别Class10(读取速度23.5MB/S写入速度12.3MB/S)标准的SD 2.0协议使得用户可以直接移植标准驱动代码,省去了驱动代码编程环节。支持TF卡启动的SOC都可以用SD NAND,提供STM32参考例程及原厂技术支持,主流容量:128MB/512MB/4GB/8GB,比TF卡稳定,比eMMC便宜,样品免费试用(可到官网找客服小姐姐领取样品哦)。雷龙官网
话不多说开始正文:
stm32cubeMX 版本:6.6.1
MDK5 版本5.35
开始配置STM32
1、 配置时钟:
系统时钟树配置(我这里直接拉满,实际使用根据功耗要求作相应的调整)
2、 配置调试接口
注意DEBUG这个一定要配置,如果是默认的那下载一次程序之后第二次就下载不进去了.
3、配置SDIO:
(我这里还是用了DMA 减少mcu的资源开销)
配置完成之后随便选一个IO口作为SD_NAND的插入检测引脚(没有检测脚的也选上不然在生成代码的时候会有警告,看着很不舒服,我这里选的是 PE4 引脚)
4、配置SDIO的DMA
5、添加文件系统
6、配置堆栈大小(稍微调大一点,不然在读写大一点的数据的时候可能会出错)
7、生成代码
8、生成代码后在 bsp_driver_sd.c这个文件中将这三行代码注释(这是检测SD卡是否接入的引脚 如果不注释在挂载sdnand的时候会提示 not_ready)
9、在main.c中 添加测试代码
*//* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include "main.h"#include "dma.h"#include "fatfs.h"#include "sdio.h"#include "gpio.h"/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD */FATFS fs; /* FatFs 文件系统对象 */FIL file; /* 文件对象 */FRESULT f_res; /* 文件操作结果 */UINT fnum; /* 文件成功读写数量 */BYTE ReadBuffer[1024] = {0}; /* 读缓冲区 */BYTE WriteBuffer[] = /* 写缓冲区 */"This is STM32 working with FatFs\r\n";/* USER CODE END PTD *//* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *///HAL_SD_CardInfoTypeDef SDCardInfo;//HAL_SD_CardCIDTypeDef SDCard_CID;/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/void SystemClock_Config(void);/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/int main(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_SDIO_SD_Init();MX_FATFS_Init();/* USER CODE BEGIN 2 */f_res = f_mount(&SDFatFS, "0:/",1);HAL_Delay(100);if(f_res == FR_NO_FILESYSTEM){f_res = f_mkfs("0:/",FM_FAT|FM_SFD,0,&ReadBuffer,sizeof(ReadBuffer));//格式化SDNANDHAL_Delay(100);if(f_res == FR_OK){f_res = f_mount(NULL,"0:/",1);//取消挂载f_res = f_mount(&SDFatFS, "0:/",1);//重新挂载}}HAL_Delay(100);//写测试--------------------------------------------------------------------f_res = f_open(&SDFile,"helloWorld.txt",FA_CREATE_ALWAYS|FA_WRITE);HAL_Delay(100);f_res = f_write(&SDFile,WriteBuffer,sizeof(WriteBuffer),&fnum);HAL_Delay(100);f_res = f_close(&SDFile);//读测试--------------------------------------------------------------------f_res = f_open(&SDFile,"helloWorld.txt",FA_OPEN_EXISTING | FA_READ);HAL_Delay(100);if(f_res == FR_OK){f_res = f_read(&SDFile,ReadBuffer,sizeof(ReadBuffer),&fnum);}HAL_Delay(100);f_res = f_close(&SDFile);HAL_Delay(100);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */}/* USER CODE END PTD */配置没问题的程序运行后则可以将 sdnand测试板 插入到读卡器中,读卡器再接到电脑上则就会出现:
打开文件则会出现
至此大功告成!!!!!
需要注意的是最新版的fatfs 文件系统中
FRESULT f_mkfs (const TCHAR* path, /* Logical drive number */BYTE opt, /* Format option */DWORD au, /* Size of allocation unit [byte] */void* work, /* Pointer to working buffer */UINT len /* Size of working buffer */)f_mkfs 这个函数有五个参数,老版本的只有三个参数
所以在格式化的时候得这么来操作
f_res = f_mkfs("0:/",FM_FAT|FM_SFD,0,&ReadBuffer,sizeof(ReadBuffer));CubeMX 新建工程详细步骤
1.MPU/CPU 选择
step1: 打开CubeMX 软件, 在主页面上 点击如下按钮,进入芯片选择界面
step2: 在Part Number Search 栏搜索我们需要用到的芯片型号,比如这里我们选择 STM32F103C8
选中某一型号时,会在页面右边显示该芯片的详细参数和信息,其中 Features 可以查看该芯片的具体特点和外设, 还可以点击Datasheet 下载数据手册
在芯片选择页面的右下方有芯片的信息概要,比如这里包括该型号芯片的 引脚疯转,Flash, Ram, IO 数量, 主频等基本信息
确定了芯片型号之后,双击上图中我们选择的芯片,进入工程配置界面
2.片内外设配置
在工程配置页面中有外设配置,时钟配置,和工程配置。这里我们先讲解如何配置这些片内外设
CubeMX STM32所有外设都进行了分类,比如这里的 STM32F103C8T6 的所有外设就被分成了一共5类:
1)系统内核
2)模拟类
3) 定时相关
4) 通信相关
5) 中间件
上面的片内外设用户需要根据自己项目的使用情况而进行选择配置,但是对于绝大部分的项目来说 1)系统内核 中的 RCC&SYS 项都必须要进行设置
RCC配置,如果需要用 LSE / HSE 就需要在这进行配置
SYS配置, 关于 debug 口子的配置,默认它是认为我们不需要 debug 口的,所以如果不更改的话生成代码下载进去后 debug 口就关闭了
所以一般这里需要修改为 JTAG(4pin)
注意 : STM32CubeMX 使用的 HAL 库有一个 delay 接口默认是使用 SysTick 定时器来实现的,如果我们选用了 FreeRTOS,它使用的心跳时钟在 Cortex 内核上的移植都是依赖于 SysTick 定时器,
这里就会有冲突,这一点在点击生成代码按钮时 STM32CubeMX 也会发出警告,这里最好就把 HAL 库定时器使用的时基修改为 TIMER1 - TIMER4中的任一就行
3.时钟配置
step1:
选中时钟配置栏,进入时钟配置界面
首先我们在这里对单片机的系统时钟源做一个简单的解释,对于STM32来说总共有4个时钟源。
STM32的四个时钟源高速外部时钟(HSE):外部时钟源,晶振频率可取范围为4~16MHz,我们一般采用8MHz的晶振。低速外部时钟(LSE):外部时钟源,主要提供给实时时钟模块,所以一般采用32.768KHz。高速内部时钟(HSI):由内部RC振荡器产生,频率为8MHz,但不稳定。低速内部时钟(LSI):由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40KHz。
对于单片机的系统主时钟。我们一般选用高速时钟 HSE或者HSI(系统默认), 上图中时钟配置为 HSE,HSE时钟配置流程主要分为以下几步
1)HSE直接分频后作为 PLL Source Mux选择器的输入 ,
2)之后通过锁相环 9倍频 后输入到 System Clock Mux
3) System Clock Mux 直接输出得到系统主时钟 SYSCLK 72Mhz
4) SYSCLK 经过分频器得到高速时钟 HCLK (这里分频系数为1 所以HCLK也为72MHZ)
5) HCLK 后面又分为了5条路径
a.直接作为 AHB总线时钟,作为 内核,内存,DMA等的时钟
b. 分频后作为 Cortex 系统定时器的时钟源
c.直接作为 FCLK时钟
d.分频后作为 APB1总线的时钟 (包括分频后 作为APB1外设时钟 也叫做PCLK1 , 分频后再倍频作为 APB1总线上定时器的时钟)
e.分频后作为 APB2总线的时钟 (包括分频后作为APB2外设时钟 也叫做PCLK2, 分频后再倍频作为APB2总线上定时器的时钟, 以及分频后再分频作为ADC的时钟)
通过上面配置就完成了从 HSE 到 系统主时钟全部过程的配置, 若板子上面没有提供外部高速晶振,我们就只有使用内部高速晶振了,其配置过程的原理也是类似的,这里就不再赘述了。
如果项目中还用到了 RTC,IWDG等外设,那就还需要另外配置低速时钟。至此我们时钟配置也就基本完成了。。。
另外列举了一些常用的时钟配置参数,设计时可以作为参考:
1. STM32F407VETx 选择 外部高速时钟 HSE时,需要设置的具体参数
4.工程管理器
最后我们通过工程管理器 Project Manager 来对整个CubeMx工程来进行最后的配置
STM32CubeMX的 Project Manager工程管理器包含:
Project 工程管理、
Code Generator 代码生成、
Advanced Settings 高级设置。
4.1 Project
Project工程管理包含三部分内容:
Projcet Settings工程设置、
Linker Settings堆栈设置、
Mcu and Firmware Package MCU和固件包信息。
4.1.1 Project Setting
A.Project Name:工程名称 比如:Demo.uvprojx,以及对应工程里面目标名称。
B.Project Location:工程存放路径 这个容易理解。如:D:\Desktop\Test.
C.Application Struture:应用程序结构 这里包含两个选项:Basic 和 Advanced。Basic:是基础的结构,一般不包含中间件(RTOS、文件系统、USB设备等)。Advanced:相反就是包含中间件,一般针对相对复杂一点的工程。当然,这两种生成的结构都比较基础,一般实际项目都会重新整理一遍软件架构。
D.Toolchain Folder Location:工具链文件夹路径 这个是根据上面Project Name和Project Location得出来的,用户不能修改。
E.Toolchain/IDE:工具链选择 ·EWARM V7 和 V8·MDK-ARM V4 和 V5·TrueSTUDIO·SW4STM32·Makefile·其它
4.1.2 Linker Setting
这里的选项一看就明白,主要就是堆和栈大小的设置,默认缺省值:Heap堆为0x200,Stack栈为0x400 .
4.1.3 Mcu and Firmware Package (MCU和固件包信息)
这里有三个选项,关于MCU类型和固件包版本信息,一般默认配置。
A.Mcu Reference:MCU参考型号 这个是根据你选择的MCU型号决定的,用户不能修改。
B.Firmware Package Name and Version:固件包名称和版本信息 这个容易理解,如:STM32Cube_FW_F1_V1.7.0C.Use Default Firmware Location:使用默认固件包 这里勾选上就会根据系统进行默认匹配固件包,一般建议默认。当然,不勾选,可以自己选择指定固件包。
4.2 Code Generator
如上图,主要包含四项内容:固件包拷贝、生成文件、HAL设置、模板设置 。
4.2.1 STM32Cube Firmware Library Package固件包拷贝
1.Copy all used libraries into the project folder 将所有使用过的库复制到项目文件夹中 不管你用,还是没有用到,都拷贝到你工程目录下。这样一来,你工程下文件就比较多。2.Copy only the necessary library files 只复制必要的库文件。 这个相比上一个减少了很多文件。比如你没有使用CAN、SPI...等外设,就不会拷贝相关库文件到你工程下。3.Add necessary library files as reference in the toolchain project configuration file 在工具链项目配置文件中添加必要的库文件作为参考。 这里没有复制HAL库文件,只添加了必要文件(如main.c)。相比上面,没有Drivers相关文件。
4.2.2 Generated files 生成文件
这里可以多选,每项可选择:是or不是。
1.Generate peripheral initialization as a pair of'.c/.h' files per peripheral 每个外设生成独立的'.c/.h'文件 不勾:所有初始化代码都生成在main.c勾选:初始化代码生成在对应的外设文件。 如UART初始化代码生成在uart.c中。
2.Backup previously generated files when re-generating 在重新生成时备份以前生成的文件 重新生成代码时,会在相关目录中生成一个Backup文件夹,将之前源文件拷贝到其中。
3.Keep User Code when re-generating 在重新生成时保留用户代码 比如:我在main.c中添加了一段代码,重新生成时,会在main.c中保留你之前自己添加的这段代码。注意:前提是这段代码写在规定的位置。也就是BEGIN和END之间。否则同样会删除。
4.Delete previously generated files when not re-generated 删除以前生成,但现在没有生成的文件 比如:之前生成了spi.c,现在重新配置没有spi.c,则会删除之前的spi.c文件
4.2.3 HAL Settings HAL库设置
1.Set all free pins as analog (to optimize the power consumption) 将所有空闲引脚设置为模拟(以优化功耗) 这个做低功耗产品时这个选项有必要勾选。2.Enable Full Assert 使能所有断言
4.2.4 Template Settings模板设置
1.Select a template to generate customized code
选择一个模板来生成自定义代码代码自定义生成模板可以参看最新(V28版)用户手册6.3节 Custom code generation内容。
4.3 Advanced Settings
目前暂时只有两个选项:驱动选择和调用函数设置
4.3.1 驱动选择
目前主要就是针对工程中使用到的外设,选择HAL还是LL驱动(参看上图)。 提示:目前有些型号MCU的部分外设没有LL驱动。
4.3.2 调用函数
主要关心后面两个选项:Not Generate Function Call 和 Visibility (Static)。
a. Not Generate Function Call不生成函数调用 也就是你代码不调用对应初始化函数。比如:你GPIO项勾选Not Generate Function Call,你main.c函数中就不会调用MX_GPIO_Init这个函数。
b. Visibility (Static)可见性(静态) 这个就是初始化代码声明为static。
注意:A.有些选项是是默认值,不能修改。如SystemClock_Config配置不声明为ststic.
B.使用static是配合上面Code Generator代码生成章节中Generated files生成文件使用。如果都生成.c .h独立文件了,就不会生成static了。
相关问答
stm32F103如何将存储在外部 flash 中的程序移到sram中运行?如果是要去读外部ADC芯片数据的话,很快的方法就是使用STM32CubeMX软件,选择对应的芯片,将你的ADC芯片的引脚连接到芯片上对应的硬件协议上,如IIC、SPI等,然...
keil5如何通过仿真器将程序烧录?keil5通过仿真器将程序烧录需要准备开发板,随后就使用mdk目录,并将STM32F10x_M25P64文件夹拷贝一份并改名为STM32F10x_W25Q32,打开工程,打开option选项设置界.....
hip-hop和hiphop的区别?例句:Hip-hopisanindicationoftheconditionsinimpoverishedareasasbluesmanRobertJohnson'...
如何自学stm32?要想学好STM32,不仅仅需要学好程序设计,还要具备一定电子电路的知识,不需要太深,对上拉、下拉电阻,LED灯、三极管这些有一个基础的认识就行。其次就是要对C...S...
华为公布“华为公司十大发明”,你最看好哪个?发明二、全光交叉华为OXC(OpticalCross-Connect)全光交叉解决方案基于全光背板、高密器件集成、硅基液晶ADWSS等自研核心技术,实现单框“P”级别交换容量,构...
...swaythroughanicecube.Waterfromthesurfacedripsdownt_作业帮[回答]答案:1C2D3A4A解析:1.C。本文主要谈论的是冰洞的起源。第一段介绍了冰洞的外观。第二段和第三段则主要介绍了人们对冰洞形成的一些假设。2...
...aythroughanicecube.Waterfromthesurfacedripsdownthr_作业帮[回答]答案:1C2D3A提示:1.这篇文章主要说的是洞穴里的冰冻是如何形成的2.参看文章第三段3.文章最后一段提到美国人用冰来冷冻食物答案:...
流媒体和普通web服务器有什么不同-ZOL问答web服务器能播放不是服务器可以播放,而是服务器支持了如flash这样视频解码,就是...开发技术有很多能做;比如java、.net、php等得;有用(0)回复servlet是JAVA的...
访问FTP服务器有哪几种方式?-ZOL问答访问FTP服务器有两种方式:一种访问是注册用户登录到服务器系统,另一种访问是用“隐名”(anonymous)进入服务器。有用(0)回复dsueletilfsc您好,非常遗憾...
嘻哈曲风有哪些?怎么分辨?按照地域来区分会好一点东岸嘻哈(EastCoastHip-Hop)代表歌手有:最早的一些比如DJKoolHerc,GrandmasterFlash,AfrikaBambaataa,the...