我正在将代码从STM32L0传输到STM32L4。项目在L0上运行良好,但在L4上使用其中一个函数时。。。在我打开调试会话之后,处理器会立即进入硬故障(我甚至不必启动程序,它会立即启动并进入硬故障)。
奇怪的事情:
导致问题的函数实际上是__STATIC_INLINE void LL_SPI_Enable(SPI_TypeDef *SPIx)fromstm32l4xx_ll_spi.hex: SET_BIT(SPIx->CR1, SPI_CR1_SPE)中的宏。
当我注释掉包含函数的那一行时,不会创建使用.s的LL_SPI_Enable()文件。当函数存在时,它从使用函数的.s文件创建.c文件。
函数存在于许多其他地方,很好。一个文件中只有一个函数(定义为static inlineLL_SPI_Enable())会导致这种奇怪的行为。还有其他函数使用相同的__attribute__((__always_inline__))执行相同的操作(打开SPI),这些都不是问题。似乎只有一个函数不能使用LL_SPI_Enable()
禁用SPI的功能不会导致任何问题。
程序甚至连第一行代码都没有命中,它会立即出现严重错误。
我认为散点文件是个问题,所以我使用了CPU的默认配置,结果是一样的。我也尝试了不同的优化级别,也没有改变。编译器或链接器没有任何错误。
有人有这样的东西吗?

最佳答案

里面没有什么“奇怪”的。
如果您立即着陆(即在调用主函数之前),通常有三个可能的问题:
链接器文件不适用于您的micro
启动文件不适用于您的micro
错误的寄存器地址(使用了错误的头文件)
在keil中,请参阅外设->核心外设->故障报告。
你将在那里看到寄存器和发生高频的地方的地址和其他信息(取决于实际的高频源)
进一步阅读:www.keil.com/appnotes/files/apnt209.pdf

关于c - 当函数/宏之一在代码中时,Keil创建“故障”十六进制文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53798578/

10-10 14:07
查看更多