查看: 350  |  回复: 0
stm32 CubeMx 怎么实现SD卡/sd nand FATFS读写测试

主题

回复
发表于2024-01-09 17:59:40 | ip属地:广东 | 只看该作者
1# 电梯直达

  本实验仅用于记录和分享技术经验若涉及侵权请联系我删除。

  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、 配置时钟:

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  系统时钟树配置(我这里直接拉满,实际使用根据功耗要求作相应的调整)

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  2、 配置调试接口

  注意DEBUG这个一定要配置,如果是默认的那下载一次程序之后第二次就下载不进去了.

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  3、配置SDIO:

  (我这里还是用了DMA 减少mcu的资源开销)

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  配置完成之后随便选一个IO口作为SD_NAND的插入检测引脚(没有检测脚的也选上不然在生成代码的时候会有警告,看着很不舒服,我这里选的是 PE4 引脚)

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  4、配置SDIO的DMA

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  5、添加文件系统

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  6、配置堆栈大小(稍微调大一点,不然在读写大一点的数据的时候可能会出错)

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  7、生成代码

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  8、生成代码后在 bsp_driver_sd.c这个文件中将这三行代码注释(这是检测SD卡是否接入的引脚 如果不注释在挂载sdnand的时候会提示 not_ready)

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  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));//格式化SDNAND

  HAL_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测试板 插入到读卡器中,读卡器再接到电脑上则就会出现:

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  打开文件则会出现

  SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

  至此大功告成!!!!!

  需要注意的是最新版的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));



主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部