你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

经验分享 | STM32C0 HAL 库的 SPI 驱动导致的 Hardfault 问题分析

[复制链接]
STMCU小助手 发布时间:2025-8-26 16:50
1. 问题描述+ D- }- X' [& d& h5 X1 q3 R
客户在项目开发中使用 STM32C071 作为主控 MCU ,驱动代码使用了版本STM32Cube_FW_C0_V1.2.0,应用程序调用 SPI HAL API 与 NFC 模块通信,SPI 工作在 Master 模式,调用 HAL_SPI_Transmit 函数发送数据的时候,出现 Hardfault 现象,同时客户反馈同样的应用程序代码在 STM32G0 平台上,没有出现类似的问题,客户不得其解。根据客户反馈的现象,本文分析其原因以及解决方法。
7 E9 K5 Z: e2 a( Z8 e: u! ~
5 h' i6 ?6 o+ C3 e5 u

4 y' B& }- }3 W$ @' x# ?0 a* |2. 问题原因. L+ c6 E; D3 d! E, y
移植客户调用 SPI HAL 的代码片段到 NUCLEO_C031C6 开发板上,复现了同样的问题,经过单步调试跟踪,定位到下面语句导致了 Hardfault,如下图所示。; A: k' o& \9 Y$ O( y, w7 j
8.png
图1. 导致 Hardfault 的语句
2 k  ?1 A) f6 O7 o" |- ^) ?  |

& ^, N& x2 g: v6 Y7 S, V7 t  J6 z跟踪汇编代码,导致 Hardfault 的指令是 LDRH,查看 Cortex-M0+编程手册,明确了目的地址不对齐,会导致 Hardfault 异常,而 LDRH 访问的是 16 位数据,所以其访问的地址必须按照双字节对齐,也就是说 hspi->pTxBuffer 的地址必须是双字节对齐。查看变量值,hspi->pTxBuffer 的地址为 0x2000014B,显然不是一个符合对齐规则的地址。. S& R/ {6 N; d% T& P
9.png
图2. Address alignment

+ C: s* e- |7 m8 `  \; |# ?( F
+ K, l) Z% A/ r/ w
那么问题来了,同样应用层代码,为何在 STM32G0 平台上没有出现问题,通过比较 SPI HAL 库驱动代码,STM32C0 的驱动对数据类型进行了强制转换,该操作导致了问题。* q% D% s9 K5 c4 G/ U0 G: f
10.png
图3. STM32G0 SPI HAL

, o- e) a& X6 d- t- G3 u  O7 W
6 p  s# w0 I: ^) a4 @5 t
+ A/ K$ q. [8 c- k) N

( G' L9 m9 a9 j' Y: i
11.png
图4. STM32C0 SPI HAL

3 a" `$ D. J$ ?' _

- c- l& J) {! y7 {5 p/ |所以,基于 STM32C0 的这部分代码是存在隐患的,如果应用代码传递的数据 buffer 地址不是双字节对齐,就会导致这个问题。
9 B- \# J# N  [$ [9 T3 b5 _
5 \" H( |, Q" ?7 \6 u6 e3. 解决方案8 q* ^# c" J6 p# i: R6 R+ y
针对问题原因,这里有两种解决方案。
6 b# ]8 t$ \( w4 f" ^2 U" l0 u9 B7 d& P8 P
9 B/ ?* Q8 k+ ~% D
第一种方案,要求应用程序传递的数据 Buffer 地址按照双字节对齐,这个实现起来很容易,不同的编译器有不同的关键字设置变量地址对齐属性,如 KEIL 可以使用__attribute__((aligned(2))) 关键字即可保证变量地址是双字节对齐的。8 [1 a9 |; N6 b% p3 v/ F- l" x

2 ]/ v2 R) w/ R
1 v) |, U0 p# u/ s; @
第二种方案,微调 SPI HAL 代码,避免地址不对齐,参考代码如下。* M; a% [0 @7 c
12.png
图5. 地址对齐

8 f% W: Q' v. Y
) @& h+ r+ C9 O  e; v. U
因为客户的应用代码有多出调用 SPI HAL 的语句,没法保证每个地方传递的数据 Buffer 地址都是按照双字节对齐的,所以最终采用了第二种方案解决其问题。
. f. J: O6 B+ U" S1 C' ?' {# v8 X+ o  |! p$ w% T, s" M
6 j8 p- x: H7 C' ^7 n
4. 注意事项
  q0 h% i8 z, f* o3 M0 x/ u3 aSTM32C0 SPI HAL 代码的隐患导致了该问题,在使用 SPI HAL 的过程中需要注意。
: a( k* R6 G% c( Y————————————————' C" }/ k% ]2 W) M2 J
\3 D/ I$ {0 k1 c7 h) x! E3 v  t

* }. N! Q0 s  S/ {; I
收藏 评论0 发布时间:2025-8-26 16:50

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版