news 2026/9/2 12:03:58

STM32 使用HAL库SPI读写FLASH(W25Q128JV)数据 QA

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32 使用HAL库SPI读写FLASH(W25Q128JV)数据 QA

句柄结构体:
包含硬件关联型的结构体和纯软件型的结构体;


为什么HAL库会有嵌套结构体去初始化串口,而标准库不用?
HAL 库通过句柄结构体嵌套初始化子结构体的方式初始化串口,核心是基于 “外设抽象化、配置与状态统一管理” 的设计理念:句柄作为串口的一站式管理载体,嵌套的 Init 子结构体缓存波特率等静态配置参数,句柄直接成员缓存发送状态等动态运行状态,既实现配置与状态分层管理,也避免重复解析寄存器,降低硬件操作成本;

而标准库以 “寄存器级薄封装” 为核心,追求轻量高效与硬件直连,无需嵌套结构体:初始化时仅将扁平化配置结构体作为一次性传参工具,直接写入寄存器后即丢弃,不缓存任何配置或状态,后续获取配置 / 状态需开发者直接读取并解析寄存器,全程以寄存器为唯一数据源;

锁定与未锁定操作:
对于stm32的外设,存在一些外设具有操作流程长,存在多任务/中断并发访问的可能,所有在使用改外设时需要在软件的规则层面对该外设进行解锁和锁定操作避免出现多任务并发冲突,锁定与解锁是句柄结构体中的纯软件型结构体;

C语言中宏定义拼接符的使用:
宏定义里的行拼接符 \(反斜杠)核心作用是将多行代码 “拼接” 成一行,让编译器把分散的多行文本视为一个完整的宏定义 —— 这是解决宏定义“跨多行书写” 的唯一合法方式,\必须作为该行的最后一个字符才能起到拼接的作用,有空格等不可见字符就会导致编译器报错,可以在NotePad中打开文件并显示所有字符来产看是否有不可见字符;

_weak定义:
为用户重写预留 “覆盖位”。
弱符号的特性是:如果用户在自己的代码中定义了同名的非弱函数(去掉__weak 重写 HAL_SPI_MspInit),链接器会优先使用用户的函数覆盖库的弱函数;

SPI的数据寄存器:
SPI_DR的32位寄存器仅低16位可用,且这16位是 “软件访问收发缓冲区的窗口”,而非 “收/发缓冲区各占 16 位”,真正的收发缓冲区是另外两个独立的16位硬件缓存,SPI_DR只是统一的读写入口;
SPI_SR状态寄存器描述的是正真的缓存区的状态,而不是DR寄存器的状态;

SPI读写FLASH数据时遇到的问题:
1.
flash在收到扇区擦除命令和擦除地址后,会擦除该地址算在扇区的内容,无论该地址是起始地址或中间地址;
2.
由于受到FLASH的硬件条件约束,在写数据的时候必须封装一个页写入函数,不能直接将MCU缓冲区的数据写入FLASH;
而读数据不受约束所以可以直接读取数据保存在MCU缓冲区;
3.
SPI接收数据:
由于SPI是全双工,主机必须要发送一个数据从机才能返回一个数据,而在SPI读FLASH的环境中,需要主机发送一个无效数据来触发从FLASH返回数据,一般为Dummy_Byte=0xFF;
在使用库函数中的数据发送函数只管发送而不管接收,接收函数只负责接收而不管发送,两个库函数都属于单纯发送和接收一个字节的底层操作。若要适配SPI全双工的通信方式就要利用这两函数写一个上层封装函数;
4.
在写入时有页写入命令、写使能命令;注意IO口的配置;

5.
注意硬件连接,选择正确的外设;

Degug:
需要运行完前面的代码,给局部变量分配空间后,才能设置条件断点;


数据类型后缀:
后缀 类型 适用场景
U 无符号整型(unsigned int) 非负的 16/32 位小数值
L 有符号长整型(long) 有正负的 32 位数值
UL 无符号长整型(unsigned long) 非负的 32 位数值(如地址)
LL 有符号长 long(long long) 64 位有符号数值
ULL 无符号长 long(unsigned long long) 64 位无符号数值

UL就是告诉编译器:把 0x3800UL 当作无符号的 32 位长整型数值来处理,专门适配 STM32 等32位 MCU 的地址定义场景,避免地址计算溢出、类型不匹配等问题,是嵌入式开发中定义外设基地址的标准操作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 2:46:49

电商数据分析的未来技术展望与趋势

电商数据分析的未来技术展望与趋势 关键词:电商数据分析、未来技术、趋势、人工智能、大数据 摘要:本文聚焦于电商数据分析的未来技术展望与趋势。首先介绍了电商数据分析的背景,包括目的、预期读者等。接着阐述了核心概念及联系,详细讲解了核心算法原理与操作步骤,并给出…

作者头像 李华
网站建设 2026/9/2 9:36:23

FT232驱动在工业自动化中的5个典型应用案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 设计一个工业自动化监控系统,使用FT232芯片作为通信接口。系统需要实现:1) 通过USB连接PLC设备 2) 实时采集传感器数据 3) 数据可视化显示 4) 异常报警功能。…

作者头像 李华
网站建设 2026/9/2 15:11:54

RPA 如何准确识别和选择目标企业微信外部群聊

一、 引言(Introduction) 业务挑战: 企业微信中群聊名称重复率高(如多个“VIP客户群”)、搜索结果干扰多、群名动态修改等因素,极易导致 RPA 误发信息。 核心目标: 在成千上万个聊天项中&#…

作者头像 李华
网站建设 2026/9/3 1:03:49

Linux新手必看:轻松理解并解决sunloginclient依赖错误

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个交互式学习应用,通过sunloginclient案例教授Linux依赖管理基础知识。功能包括:1) 动画演示依赖关系 2) 模拟终端环境供练习 3) 渐进式错误解决指导 …

作者头像 李华
网站建设 2026/9/2 23:59:45

智能图层命名革命:重塑设计文件管理新范式

智能图层命名革命:重塑设计文件管理新范式 【免费下载链接】RenameIt Keep your Sketch files organized, batch rename layers and artboards. 项目地址: https://gitcode.com/gh_mirrors/re/RenameIt 设计协作中的命名困境 在现代设计工作流程中&#xff…

作者头像 李华
网站建设 2026/9/2 3:36:18

零基础入门:30分钟用快马开发你的第一个Agent

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 为初学者设计一个简单的任务提醒Agent。功能要求:1. 添加提醒事项 2. 设置提醒时间 3. 到期通知。使用最简Python实现,包含清晰的代码注释和分步实现指南。要…

作者头像 李华