首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使打印文件在STM32F103上工作?

如何使打印文件在STM32F103上工作?
EN

Stack Overflow用户
提问于 2016-09-23 15:08:43
回答 4查看 6.2K关注 0票数 0

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

我试过在谷歌上找到的东西,但到目前为止都没有用。我已经在这个问题上花了三天时间。

任何人都可以给我一个演示代码的printf,哪个工作得好?

我的制作文件的一部分:

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-19 21:52:55

通过包括下列链接器标志:

代码语言:javascript
复制
LDFLAGS   += --specs=rdimon.specs -lc -lrdimon

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

半宿主是一种使运行在ARM目标上的代码能够在运行调试器的主机上通信和使用输入/输出设施的机制。 这些工具的示例包括键盘输入、屏幕输出和磁盘I/O。例如,您可以使用这种机制来启用C库中的函数,例如printf()和scanf(),以使用主机的屏幕和键盘而不是目标系统上的屏幕和键盘。

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

代码语言:javascript
复制
arm semihosting enable

您可以在openOCD脚本的命令处确保终止配置阶段,并使用'init‘命令进入运行阶段。下面是一个openOCD脚本的示例(适用于STM32F103):

代码语言:javascript
复制
 source [find target/stm32f1x.cfg]
 init
 arm semihosting enable

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

票数 2
EN

Stack Overflow用户

发布于 2016-09-26 21:52:02

在我看来,编写自己的printf实现是一个选项,可能也是最推荐的选项。从标准库实现中获得一些灵感,并编写自己的版本,只是为了满足您的需求。通常,您需要做的是,首先重定向一个putc函数,通过您的串行接口发送char。然后使用printf自定义实现重写putc方法。也许,一种非常简单的方法是通过递归调用putc函数以字符串的方式发送字符串。

最后但并非最不重要的是,您可以找到一些轻量级printf实现。这些轻量级实现提供的代码大小和功能集介于自定义编写的printf函数和库存标准printf函数(又称野兽函数)之间。我最近试用了这个微型打印机,并且非常满意它在ARM核上的内存占用和所需执行周期的数量方面的性能。

-PS

复制自我自己的著述

票数 2
EN

Stack Overflow用户

发布于 2016-12-13 08:56:06

链接:如何在STM32F10x上重定向printf()?

尝试像这样劫持_write函数:

代码语言:javascript
复制
#define STDOUT_FILENO   1
#define STDERR_FILENO   2

int _write(int file, char *ptr, int len)
{
    switch (file)
    {
    case STDOUT_FILENO: /*stdout*/
        // Send the string somewhere
        break;
    case STDERR_FILENO: /* stderr */
        // Send the string somewhere
        break;
    default:
        return -1;
    }
    return len;
}

最初的printf将通过这个函数(当然取决于您所使用的库)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39664071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档