..\..\Output\atk_h743.axf: Error: L6218E: Undefined symbol SystemInit 解决
这个是keil5软件版本
做从头到尾自己做USART1串口通信实验:
遇到问题:
..\..\Output\atk_h743.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32h743xx.o).
..\..\Output\atk_h743.axf: Error: L6218E: Undefined symbol D1CorePrescTable (referred from stm32h7xx_hal.o).
..\..\Output\atk_h743.axf: Error: L6218E: Undefined symbol SystemCoreClock (referred from stm32h7xx_hal.o).
..\..\Output\atk_h743.axf: Error: L6218E: Undefined symbol SystemD2Clock (referred from stm32h7xx_hal.o).在这里插入图片描述](https://i-blog.csdnimg.cn/direct/11ef56e01eff4a6bb1632533026b9bb8.png)
解决:查询Google网页,发现没有正确提供解决办法,都是写一个空函数SystemInit() ; 这不合理。
增加解决办法:
各个符号对应的源文件
全部来自:
system_stm32h7xx.c
路径:Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates/system_stm32h7xx.c
| 未定义符号 | 类型 | 说明 |
|---|---|---|
SystemInit |
函数 | 复位后启动汇编startup_stm32h743xx.s调用 |
D1CorePrescTable |
全局数组(不是函数) | H7时钟预分频查表数组 |
SystemCoreClock |
全局变量 | CPU内核HCLK时钟变量 |
SystemD2Clock |
全局变量 | D2域时钟变量 |
⚠️重点:这里不全是函数!
D1CorePrescTable、SystemCoreClock、SystemD2Clock是全局变量/数组,不是函数。链接器L6218E对“找不到函数、找不到全局变量”报同一个错误号。
报错根因
Keil工程没有把 system_stm32h7xx.c 添加进编译组参与编译。
启动文件startup_stm32h743xx.s以及HAL库stm32h7xx_hal.o都依赖这个文件提供的函数+全局变量,全部缺失。
✅解决:把 system_stm32h7xx.c 添加到Keil工程,重新编译链接。

所以需要在【Drivers\CMSIS\】中找到这个文件的绝对地址位置,比如:
E:\BaiduNetdiskDownload\【正点原子】阿波罗V2 STM32H743开发板\4,程序源码\2,标准例程-HAL库版本\实验4 串口通信实验_my\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\
build output结果:正确解决
面试要点
- H7的
system_stm32h7xx.c不光提供SystemInit()函数,还定义系统时钟相关全局变量、查表数组;F1/F4也是同一份模板文件模式。 - L6218E:
Undefined symbol,symbol可以是函数、全局变量、数组,不单单只是函数。
汇总你H7基础工程必须添加的基础文件清单
system_stm32h7xx.c→ SystemInit、SystemCoreClock、D1CorePrescTable、SystemD2Clockstm32h7xx_hal.c→ HAL_IncTick、HAL_Init等stm32h7xx_hal_cortex.c→ HAL_NVIC_SetPriority、HAL_SYSTICK_Config
如果你不加入这几个,就会连续爆出一堆L6218未定义符号。
补充:头文件system_stm32h7xx.h只有声明,没有实现,实现全部在.c文件。只包含头文件不加入c文件编译,照样报未定义。
更多推荐


所有评论(0)