• 资料介绍
  • 在线预览
  • 相关推荐
申请入驻 产业图谱

STM32C0 HAL 库的 SPI 驱动导致的 Hardfault 问题分析

2025/03/04
488
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

STM32C0 HAL 库的 SPI 驱动导致的 Hardfault 问题分析

582.71 KB

1、问题描述

客户在项目开发中使用 STM32C071 作为主控 MCU,驱动代码使用了版本STM32Cube_FW_C0_V1.2.0,应用程序调用 SPI HAL API 与 NFC 模块通信,SPI 工作在Master 模式,调用 HAL_SPI_Transmit 函数发送数据的时候,出现 Hardfault 现象,同时客户反馈同样的应用程序代码在 STM32G0 平台上,没有出现类似的问题,客户不得其解。根据客户反馈的现象,本文分析其原因以及解决方法。

2、问题原因

移植客户调用 SPI HAL 的代码片段到 NUCLEO_C031C6 开发板上,复现了同样的问题,经过单步调试跟踪,跟踪汇编代码,导致 Hardfault 的指令是 LDRH,查看 Cortex-M0+编程手册,明确了目的地址不对齐,会导致 Hardfault 异常,而 LDRH 访问的是 16 位数据,所以其访问的地址必须按照双字节对齐,也就是说 hspi->pTxBuffer 的地址必须是双字节对齐。查看变量值,hspi->pTxBuffer 的地址为 0x2000014B,显然不是一个符合对齐规则的地址。

那么问题来了,同样应用层代码,为何在 STM32G0 平台上没有出现问题,通过比较 SPIHAL 库驱动代码,STM32C0 的驱动对数据类型进行了强制转换,该操作导致了问题。所以,基于 STM32C0 的这部分代码是存在隐患的,如果应用代码传递的数据 buffer 地址不是双字节对齐,就会导致这个问题。

3、解决方案

针对问题原因,这里有两种解决方案。

第一种方案,要求应用程序传递的数据 Buffer 地址按照双字节对齐,这个实现起来很容易,不同的编译器有不同的关键字设置变量地址对齐属性,如 KEIL 可以使用__attribute__((aligned(2))) 关键字即可保证变量地址是双字节对齐的。

第二种方案,微调 SPI HAL 代码,避免地址不对齐因为客户的应用代码有多出调用 SPI HAL 的语句,没法保证每个地方传递的数据 Buffer 地址都是按照双字节对齐的,所以最终采用了第二种方案解决其问题。

在线预览

相关推荐

意法半导体拥有49,000名半导体技术的创造者和创新者,掌握半导体供应链和先进的制造设备。作为一 家半导体垂直整合制造商(IDM),意法半导体与二十多万家客户、成千上万名合作伙伴一起研发产品和 解决方案,共同构建生态系统,帮助他们更好地应对各种挑战和新机遇,满足世界对可持续发展的更高需 求。意法半导体的技术让人们的出行更智能,让电源和能源管理更高效,让云连接的自主化设备应用更广 泛。我们正按计划在所有直接和间接排放(包括范围1和范围2)、产品运输、商务旅行以及员工通勤排 放(重点关注的范围3)方面实现碳中和,并在2027年底前实现100%使用可再生电力的目标。 详情请浏 览意法半导体公司网站:www.st.com.cn