如何让printf在STM32F103上工作?

2023-12-03

我是 STM32F103 世界的新手。我有一个STM32F103的演示代码,我正在使用arm-none-eabi来编译它。

我尝试了在谷歌上可以找到的内容,但到目前为止没有任何效果。我已经花了三天时间来解决这个问题。

任何人都可以给我一个运行良好的 printf 演示代码吗?

我的 makefile 的一部分:

CFLAG   = -mcpu=$(CPU) -mthumb -Wall -fdump-rtl-expand -specs=nano.specs --specs=rdimon.specs   -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group
LDFLAG  = -mcpu=$(CPU) -T ./stm32_flash.ld -specs=nano.specs --specs=rdimon.specs   -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group

通过包含以下链接器标志:

LDFLAGS   += --specs=rdimon.specs -lc -lrdimon

看起来你正在尝试使用所谓的半主机。您告诉链接器包含系统调用库。

半主机是一种机制,允许在 ARM 目标上运行的代码进行通信并使用运行调试器的主机上的输入/输出设施。

这些设施的示例包括键盘输入、屏幕输出和磁盘 I/O。例如,您可以使用此机制使 C 库中的函数(例如 printf() 和 scanf())能够使用主机的屏幕和键盘,而不是目标系统上的屏幕和键盘。

由于您正在使用开源工具进行 STM32 开发(Makefile 和 arm-none-eabi),我假设您也在使用openOCD对您的微控制器进行编程。 openOCD 要求您还使用以下命令启用半主机:

arm semihosting enable

您可以在 openOCD 脚本的命令中确保终止配置阶段并使用“init”命令进入运行阶段。以下是 openOCD 脚本的示例(适用于 STM32F103):

 source [find target/stm32f1x.cfg]
 init
 arm semihosting enable

这里提到的其他解决方案可以让您重新定位fputc()UART 接口的功能也将起作用并且可能。半主机将在所有最新的 ARM Cortex-M 上运行,但需要一些编译器和调试器配置(见上文)。重新定位fputc()UART 接口的函数适用于任何编译器,但您必须检查每个板的引脚配置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让printf在STM32F103上工作? 的相关文章

随机推荐