地瓜patch 发表于 2025-3-22 16:44

keil 407每次都会跳转到 HardFault_Handler

本帖最后由 地瓜patch 于 2025-3-22 16:47 编辑

keil,407每次运行下面的代码时,都会跳转到 “HardFault_Handler”。还没搞明白。uint8_t buff_cfg =   { 0 };   buff_cfg = 1;   
buff_cfg = 2;   
buff_cfg = 3;   
buff_cfg = 4;   
HAL_SPI_Transmit(&hspi1, &buff_cfg, 2, SPI_TIMEOUT);

公羊子丹 发表于 2025-3-24 08:17

你检查过 hspi1 是否已经正确初始化了吗?如果 hspi1 是空指针,调用 HAL_SPI_Transmit 可能会导致 HardFault。

周半梅 发表于 2025-3-24 08:19

试着在 HAL_SPI_Transmit 之前加一行 if (hspi1.Instance == NULL) while(1); 看看是不是 SPI 没初始化好。

帛灿灿 发表于 2025-3-24 08:20

你的 SPI_TIMEOUT 设的是多少?如果超时参数不对,可能会导致 HAL_SPI_Transmit 内部访问非法地址。

童雨竹 发表于 2025-3-24 08:21

试试换成 HAL_SPI_Transmit(&hspi1, buff_cfg, 2, SPI_TIMEOUT);,看看会不会还是 HardFault,可能是 &buff_cfg 传参有问题。

万图 发表于 2025-3-24 08:22

buff_cfg 是全局变量还是局部变量?如果是局部变量,看看栈有没有溢出,特别是 RTOS 任务里可能栈不够用。

Wordsworth 发表于 2025-3-24 08:23

你有没有开 DMA?如果 HAL_SPI_Transmit 里用到 DMA,而 buff_cfg 不是 __attribute__((aligned(4))),可能会触发 HardFault。

Bblythe 发表于 2025-3-24 08:25

试试看把 buff_cfg 放到 .bss 或 .data 段,比如 static uint8_t buff_cfg = { 0 };,看看问题是否解决。

Pulitzer 发表于 2025-3-24 08:26

进入 HardFault_Handler 时,看看 SCB->HFSR 和 SCB->CFSR 寄存器的值,能判断出具体的错误类型,比如非法访问、总线错误等。

Uriah 发表于 2025-3-24 08:27

HAL_SPI_Transmit 可能会调用 HAL_GetTick(),而如果 SysTick 没有正确初始化,也可能导致 HardFault,试试检查 HAL_Init() 是否正确执行。

Clyde011 发表于 2025-3-24 08:29

你试过用 Disassembly 视图单步调试 HAL_SPI_Transmit 吗?看看在哪一行触发了 HardFault,这样更容易找出具体问题。

laocuo1142 发表于 2025-3-24 15:36

检查栈大小,如果栈空间不足,可能会导致堆栈溢出,进而触发HardFault_Handler。

flycamelaaa 发表于 2025-3-24 15:37

用Keil的调试看看。

powerantone 发表于 2025-3-24 19:00

检查外设配置,特别是时钟配置和中断优先级设置是否有误。

probedog 发表于 2025-3-24 21:00

更新固件库到最新版本!

classroom 发表于 2025-3-24 21:00

可能是硬件连接问题!

stormwind123 发表于 2025-3-24 22:00

中断服务程序是否正确?
页: [1]
查看完整版本: keil 407每次都会跳转到 HardFault_Handler