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

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

[复制链接]
STMCU小助手 发布时间:2025-8-26 16:50
1. 问题描述
! |$ ?3 l- Z  R3 s客户在项目开发中使用 STM32C071 作为主控 MCU ,驱动代码使用了版本STM32Cube_FW_C0_V1.2.0,应用程序调用 SPI HAL API 与 NFC 模块通信,SPI 工作在 Master 模式,调用 HAL_SPI_Transmit 函数发送数据的时候,出现 Hardfault 现象,同时客户反馈同样的应用程序代码在 STM32G0 平台上,没有出现类似的问题,客户不得其解。根据客户反馈的现象,本文分析其原因以及解决方法。" k' \( B' X% b0 V

: L& ~8 \: j5 C" G; g  q* e0 q
  U: q6 h: S8 @3 G6 S: }9 t
2. 问题原因7 O# h. a( O7 B' W
移植客户调用 SPI HAL 的代码片段到 NUCLEO_C031C6 开发板上,复现了同样的问题,经过单步调试跟踪,定位到下面语句导致了 Hardfault,如下图所示。
$ s% v) ~9 }: @6 z+ W
8.png
图1. 导致 Hardfault 的语句

+ L4 b: b* y- {# v
/ Z) m4 ^! k+ k& o6 @. N
跟踪汇编代码,导致 Hardfault 的指令是 LDRH,查看 Cortex-M0+编程手册,明确了目的地址不对齐,会导致 Hardfault 异常,而 LDRH 访问的是 16 位数据,所以其访问的地址必须按照双字节对齐,也就是说 hspi->pTxBuffer 的地址必须是双字节对齐。查看变量值,hspi->pTxBuffer 的地址为 0x2000014B,显然不是一个符合对齐规则的地址。0 j" B1 B) E; R& K9 [% r
9.png
图2. Address alignment
* d8 b' w, d8 h+ m
3 Q$ B( d/ `5 E, t' D4 S' Q
那么问题来了,同样应用层代码,为何在 STM32G0 平台上没有出现问题,通过比较 SPI HAL 库驱动代码,STM32C0 的驱动对数据类型进行了强制转换,该操作导致了问题。
. v( I9 b* L6 {- y# G
10.png
图3. STM32G0 SPI HAL
* U- ]- L+ h! \- {
* C( J7 O" a  I6 S0 F# F
  T2 m4 _5 S" m! _' o3 g: F3 K% C. P
4 B. d$ y, t2 Z; s( [$ X" g
11.png
图4. STM32C0 SPI HAL

$ N( Z6 A* z3 n2 h" b

. Q, Q3 n* S" x( h0 B- X所以,基于 STM32C0 的这部分代码是存在隐患的,如果应用代码传递的数据 buffer 地址不是双字节对齐,就会导致这个问题。" I+ d# {8 c( S4 T

" H7 g6 B: C+ p5 Z( z( A% c3. 解决方案
6 p& f8 t9 x& O; q' t. W9 ^& A& w& m针对问题原因,这里有两种解决方案。( V  \. g; E4 A( d9 o! E
9 K6 W- v. Z3 h. u  B1 O2 b" `

% C- F# J8 @, v7 b6 q, H第一种方案,要求应用程序传递的数据 Buffer 地址按照双字节对齐,这个实现起来很容易,不同的编译器有不同的关键字设置变量地址对齐属性,如 KEIL 可以使用__attribute__((aligned(2))) 关键字即可保证变量地址是双字节对齐的。
; N' ?" f2 D4 x# S, S* ~- Z7 w8 H* L: J
! `( k! ?* K  R6 @1 M
第二种方案,微调 SPI HAL 代码,避免地址不对齐,参考代码如下。5 h" V! ~/ Y* j- z& X
12.png
图5. 地址对齐

& c  U$ B% K3 g6 [( q

. Z; L' ^& }) f  N8 H因为客户的应用代码有多出调用 SPI HAL 的语句,没法保证每个地方传递的数据 Buffer 地址都是按照双字节对齐的,所以最终采用了第二种方案解决其问题。
( }* H; N& b* B7 g. X. J& H4 q1 P$ ^+ M0 e+ x0 j" _
+ {  l7 @3 K. x0 x. s4 }5 Z
4. 注意事项
- I) N9 k- s. s& m. ?5 b# Q6 b: oSTM32C0 SPI HAL 代码的隐患导致了该问题,在使用 SPI HAL 的过程中需要注意。% t, I# I" X8 x
————————————————- B( Y3 K! Q" U* ~* Z- A
\
; O- ]% b, S* A7 E4 N
4 b$ D! R& x! x. q/ L
赞 收藏 评论0 发布时间:2025-8-26 16:50

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版