STM32CubeMX之FATFS+SPI驱动W25QXX

本文档详细介绍了如何在STM32CubeMX中配置SPI接口以连接W25Q128闪存芯片,包括SPI的CPOL和CPHA设置,以及CS片选引脚的配置。接着,文章展示了如何编写W25Q128的驱动程序,并将其挂载到FATFS文件系统中,用于实现文件系统的读写操作。此外,还提供了初始化和状态检查的函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


参考资料

  1. SPI通信协议

1 W25Q128简介

W25Q128 总容量为16M字节,并将 16M 字节的容量分为 256 个块(Block),每个块大小为 64K 字节,每个块又分为16 个扇区(Sector),每个扇区 4K 个字节。W25Q128 的最小擦除单位为一个扇区,也就是每次必须擦除 4K 个字节。这样我们需要给 W25Q128 开辟一个至少 4K 的缓存区,这样对 SRAM 要求比较高,要求芯片必须有 4K 以上 SRAM 才能很好的操作。

2 STM32CubeMX配置SPI

根据W25Q128原理图可知,其使用SPI2,片选引脚为CS为PB12。
在这里插入图片描述

2.1 配置SPI

在这里插入图片描述

  1. Baud Rate 可根据实际需求而定;
  2. CPOL = High,CPHA = 2 Edge 和 CPOL = Low,CPHA = 1 Edge ,两种模式都可以

2.2 配置CS片选引脚

因为SPI的NSS Signal Type 选择为 Software,所以需要自行配置CS片选引脚
在这里插入图片描述

3 添加W25Q128驱动

配置W25Q128片选引脚

#define W25QXX_CS_NON    HAL_GPIO_WritePin(W25QXX_CS_GPIO_Port,W25QXX_CS_Pin,GPIO_PIN_SET)
#define W25QXX_CS_OK     HAL_GPIO_WritePin(W25QXX_CS_GPIO_Port,W25QXX_CS_Pin,GPIO_PIN_RESET)

使用STM32CubeMX配置SPI和片选引脚之后,需要自行根据W25Q128手册编写驱动程序,如:

  1. W25QXX_Read
  2. W25QXX_Write

这里省略,可参考正点原子例程

4 将W25Q128挂载到FATFS

4.1 STM32CubeMX配置FATFS

在这里插入图片描述
在这里插入图片描述

4.2 在工程中为FATFS适配W25Q128

4.2.1 DSTATUS USER_initialize ( BYTE pdrv )

DSTATUS USER_initialize (
	BYTE pdrv           /* Physical drive nmuber to identify the drive */
)
{
  /* USER CODE BEGIN INIT */
    Stat = STA_NOINIT;
	  if(W25QXX_Init() == W25Q_OK)
    {
      Stat &= ~STA_NOINIT;
    }
    return Stat;
  /* USER CODE END INIT */
}

4.2.2 DSTATUS USER_status ( BYTE pdrv )

DSTATUS USER_status (
	BYTE pdrv       /* Physical drive number to identify the drive */
)
{
  /* USER CODE BEGIN STATUS */
    Stat = STA_NOINIT;
		if(W25QXX_Get_State() == W25Q_OK)
		{
			Stat &= ~STA_NOINIT;
		}	  
    return Stat;
  /* USER CODE END STATUS */
}

4.2.3 USER_read

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 BEGIN READ */
	  W25QXX_Read((uint8_t*)buff,(uint32_t)sector,(uint16_t)count);
    return RES_OK;
  /* USER CODE END READ */
}

4.2.3 USER_write

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 BEGIN WRITE */
  /* USER CODE HERE */
	  W25QXX_Write((uint8_t*)buff,(uint32_t)sector,(uint16_t)count);
    return RES_OK;
  /* USER CODE END WRITE */
}

5 工程链接

gitee平台: STM32F10xxx Learn

### STM32CubeMXFATFS 文件系统和 FreeRTOS 的集成配置 #### 使用STM32CubeMX初始化项目 STM32CubeMX 是一款用于简化基于STM32微控制器项目的开发环境配置工具[^3]。当启动一个新的STM32工程时,可以通过该图形化界面轻松挑选目标MCU型号并完成初步设置。 对于具体的操作流程,在新项目创建界面上会展示众多可供选择的STM32设备选项;利用左边栏内的分类目录能够快速定位到所需的系列产品线,比如STM32F4家族下的成员——STM32F407VG,并继续推进至下一步骤以设定内部振荡器及时钟分配方案等重要参数[^4]。 ```c // 这里是通过STM32CubeMX生成的基础代码框架的一部分, // 它包含了必要的头文件引入以及全局变量声明。 #include "main.h" #include "stm32f4xx_hal.h" /* USER CODE BEGIN Includes */ extern uint8_t USB_to_SD(uint8_t *data, uint32_t length); /* USER CODE END Includes */ int main(void){ /* 初始化所有外设,Flash接口,GPIOs...*/ HAL_Init(); // 用户自定义部分开始... } ``` #### 添加FATFS支持 为了使应用程序具备读写SD卡的能力,需向STM32CubeMX中加入FatFs组件的支持。这一步通常是在中间件(Middlewares)标签页下找到FatFs库并勾选启用它。之后按照提示调整相应的挂载点路径和其他必要属性即可让系统识别外部存储介质上的数据结构。 一旦完成了上述操作,则可以在程序逻辑里面调用`f_mount()`函数关联卷标与物理驱动器,进而执行诸如打开/关闭文件(`f_open()`, `f_close()`)、读取/写入数据(`f_read()`, `f_write()`)等一系列标准API命令来处理位于SD卡里的资料。 ```c // 下面展示了如何使用FatFs API进行简单的文件I/O操作的例子: FRESULT res; /* FatFs 函数返回的结果 */ FIL fileObject; /* 文件对象句柄 */ UINT bytesWritten; res = f_mount(&fatfs, "", 1); // 尝试安装默认分区 if (res != FR_OK){ // 如果失败则报告错误 Error_Handler(__FILE__, __LINE__); } res = f_open(&fileObject, "test.txt", FA_WRITE | FA_CREATE_ALWAYS); if(res == FR_OK){ const char* textToWrite = "Hello World!"; res = f_write(&fileObject, textToWrite, strlen(textToWrite), &bytesWritten); if(bytesWritten != strlen(textToWrite)){ Error_Handler(__FILE__, __LINE__); } f_close(&fileObject); } else { Error_Handler(__FILE__, __LINE__); } ``` #### 整合FreeRTOS多任务管理功能 为了让系统的各个模块能更高效有序地运行起来,建议采用实时操作系统(Real-Time Operating System),像广泛应用于嵌入式领域的FreeRTOS就是一个不错的选择。借助于STM32CubeMX同样很容易就能把此内核纳入进来:只需前往“Middleware”菜单项处查找RTX或FreeRTOS条目并激活之便大功告成啦! 此时开发者就可以着手编写多个独立的任务单元了,每一个都对应着特定的工作职责。下面给出了一段示范性的源码片段,其中涉及到了两个并发执行的任务——一个是周期性打印消息给串口终端,另一个负责监听按键状态变化事件以便触发某些动作反应。 ```c void StartDefaultTask(void const * argument){ for(;;){ printf("This is the default task.\r\n"); osDelay(5000); // 延迟五秒再重复循环体内容 } } void StartButtonMonitorTask(void const * argument){ GPIO_PinState buttonState; while(1){ buttonState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0); if(buttonState == GPIO_PIN_SET){ // 执行按下后的相应措施... }else{ // 处理释放情况... } osDelay(100); // 设置合理的轮询间隔时间 } } osThreadDef(default_task, StartDefaultTask, osPriorityNormal, 0, configMINIMAL_STACK_SIZE); osThreadDef(button_monitor_task, StartButtonMonitorTask, osPriorityAboveNormal, 0, configMINIMAL_STACK_SIZE); int main(void){ ... osKernelInitialize(); // 启动前准备工作 osThreadCreate(osThread(default_task), NULL); osThreadCreate(osThread(button_monitor_task), NULL); osKernelStart(); // 正式开启调度机制 ... } ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值