当前位置:网站首页 > 技术博客 > 正文

STM32开发板



本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外设与 SPI Flash 通信(W25Q64)。

1. 准备工作

Keil MDK和串口助手Serial Port Utility 的安装包都可以在文末关注公众号获取,回复关键字获取相应的安装包:

2.生成MDK工程

打开STM32CubeMX,打开MCU选择器:

搜索并选中芯片:

这里我都使用外部时钟:

小熊派开发板板载ST-Link并且虚拟了一个串口,原理图如下:

这里我将开关拨到模式,使PC的串口与USART1之间连接。

接下来开始配置:

首先查看小熊派开发板上 SPI Flash 的原理图:

其引脚连接情况如下:

接下来配置 QSPI 接口:

STM32L4的最高主频到80M,所以配置PLL,最后使即可:

最后设置生成独立的初始化文件:

点击即可生成MDK-V5工程:

3. 在MDK中编写、编译、下载用户代码

参考:

4. 封装 SPI Flash(W25Q64)的命令和底层函数

MCU 通过向 SPI Flash 发送各种命令 来读写 SPI Flash内部的寄存器,所以这种裸机驱动,首先要先宏定义出需要使用的命令,然后利用 HAL 库提供的库函数,封装出三个底层函数,便于移植

接下来开始编写代码~

5. 编写W25Q64的驱动程序

接下来开始利用上一节封装的宏定义和底层函数,编写W25Q64的驱动程序:

读取 Flash 内部这两个ID有两个作用:

数据手册上给出的操作时序如图:

根据该时序,编写代码如下:

SPI Flash读取数据可以任意地址(地址长度32bit)读任意长度数据(最大 65535 Byte),没有任何限制,数据手册给出的时序如下:

根据该时序图编写代码如下:

上文中提到,SPI Flash的所有操作都是靠发送命令完成的,但是 Flash 接收到命令后,需要一段时间去执行该操作,这段时间内 Flash 处于“忙”状态,MCU 发送的命令无效,不能执行,在 Flash 内部有2-3个状态寄存器,指示出 Flash 当前的状态,有趣的一点是:

当 Flash 内部在执行命令时,不能再执行 MCU 发来的命令,但是 MCU 可以一直读取状态寄存器,这下就很好办了,MCU可以一直读取,然后判断Flash是否忙完

首先读取状态寄存器的代码如下:

然后编写阻塞判断Flash是否忙碌的函数:

Flash 芯片默认禁止写数据,所以在向 Flash 写数据之前,必须发送命令开启写使能,数据手册中给出的时序如下:

编写函数如下:

SPI Flash有个特性:

数据位可以由1变为0,但是不能由0变为1。

所以在向 Flash 写数据之前,必须要先进行擦除操作,并且 Flash 最小只能擦除一个扇区,擦除之后该扇区所有的数据变为 (即全为1),数据手册中给出的时序如下:

根据此时序编写函数如下:

向 Flash 芯片写数据的时候,因为 Flash 内部的构造,可以按页写入:

页写入的时序如图:

编写代码如下:

6. 测试驱动

在 函数中编写代码,测试驱动:

首先定义两个缓存:

然后在 main 函数中编写代码:

测试结果如下:

至此,我们已经学会如何使用硬件QSPI接口读写SPI Flash的数据,下一节将讲述如何使用硬件SDMMC接口读取SD卡数据。

版权声明


相关文章:

  • linux黑客渗透测试揭秘2025-07-05 15:01:03
  • ldap服务器连接失败怎么办2025-07-05 15:01:03
  • c语言中指针函数的用法2025-07-05 15:01:03
  • mac自带词典屏幕取词2025-07-05 15:01:03
  • python3 lxml2025-07-05 15:01:03
  • uint8_t和unsigned char2025-07-05 15:01:03
  • json.stringify字符串2025-07-05 15:01:03
  • 数据库设计规范标准2025-07-05 15:01:03
  • python网络爬虫软件2025-07-05 15:01:03
  • log4j2异步日志配置2025-07-05 15:01:03