这个是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域时钟变量

⚠️重点:这里不全是函数!D1CorePrescTableSystemCoreClockSystemD2Clock全局变量/数组,不是函数。链接器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结果:正确解决在这里插入图片描述

面试要点

  1. H7的system_stm32h7xx.c不光提供SystemInit()函数,还定义系统时钟相关全局变量、查表数组;F1/F4也是同一份模板文件模式。
  2. L6218E:Undefined symbol,symbol可以是函数、全局变量、数组,不单单只是函数。

汇总你H7基础工程必须添加的基础文件清单

  1. system_stm32h7xx.c  → SystemInit、SystemCoreClock、D1CorePrescTable、SystemD2Clock
  2. stm32h7xx_hal.c   → HAL_IncTick、HAL_Init等
  3. stm32h7xx_hal_cortex.c → HAL_NVIC_SetPriority、HAL_SYSTICK_Config

如果你不加入这几个,就会连续爆出一堆L6218未定义符号。

补充:头文件system_stm32h7xx.h只有声明,没有实现,实现全部在.c文件。只包含头文件不加入c文件编译,照样报未定义。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐