You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F303K8初始化CAN外设时OpenOCD烧录失败(0x08000000)

ST Nucleo F303K8 含CAN初始化代码时OpenOCD烧录失败问题

只要代码中包含CAN外设初始化逻辑,OpenOCD烧录闪存时就会崩溃;注释CAN初始化代码后,烧录成功且代码运行正常,该问题可稳定复现。

环境

  • 硬件:ST Nucleo F303K8(已在两块不同板卡上复现)
  • 开发框架:PlatformIO + Arduino(STM32duino)
  • 依赖库:STM32_CAN(使用纯STM32 HAL裸机代码也会复现)
  • 调试/烧录工具:ST-LINK + OpenOCD

最小复现代码(main.cpp)

#include <Arduino.h>
#include "STM32_CAN.h"

// 实例化此对象会触发烧录失败
STM32_CAN Can1(PA11, PA12); 

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println("Hello, World");
}

PlatformIO配置文件(platformio.ini)

[env:nucleo_f303k8]
platform = ststm32
board = nucleo_f303k8
framework = arduino
upload_protocol = stlink
build_flags = 
    -DHAL_CAN_MODULE_ENABLED
lib_deps =
    https://github.com/pazi88/STM32_CAN

错误信息

OpenOCD停止响应,无法写入闪存地址0x08000000:

[stm32f3x.cpu] halted due to breakpoint, current mode: Thread 
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
[stm32f3x.cpu] halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
** Programming Started **
Warn : Adding extra erase range, 0x080041c4 .. 0x080047ff
Error: error writing to flash at address 0x08000000 at offset 0x00000000
embedded:startup.tcl:1516: Error: ** Programming Failed **

已完成的排查步骤

  • 延迟实例化:将全局CAN对象改为指针,在setup()内通过new实例化,烧录仍失败
  • 纯HAL裸机测试:绕过Arduino框架,用纯STM32 HAL编写CAN初始化代码,出现完全相同的烧录错误
  • 重置配置调整:添加upload_flags = -c reset_config none让ST-LINK处理软件重置,无效果
  • 硬件重置时序尝试:手动按住板卡RESET按钮,在OpenOCD连接瞬间释放,问题依旧
  • 硬件更换验证:在全新F303K8板卡测试,排除芯片损坏可能,结果一致

问题

OpenOCD、ST-LINK与F303K8在启用CAN外设时是否存在已知冲突?具体来说,PA11/PA12引脚的CAN硬件初始化是否会干扰SWD调试接口,或是占用了MCU上USB/CAN共享的包SRAM导致烧录异常?


内容的提问来源于stack exchange,提问作者david b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 12:43:12