[STM32L4] STM32L412 跑一个简单的示例发生硬件错误

[复制链接]
96|15
WHALEE 发表于 2026-8-7 15:17 | 显示全部楼层 |阅读模式
我在 STM32L412KB Nucleo32 上,用 CubeIDE 搭建了一个 USB‑CDC 项目。
我启用了 USB 外设与中间件,使用 USB‑CDC 的默认配置。
运行该代码后,程序会进入硬件错误处理函数,在调用USB_EnableGlobalInt(hpcd)时触发 INVSTATE 异常,对应位置为stm32l4xx_hal_pcd.c文件第 1014 行的HAL_PCD_Start()函数,地址 0x8000d26。
调用栈后续依次为:0xfffffff9处的信号处理函数、0x0、0xfffffff1 处的信号处理函数,最终跳转到stm32l4xx_it.c第 88 行的HardFault_Handler(),地址 0x800432a。
USB‑CDC 在 STM32F072 和 F103 的项目中可以正常工作。
L4的配置是否有所不同?

茉璃夏 发表于 2026-8-7 15:35 | 显示全部楼层
L4的USB包内存区访问规则和F1不一样,如果描述符或者缓冲区没对齐,就会触发用法错误,你这个问题就类似这样
classroom 发表于 2026-8-7 16:06 | 显示全部楼层
USB_EnableGlobalInt里的INVSTATE异常,十有**是HAL库生成的usbd_conf.c里USB中断优先级没配好,和L4的NVIC冲突了
cr315 发表于 2026-8-7 16:38 | 显示全部楼层
L4的USB时钟必须准准的48MHz,你用MSI或者HSI不配CRS同步,时钟偏一点,初始化就会崩
duo点 发表于 2026-8-7 17:10 | 显示全部楼层
你F072和F103项目里的USB底层驱动文件和L4的寄存器地址不同,特别是PMA大小,直接用会出错
elephant00 发表于 2026-8-7 15:38 | 显示全部楼层
中断向量表里USB相关的中断函数名,L4和F1/F0不一样,CubeMX迁移时很可能没勾上,导致中断服务函数根本没挂载
flycamelaaa 发表于 2026-8-7 17:42 | 显示全部楼层
检查下启动文件里的堆栈配置,HAL库USB初始化会调用malloc,堆太小直接写穿,触发硬件错误
jcky001 发表于 2026-8-7 17:42 | 显示全部楼层
L4的USB外设版本和F1不同,中断触发时序有细微差别,老代码里的状态机处理顺序在这里会踩空
onlycook 发表于 2026-8-7 18:14 | 显示全部楼层
你调用USB_EnableGlobalInt时,对应的USB核心时钟可能还没完全稳定,HAL库没加足等待延时,导致操作无效寄存器
powerantone 发表于 2026-8-7 18:45 | 显示全部楼层
看看是否在中断服务函数里调用了printf或者malloc这类不可重入函数,L4堆管理脆弱,中断里一用就挂
probedog 发表于 2026-8-7 19:46 | 显示全部楼层
硬件上Nucleo板的USB_DP上拉电阻控制脚,L4和F1可能不同,没正确使能内部上拉,主机没检测到设备,初始化直接超时退出
solty 发表于 2026-8-7 20:18 | 显示全部楼层
CubeIDE里如果把优化等级开太高,关键外设寄存器操作可能被编译器优化掉,导致实际执行指令流出错
spicy 发表于 2026-8-7 20:49 | 显示全部楼层
参考的例程如果是在F103上跑的,那边ARM核心支持非对齐访问,L4的M4内核某些配置下不行,地址错一点就进硬错误
stormwind123 发表于 2026-8-7 21:20 | 显示全部楼层
查查HAL_PCD_MspInit里有没有正确使能USB电源和时钟,L4的这个初始化函数和F1不是完全通用的
今天会画卧蚕吗 发表于 2026-8-7 21:52 | 显示全部楼层
先用逻辑分析仪抓一下D+和D-的电平跳变,如果完全没反应,那问题就在MCU没发出枚举信号,多半是时钟或PMA配置卡住了
没有太阳的晴天 发表于 2026-8-7 22:43 | 显示全部楼层
尝试在CubeMX里换个固件包版本,新版本对L4的USB驱动有补丁,可能修正了你遇到的这个中断异常
您需要登录后才可以回帖 登录 | 注册

本版积分规则

206

主题

207

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0